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 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 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 27 void test_strvis() { 28 char visout[5]; 29 strvis(visout, "\3", VIS_SAFE | VIS_NOSLASH); 30 printf("strvis: %s\n", visout); 31 } 32 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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