1*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
2*cf84ac9aSAndroid Build Coastguard Worker
3*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
4*cf84ac9aSAndroid Build Coastguard Worker #include <stdlib.h>
5*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
6*cf84ac9aSAndroid Build Coastguard Worker
7*cf84ac9aSAndroid Build Coastguard Worker /*
8*cf84ac9aSAndroid Build Coastguard Worker * Based on string_quote() from util.c.
9*cf84ac9aSAndroid Build Coastguard Worker * Assumes instr is NUL-terminated.
10*cf84ac9aSAndroid Build Coastguard Worker */
11*cf84ac9aSAndroid Build Coastguard Worker
12*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_string_ex(const char * instr,bool quote,const char * escape_chars)13*cf84ac9aSAndroid Build Coastguard Worker print_quoted_string_ex(const char *instr, bool quote, const char *escape_chars)
14*cf84ac9aSAndroid Build Coastguard Worker {
15*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory_ex(instr, strlen(instr), quote, escape_chars);
16*cf84ac9aSAndroid Build Coastguard Worker }
17*cf84ac9aSAndroid Build Coastguard Worker
18*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_string(const char * instr)19*cf84ac9aSAndroid Build Coastguard Worker print_quoted_string(const char *instr)
20*cf84ac9aSAndroid Build Coastguard Worker {
21*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(instr, strlen(instr));
22*cf84ac9aSAndroid Build Coastguard Worker }
23*cf84ac9aSAndroid Build Coastguard Worker
24*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_cstring(const char * instr,const size_t size)25*cf84ac9aSAndroid Build Coastguard Worker print_quoted_cstring(const char *instr, const size_t size)
26*cf84ac9aSAndroid Build Coastguard Worker {
27*cf84ac9aSAndroid Build Coastguard Worker const size_t len = strnlen(instr, size);
28*cf84ac9aSAndroid Build Coastguard Worker if (len < size) {
29*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(instr, len);
30*cf84ac9aSAndroid Build Coastguard Worker } else {
31*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(instr, size - 1);
32*cf84ac9aSAndroid Build Coastguard Worker printf("...");
33*cf84ac9aSAndroid Build Coastguard Worker }
34*cf84ac9aSAndroid Build Coastguard Worker }
35*cf84ac9aSAndroid Build Coastguard Worker
36*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_stringn(const char * instr,const size_t size)37*cf84ac9aSAndroid Build Coastguard Worker print_quoted_stringn(const char *instr, const size_t size)
38*cf84ac9aSAndroid Build Coastguard Worker {
39*cf84ac9aSAndroid Build Coastguard Worker const size_t len = strnlen(instr, size);
40*cf84ac9aSAndroid Build Coastguard Worker if (len < size) {
41*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(instr, len);
42*cf84ac9aSAndroid Build Coastguard Worker } else {
43*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(instr, size);
44*cf84ac9aSAndroid Build Coastguard Worker printf("...");
45*cf84ac9aSAndroid Build Coastguard Worker }
46*cf84ac9aSAndroid Build Coastguard Worker }
47*cf84ac9aSAndroid Build Coastguard Worker
48*cf84ac9aSAndroid Build Coastguard Worker static void
print_octal(unsigned char c,char next)49*cf84ac9aSAndroid Build Coastguard Worker print_octal(unsigned char c, char next)
50*cf84ac9aSAndroid Build Coastguard Worker {
51*cf84ac9aSAndroid Build Coastguard Worker putchar('\\');
52*cf84ac9aSAndroid Build Coastguard Worker
53*cf84ac9aSAndroid Build Coastguard Worker char c1 = '0' + (c & 0x7);
54*cf84ac9aSAndroid Build Coastguard Worker char c2 = '0' + ((c >> 3) & 0x7);
55*cf84ac9aSAndroid Build Coastguard Worker char c3 = '0' + (c >> 6);
56*cf84ac9aSAndroid Build Coastguard Worker
57*cf84ac9aSAndroid Build Coastguard Worker if (next >= '0' && next <= '7') {
58*cf84ac9aSAndroid Build Coastguard Worker /* Print \octal */
59*cf84ac9aSAndroid Build Coastguard Worker putchar(c3);
60*cf84ac9aSAndroid Build Coastguard Worker putchar(c2);
61*cf84ac9aSAndroid Build Coastguard Worker } else {
62*cf84ac9aSAndroid Build Coastguard Worker /* Print \[[o]o]o */
63*cf84ac9aSAndroid Build Coastguard Worker if (c3 != '0')
64*cf84ac9aSAndroid Build Coastguard Worker putchar(c3);
65*cf84ac9aSAndroid Build Coastguard Worker if (c3 != '0' || c2 != '0')
66*cf84ac9aSAndroid Build Coastguard Worker putchar(c2);
67*cf84ac9aSAndroid Build Coastguard Worker }
68*cf84ac9aSAndroid Build Coastguard Worker putchar(c1);
69*cf84ac9aSAndroid Build Coastguard Worker }
70*cf84ac9aSAndroid Build Coastguard Worker
71*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_memory_ex(const void * const instr,const size_t len,bool quote,const char * escape_chars)72*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory_ex(const void *const instr, const size_t len,
73*cf84ac9aSAndroid Build Coastguard Worker bool quote, const char *escape_chars)
74*cf84ac9aSAndroid Build Coastguard Worker {
75*cf84ac9aSAndroid Build Coastguard Worker const unsigned char *str = (const unsigned char *) instr;
76*cf84ac9aSAndroid Build Coastguard Worker size_t i;
77*cf84ac9aSAndroid Build Coastguard Worker
78*cf84ac9aSAndroid Build Coastguard Worker if (quote)
79*cf84ac9aSAndroid Build Coastguard Worker putchar('"');
80*cf84ac9aSAndroid Build Coastguard Worker
81*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < len; ++i) {
82*cf84ac9aSAndroid Build Coastguard Worker const int c = str[i];
83*cf84ac9aSAndroid Build Coastguard Worker switch (c) {
84*cf84ac9aSAndroid Build Coastguard Worker case '\"':
85*cf84ac9aSAndroid Build Coastguard Worker printf("\\\"");
86*cf84ac9aSAndroid Build Coastguard Worker break;
87*cf84ac9aSAndroid Build Coastguard Worker case '\\':
88*cf84ac9aSAndroid Build Coastguard Worker printf("\\\\");
89*cf84ac9aSAndroid Build Coastguard Worker break;
90*cf84ac9aSAndroid Build Coastguard Worker case '\f':
91*cf84ac9aSAndroid Build Coastguard Worker printf("\\f");
92*cf84ac9aSAndroid Build Coastguard Worker break;
93*cf84ac9aSAndroid Build Coastguard Worker case '\n':
94*cf84ac9aSAndroid Build Coastguard Worker printf("\\n");
95*cf84ac9aSAndroid Build Coastguard Worker break;
96*cf84ac9aSAndroid Build Coastguard Worker case '\r':
97*cf84ac9aSAndroid Build Coastguard Worker printf("\\r");
98*cf84ac9aSAndroid Build Coastguard Worker break;
99*cf84ac9aSAndroid Build Coastguard Worker case '\t':
100*cf84ac9aSAndroid Build Coastguard Worker printf("\\t");
101*cf84ac9aSAndroid Build Coastguard Worker break;
102*cf84ac9aSAndroid Build Coastguard Worker case '\v':
103*cf84ac9aSAndroid Build Coastguard Worker printf("\\v");
104*cf84ac9aSAndroid Build Coastguard Worker break;
105*cf84ac9aSAndroid Build Coastguard Worker default:
106*cf84ac9aSAndroid Build Coastguard Worker if (c >= ' ' && c <= 0x7e &&
107*cf84ac9aSAndroid Build Coastguard Worker !(escape_chars && strchr(escape_chars, c))) {
108*cf84ac9aSAndroid Build Coastguard Worker putchar(c);
109*cf84ac9aSAndroid Build Coastguard Worker } else {
110*cf84ac9aSAndroid Build Coastguard Worker print_octal(c,
111*cf84ac9aSAndroid Build Coastguard Worker i < (len - 1) ? str[i + 1] : 0);
112*cf84ac9aSAndroid Build Coastguard Worker }
113*cf84ac9aSAndroid Build Coastguard Worker
114*cf84ac9aSAndroid Build Coastguard Worker break;
115*cf84ac9aSAndroid Build Coastguard Worker }
116*cf84ac9aSAndroid Build Coastguard Worker }
117*cf84ac9aSAndroid Build Coastguard Worker
118*cf84ac9aSAndroid Build Coastguard Worker if (quote)
119*cf84ac9aSAndroid Build Coastguard Worker putchar('"');
120*cf84ac9aSAndroid Build Coastguard Worker }
121*cf84ac9aSAndroid Build Coastguard Worker
122*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_memory(const void * const instr,const size_t len)123*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory(const void *const instr, const size_t len)
124*cf84ac9aSAndroid Build Coastguard Worker {
125*cf84ac9aSAndroid Build Coastguard Worker print_quoted_memory_ex(instr, len, true, NULL);
126*cf84ac9aSAndroid Build Coastguard Worker }
127*cf84ac9aSAndroid Build Coastguard Worker
128*cf84ac9aSAndroid Build Coastguard Worker void
print_quoted_hex(const void * const instr,const size_t len)129*cf84ac9aSAndroid Build Coastguard Worker print_quoted_hex(const void *const instr, const size_t len)
130*cf84ac9aSAndroid Build Coastguard Worker {
131*cf84ac9aSAndroid Build Coastguard Worker const unsigned char *str = instr;
132*cf84ac9aSAndroid Build Coastguard Worker size_t i;
133*cf84ac9aSAndroid Build Coastguard Worker
134*cf84ac9aSAndroid Build Coastguard Worker printf("\"");
135*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < len; i++)
136*cf84ac9aSAndroid Build Coastguard Worker printf("\\x%02x", str[i]);
137*cf84ac9aSAndroid Build Coastguard Worker printf("\"");
138*cf84ac9aSAndroid Build Coastguard Worker }
139