]> granicus.if.org Git - strace/blob - tests/print_quoted_string.c
tests: fix abbreviated octal escape check in print_quoted_memory
[strace] / tests / print_quoted_string.c
1 #include "tests.h"
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 /*
8  * Based on string_quote() from util.c.
9  * Assumes instr is NUL-terminated.
10  */
11
12 void
13 print_quoted_string(const char *instr)
14 {
15         print_quoted_memory(instr, strlen(instr));
16 }
17
18 void
19 print_quoted_cstring(const char *instr, const size_t size)
20 {
21         const size_t len = strnlen(instr, size);
22         if (len < size) {
23                 print_quoted_memory(instr, len);
24         } else {
25                 print_quoted_memory(instr, size - 1);
26                 printf("...");
27         }
28 }
29
30 void
31 print_quoted_memory(const void *const instr, const size_t len)
32 {
33         const unsigned char *str = (const unsigned char *) instr;
34         size_t i;
35
36         putchar('"');
37         for (i = 0; i < len; ++i) {
38                 const int c = str[i];
39                 switch (c) {
40                         case '\"':
41                                 printf("\\\"");
42                                 break;
43                         case '\\':
44                                 printf("\\\\");
45                                 break;
46                         case '\f':
47                                 printf("\\f");
48                                 break;
49                         case '\n':
50                                 printf("\\n");
51                                 break;
52                         case '\r':
53                                 printf("\\r");
54                                 break;
55                         case '\t':
56                                 printf("\\t");
57                                 break;
58                         case '\v':
59                                 printf("\\v");
60                                 break;
61                         default:
62                                 if (c >= ' ' && c <= 0x7e)
63                                         putchar(c);
64                                 else {
65                                         putchar('\\');
66
67                                         char c1 = '0' + (c & 0x7);
68                                         char c2 = '0' + ((c >> 3) & 0x7);
69                                         char c3 = '0' + (c >> 6);
70
71                                         if (i < (len - 1) &&
72                                             str[i + 1] >= '0' &&
73                                             str[i + 1] <= '9') {
74                                                 /* Print \octal */
75                                                 putchar(c3);
76                                                 putchar(c2);
77                                         } else {
78                                                 /* Print \[[o]o]o */
79                                                 if (c3 != '0')
80                                                         putchar(c3);
81                                                 if (c3 != '0' || c2 != '0')
82                                                         putchar(c2);
83                                         }
84                                         putchar(c1);
85                                 }
86                                 break;
87                 }
88         }
89
90         putchar('"');
91 }
92
93 void
94 print_quoted_hex(const void *const instr, const size_t len)
95 {
96         const unsigned char *str = instr;
97         size_t i;
98
99         printf("\"");
100         for (i = 0; i < len; i++)
101                 printf("\\x%02x", str[i]);
102         printf("\"");
103 }