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 (*str >= '0' && *str <= '9') {
72 						/* Print \octal */
73 						putchar(c3);
74 						putchar(c2);
75 					} else {
76 						/* Print \[[o]o]o */
77 						if (c3 != '0')
78 							putchar(c3);
79 						if (c3 != '0' || c2 != '0')
80 							putchar(c2);
81 					}
82 					putchar(c1);
83 				}
84 				break;
85 		}
86 	}
87 
88 	putchar('"');
89 }
90 
91 void
92 print_quoted_hex(const void *const instr, const size_t len)
93 {
94 	const unsigned char *str = instr;
95 	size_t i;
96 
97 	printf("\"");
98 	for (i = 0; i < len; i++)
99 		printf("\\x%02x", str[i]);
100 	printf("\"");
101 }
102