1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2 //
3 // UNSUPPORTED: linux, solaris, darwin
4
5 #include <ctype.h>
6 #include <err.h>
7 #include <inttypes.h>
8 #include <stdint.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <vis.h>
12
test_vis()13 void test_vis() {
14 char visout[5];
15 int ch = toascii(0x1);
16 vis(visout, ch, VIS_SAFE | VIS_NOSLASH, 0);
17 printf("vis: %s\n", visout);
18 }
19
test_nvis()20 void test_nvis() {
21 char visout[5];
22 int ch = toascii(0x2);
23 nvis(visout, sizeof visout, ch, VIS_SAFE | VIS_NOSLASH, 0);
24 printf("nvis: %s\n", visout);
25 }
26
test_strvis()27 void test_strvis() {
28 char visout[5];
29 strvis(visout, "\3", VIS_SAFE | VIS_NOSLASH);
30 printf("strvis: %s\n", visout);
31 }
32
test_stravis()33 void test_stravis() {
34 char *visout;
35 stravis(&visout, "\4", VIS_SAFE | VIS_NOSLASH);
36 printf("stravis: %s\n", visout);
37 free(visout);
38 }
39
test_strnvis()40 void test_strnvis() {
41 char visout[5];
42 strnvis(visout, sizeof visout, "\5", VIS_SAFE | VIS_NOSLASH);
43 printf("strnvis: %s\n", visout);
44 }
45
test_strvisx()46 void test_strvisx() {
47 char visout[5];
48 char src[] = "\6";
49 strvisx(visout, src, sizeof src - 1 /* skip final \0 */,
50 VIS_SAFE | VIS_NOSLASH);
51 printf("strvisx: %s\n", visout);
52 }
53
test_strnvisx()54 void test_strnvisx() {
55 char visout[5];
56 char src[] = "\1";
57 strnvisx(visout, sizeof visout, src, sizeof src - 1 /* skip final \0 */,
58 VIS_SAFE | VIS_NOSLASH);
59 printf("strnvisx: %s\n", visout);
60 }
61
test_strenvisx()62 void test_strenvisx() {
63 char visout[5];
64 char src[] = "\2";
65 strenvisx(visout, sizeof visout, src, sizeof src - 1 /* skip final \0 */,
66 VIS_SAFE | VIS_NOSLASH, NULL);
67 printf("strenvisx: %s\n", visout);
68 }
69
test_svis()70 void test_svis() {
71 char visout[5];
72 int ch = toascii(0x3);
73 svis(visout, ch, VIS_SAFE | VIS_NOSLASH, 0, "x");
74 printf("svis: %s\n", visout);
75 }
76
test_snvis()77 void test_snvis() {
78 char visout[5];
79 int ch = toascii(0x2);
80 snvis(visout, sizeof visout, ch, VIS_SAFE | VIS_NOSLASH, 0, "x");
81 printf("snvis: %s\n", visout);
82 }
83
test_strsvis()84 void test_strsvis() {
85 char visout[5];
86 strsvis(visout, "\4", VIS_SAFE | VIS_NOSLASH, "x");
87 printf("strsvis: %s\n", visout);
88 }
89
test_strsnvis()90 void test_strsnvis() {
91 char visout[5];
92 strsnvis(visout, sizeof visout, "\5", VIS_SAFE | VIS_NOSLASH, "x");
93 printf("strsnvis: %s\n", visout);
94 }
95
test_strsvisx()96 void test_strsvisx() {
97 char visout[5];
98 char src[] = "\5";
99 strsvisx(visout, src, sizeof src - 1 /* skip final \0 */,
100 VIS_SAFE | VIS_NOSLASH, "x");
101 printf("strsvisx: %s\n", visout);
102 }
103
test_strsnvisx()104 void test_strsnvisx() {
105 char visout[5];
106 char src[] = "\6";
107 strsnvisx(visout, sizeof visout, src, sizeof src - 1 /* skip final \0 */,
108 VIS_SAFE | VIS_NOSLASH, "x");
109 printf("strsnvisx: %s\n", visout);
110 }
111
test_strsenvisx()112 void test_strsenvisx() {
113 char visout[5];
114 char src[] = "\1";
115 strsenvisx(visout, sizeof visout, src, sizeof src - 1 /* skip final \0 */,
116 VIS_SAFE | VIS_NOSLASH, "x", NULL);
117 printf("strsenvisx: %s\n", visout);
118 }
119
test_unvis()120 void test_unvis() {
121 char visout[5];
122 int ch = toascii(0x1);
123 vis(visout, ch, VIS_SAFE, 0);
124
125 int state = 0;
126 char out;
127 char *p = visout;
128 while ((ch = *(p++)) != '\0') {
129 again:
130 switch (unvis(&out, ch, &state, 0)) {
131 case 0:
132 case UNVIS_NOCHAR:
133 break;
134 case UNVIS_VALID:
135 printf("unvis: %" PRIx8 "\n", (unsigned char)out);
136 break;
137 case UNVIS_VALIDPUSH:
138 printf("unvis: %" PRIx8 "\n", (unsigned char)out);
139 goto again;
140 case UNVIS_SYNBAD:
141 errx(1, "Bad character sequence!");
142 }
143 }
144 if (unvis(&out, '\0', &state, UNVIS_END) == UNVIS_VALID)
145 printf("unvis: %" PRIx8 "\n", (unsigned char)out);
146 }
147
test_strunvis()148 void test_strunvis() {
149 char visout[5];
150 int ch = toascii(0x2);
151 vis(visout, ch, VIS_SAFE, 0);
152
153 char p[5];
154 strunvis(p, visout);
155
156 char *pp = p;
157 while ((ch = *(pp++)) != '\0')
158 printf("strunvis: %" PRIx8 "\n", (unsigned char)ch);
159 }
160
test_strnunvis()161 void test_strnunvis() {
162 char visout[5];
163 int ch = toascii(0x3);
164 vis(visout, ch, VIS_SAFE, 0);
165
166 char p[5];
167 strnunvis(p, sizeof p, visout);
168
169 char *pp = p;
170 while ((ch = *(pp++)) != '\0')
171 printf("strnunvis: %" PRIx8 "\n", (unsigned char)ch);
172 }
173
test_strunvisx()174 void test_strunvisx() {
175 char visout[5];
176 int ch = toascii(0x4);
177 vis(visout, ch, VIS_SAFE, 0);
178
179 char p[5];
180 strunvisx(p, visout, VIS_SAFE);
181
182 char *pp = p;
183 while ((ch = *(pp++)) != '\0')
184 printf("strunvisx: %" PRIx8 "\n", (unsigned char)ch);
185 }
186
test_strnunvisx()187 void test_strnunvisx() {
188 char visout[5];
189 int ch = toascii(0x5);
190 vis(visout, ch, VIS_SAFE, 0);
191
192 char p[5];
193 strnunvisx(p, sizeof p, visout, VIS_SAFE);
194
195 char *pp = p;
196 while ((ch = *(pp++)) != '\0')
197 printf("strnunvisx: %" PRIx8 "\n", (unsigned char)ch);
198 }
199
main(void)200 int main(void) {
201 printf("vis\n");
202
203 test_vis();
204 test_nvis();
205 test_strvis();
206 test_stravis();
207 test_strnvis();
208 test_strvisx();
209 test_strnvisx();
210 test_strenvisx();
211 test_svis();
212 test_snvis();
213 test_strsvis();
214 test_strsnvis();
215 test_strsvisx();
216 test_strsnvisx();
217 test_strsenvisx();
218 test_unvis();
219 test_strunvis();
220 test_strnunvis();
221 test_strunvisx();
222 test_strnunvisx();
223
224 // CHECK: vis
225 // CHECK: vis: ^A
226 // CHECK: nvis: ^B
227 // CHECK: strvis: ^C
228 // CHECK: stravis: ^D
229 // CHECK: strnvis: ^E
230 // CHECK: strvisx: ^F
231 // CHECK: strnvisx: ^A
232 // CHECK: strenvisx: ^B
233 // CHECK: svis: ^C
234 // CHECK: snvis: ^B
235 // CHECK: strsvis: ^D
236 // CHECK: strsnvis: ^E
237 // CHECK: strsvisx: ^E
238 // CHECK: strsnvisx: ^F
239 // CHECK: strsenvisx: ^A
240 // CHECK: unvis: 1
241 // CHECK: strunvis: 2
242 // CHECK: strnunvis: 3
243 // CHECK: strunvisx: 4
244 // CHECK: strnunvisx: 5
245
246 return 0;
247 }
248