]> granicus.if.org Git - strace/blob - tests/print_quoted_string.c
tests: extend TEST_NETLINK_OBJECT macro
[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_memory(const void *const instr, const size_t len)
20 {
21         const unsigned char *str = (const unsigned char *) instr;
22         size_t i;
23
24         putchar('"');
25         for (i = 0; i < len; ++i) {
26                 const int c = str[i];
27                 switch (c) {
28                         case '\"':
29                                 printf("\\\"");
30                                 break;
31                         case '\\':
32                                 printf("\\\\");
33                                 break;
34                         case '\f':
35                                 printf("\\f");
36                                 break;
37                         case '\n':
38                                 printf("\\n");
39                                 break;
40                         case '\r':
41                                 printf("\\r");
42                                 break;
43                         case '\t':
44                                 printf("\\t");
45                                 break;
46                         case '\v':
47                                 printf("\\v");
48                                 break;
49                         default:
50                                 if (c >= ' ' && c <= 0x7e)
51                                         putchar(c);
52                                 else {
53                                         putchar('\\');
54
55                                         char c1 = '0' + (c & 0x7);
56                                         char c2 = '0' + ((c >> 3) & 0x7);
57                                         char c3 = '0' + (c >> 6);
58
59                                         if (*str >= '0' && *str <= '9') {
60                                                 /* Print \octal */
61                                                 putchar(c3);
62                                                 putchar(c2);
63                                         } else {
64                                                 /* Print \[[o]o]o */
65                                                 if (c3 != '0')
66                                                         putchar(c3);
67                                                 if (c3 != '0' || c2 != '0')
68                                                         putchar(c2);
69                                         }
70                                         putchar(c1);
71                                 }
72                                 break;
73                 }
74         }
75
76         putchar('"');
77 }
78
79 void
80 print_quoted_hex(const void *const instr, const size_t len)
81 {
82         const unsigned char *str = instr;
83         size_t i;
84
85         printf("\"");
86         for (i = 0; i < len; i++)
87                 printf("\\x%02x", str[i]);
88         printf("\"");
89 }