testfmt.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
testfmt.c (5339B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 #include <stdio.h> | |
4 | |
5 int failed; | |
6 | |
7 /* Consume argument and ignore it */ | |
8 int | |
9 Zflag(Fmt* f) | |
10 { | |
11 if(va_arg(f->args, int)) | |
12 ; | |
13 return 1; /* it's a flag */ | |
14 } | |
15 | |
16 void | |
17 verify(char *s, char *t) | |
18 { | |
19 if(strcmp(s, t) != 0){ | |
20 failed = 1; | |
21 fprintf(stderr, "error: (%s) != (%s)\n", s, t); | |
22 } | |
23 free(s); | |
24 } | |
25 | |
26 Rune lightsmiley = 0x263a; | |
27 Rune darksmiley = 0x263b; | |
28 | |
29 /* Test printer that loads unusual decimal point and separator */ | |
30 char* | |
31 mysmprint(char *fmt, ...) | |
32 { | |
33 Fmt f; | |
34 | |
35 if(fmtstrinit(&f) < 0) | |
36 return 0; | |
37 va_start(f.args, fmt); | |
38 f.decimal = smprint("%C", lightsmiley); | |
39 f.thousands = smprint("%C", darksmiley); | |
40 f.grouping = "\1\2\3\4"; | |
41 if(dofmt(&f, fmt) < 0) | |
42 return 0; | |
43 va_end(f.args); | |
44 return fmtstrflush(&f); | |
45 } | |
46 | |
47 double near1[] = { | |
48 0.5, | |
49 0.95, | |
50 0.995, | |
51 0.9995, | |
52 0.99995, | |
53 0.999995, | |
54 0.9999995, | |
55 0.99999995, | |
56 0.999999995, | |
57 }; | |
58 | |
59 void | |
60 main(int argc, char **argv) | |
61 { | |
62 int i, j; | |
63 | |
64 quotefmtinstall(); | |
65 fmtinstall('Z', Zflag); | |
66 fmtinstall(L'\x263a', Zflag); | |
67 #ifdef PLAN9PORT | |
68 { extern int __ifmt(Fmt*); | |
69 fmtinstall('i', __ifmt); | |
70 } | |
71 #endif | |
72 | |
73 verify(smprint("hello world"), "hello world"); | |
74 #ifdef PLAN9PORT | |
75 verify(smprint("x: %ux", 0x87654321), "x: 87654321"); | |
76 #else | |
77 verify(smprint("x: %x", 0x87654321), "x: 87654321"); | |
78 #endif | |
79 verify(smprint("d: %d", 0x87654321), "d: -2023406815"); | |
80 verify(smprint("s: %s", "hi there"), "s: hi there"); | |
81 verify(smprint("q: %q", "hi i'm here"), "q: 'hi i''m here'"); | |
82 verify(smprint("c: %c", '!'), "c: !"); | |
83 verify(smprint("g: %g %g %g", 3.14159, 3.14159e10, 3.14159e-10),… | |
84 verify(smprint("e: %e %e %e", 3.14159, 3.14159e10, 3.14159e-10),… | |
85 verify(smprint("f: %f %f %f", 3.14159, 3.14159e10, 3.14159e-10),… | |
86 verify(smprint("smiley: %C", (Rune)0x263a), "smiley: \xe2\x98\xb… | |
87 verify(smprint("%g %.18g", 2e25, 2e25), "2e+25 2e+25"); | |
88 verify(smprint("%2.18g", 1.0), " 1"); | |
89 verify(smprint("%f", 3.1415927/4), "0.785398"); | |
90 verify(smprint("%d", 23), "23"); | |
91 verify(smprint("%i", 23), "23"); | |
92 verify(smprint("%Zi", 1234, 23), "23"); | |
93 | |
94 /* ANSI and their wacky corner cases */ | |
95 verify(smprint("%.0d", 0), ""); | |
96 verify(smprint("%.0o", 0), ""); | |
97 verify(smprint("%.0x", 0), ""); | |
98 verify(smprint("%#.0o", 0), "0"); | |
99 verify(smprint("%#.0x", 0), ""); | |
100 | |
101 /* difficult floating point tests that many libraries get wrong … | |
102 verify(smprint("%.100f", 1.0), "1.000000000000000000000000000000… | |
103 verify(smprint("%.100g", 1.0), "1"); | |
104 verify(smprint("%0100f", 1.0), "00000000000000000000000000000000… | |
105 for(i=1; i<9; i++) | |
106 for(j=0; j<=i; j++) | |
107 verify(smprint("%.*g", j, near1[i]), "1"); | |
108 | |
109 /* test $ reorderings */ | |
110 verify(smprint("%3$d %4$06d %2$d %1$d", 444, 333, 111, 222), "11… | |
111 verify(smprint("%3$Zd %5$06d %2$d %1$d", 444, 333, 555, 111, 222… | |
112 verify(smprint("%3$d %4$*5$06d %2$d %1$d", 444, 333, 111, 222, 2… | |
113 verify(smprint("%3$hd %4$*5$06d %2$d %1$d", 444, 333, (short)111… | |
114 verify(smprint("%3$\xe2\x98\xba""d %5$06d %2$d %1$d", 444, 333, … | |
115 | |
116 /* test %'d formats */ | |
117 verify(smprint("%'d %'d %'d", 1, 2222, 33333333), "1 2,222 33,33… | |
118 verify(smprint("%'019d", 0), "000,000,000,000,000"); | |
119 verify(smprint("%'08d %'08d %'08d", 1, 2222, 33333333), "0,000,0… | |
120 #ifdef PLAN9PORT | |
121 verify(smprint("%'ux %'uX %'ub", 0x11111111, 0xabcd1234, 12345),… | |
122 #else | |
123 verify(smprint("%'x %'X %'b", 0x11111111, 0xabcd1234, 12345), "1… | |
124 #endif | |
125 verify(smprint("%'lld %'lld %'lld", 1LL, 222222222LL, 3333333333… | |
126 verify(smprint("%'019lld %'019lld %'019lld", 1LL, 222222222LL, 3… | |
127 #ifdef PLAN9PORT | |
128 verify(smprint("%'llux %'lluX %'llub", 0x111111111111LL, 0xabcd1… | |
129 #else | |
130 verify(smprint("%'llx %'llX %'llb", 0x111111111111LL, 0xabcd1234… | |
131 #endif | |
132 | |
133 /* test %'d with custom (utf-8!) separators */ | |
134 /* x and b still use : */ | |
135 verify(mysmprint("%'d %'d %'d", 1, 2222, 33333333), "1 2\xe2\x98… | |
136 #ifdef PLAN9PORT | |
137 verify(mysmprint("%'ux %'uX %'ub", 0x11111111, 0xabcd1234, 12345… | |
138 #else | |
139 verify(mysmprint("%'x %'X %'b", 0x11111111, 0xabcd1234, 12345), … | |
140 #endif | |
141 verify(mysmprint("%'lld %'lld %'lld", 1LL, 222222222LL, 33333333… | |
142 verify(mysmprint("%'llx %'llX %'llb", 0x111111111111LL, 0xabcd12… | |
143 verify(mysmprint("%.4f", 3.14159), "3\xe2\x98\xba""1416"); | |
144 | |
145 if(failed) | |
146 sysfatal("tests failed"); | |
147 exits(0); | |
148 } |