Blame


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