1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <ctype.h>
21: #include <langinfo.h>
22: #include <locale.h>
23: #include <stdio.h>
24: #include <stdlib.h>
25: #include <string.h>
26: #include <unistd.h>
27: #include <wchar.h>
28: #include <wctype.h>
29: #include <sys/types.h>
30:
31:
32: #define ZERO "\xe2\x82\x80"
33: #define ONE "\xe2\x82\x81"
34: #define TWO "\xe2\x82\x82"
35: #define THREE "\xe2\x82\x83"
36: #define FOUR "\xe2\x82\x84"
37: #define FIVE "\xe2\x82\x85"
38: #define SIX "\xe2\x82\x86"
39: #define SEVEN "\xe2\x82\x87"
40: #define EIGHT "\xe2\x82\x88"
41: #define NINE "\xe2\x82\x89"
42:
43: static struct printf_int_test
44: {
45: int n;
46: const char *format;
47: const char *expected;
48: } printf_int_tests[] =
49: {
50: { 0, "%I'10d", " " ZERO },
51: { 1, "%I'10d", " " ONE },
52: { 2, "%I'10d", " " TWO },
53: { 3, "%I'10d", " " THREE },
54: { 4, "%I'10d", " " FOUR },
55: { 5, "%I'10d", " " FIVE },
56: { 6, "%I'10d", " " SIX },
57: { 7, "%I'10d", " " SEVEN },
58: { 8, "%I'10d", " " EIGHT },
59: { 9, "%I'10d", " " NINE },
60: { 11, "%I'10d", " " ONE ONE },
61: { 12, "%I'10d", " " ONE TWO },
62: { 123, "%I10d", " " ONE TWO THREE },
63: { 123, "%I'10d", " " ONE TWO THREE },
64: { 1234, "%I10d", ONE TWO THREE FOUR },
65: { 1234, "%I'10d", ONE "," TWO THREE FOUR },
66: { 12345, "%I'10d", ONE TWO "," THREE FOUR FIVE },
67: { 123456, "%I'10d", ONE TWO THREE "," FOUR FIVE SIX },
68: { 1234567, "%I'10d", ONE "," TWO THREE FOUR "," FIVE SIX SEVEN }
69: };
70: #define nprintf_int_tests \
71: (sizeof (printf_int_tests) / sizeof (printf_int_tests[0]))
72:
73: #define WZERO L"\x2080"
74: #define WONE L"\x2081"
75: #define WTWO L"\x2082"
76: #define WTHREE L"\x2083"
77: #define WFOUR L"\x2084"
78: #define WFIVE L"\x2085"
79: #define WSIX L"\x2086"
80: #define WSEVEN L"\x2087"
81: #define WEIGHT L"\x2088"
82: #define WNINE L"\x2089"
83:
84: static struct wprintf_int_test
85: {
86: int n;
87: const wchar_t *format;
88: const wchar_t *expected;
89: } wprintf_int_tests[] =
90: {
91: { 0, L"%I'10d", L" " WZERO },
92: { 1, L"%I'10d", L" " WONE },
93: { 2, L"%I'10d", L" " WTWO },
94: { 3, L"%I'10d", L" " WTHREE },
95: { 4, L"%I'10d", L" " WFOUR },
96: { 5, L"%I'10d", L" " WFIVE },
97: { 6, L"%I'10d", L" " WSIX },
98: { 7, L"%I'10d", L" " WSEVEN },
99: { 8, L"%I'10d", L" " WEIGHT },
100: { 9, L"%I'10d", L" " WNINE },
101: { 11, L"%I'10d", L" " WONE WONE },
102: { 12, L"%I'10d", L" " WONE WTWO },
103: { 123, L"%I10d", L" " WONE WTWO WTHREE },
104: { 123, L"%I'10d", L" " WONE WTWO WTHREE },
105: { 1234, L"%I10d", L" " WONE WTWO WTHREE WFOUR },
106: { 1234, L"%I'10d", L" " WONE L"," WTWO WTHREE WFOUR },
107: { 12345, L"%I'10d", L" " WONE WTWO L"," WTHREE WFOUR WFIVE },
108: { 123456, L"%I'10d", L" " WONE WTWO WTHREE L"," WFOUR WFIVE WSIX },
109: { 1234567, L"%I'10d", L" " WONE L"," WTWO WTHREE WFOUR L"," WFIVE WSIX WSEVEN }
110: };
111: #define nwprintf_int_tests \
112: (sizeof (wprintf_int_tests) / sizeof (wprintf_int_tests[0]))
113:
114:
115: int
116: main (void)
117: {
118: int cnt;
119: int failures;
120: int status;
121:
122: if (setlocale (LC_ALL, "test7") == NULL)
123: {
124: puts ("cannot set locale `test7'");
125: exit (1);
126: }
127: printf ("CODESET = \"%s\"\n", nl_langinfo (CODESET));
128:
129:
130: failures = 0;
131: for (cnt = 0; cnt < (int) nprintf_int_tests; ++cnt)
132: {
133: char buf[100];
134: ssize_t n;
135:
136: n = snprintf (buf, sizeof buf, printf_int_tests[cnt].format,
137: printf_int_tests[cnt].n);
138:
139: printf ("%3d: got \"%s\", expected \"%s\"",
140: cnt, buf, printf_int_tests[cnt].expected);
141:
142: if (n != (ssize_t) strlen (printf_int_tests[cnt].expected)
143: || strcmp (buf, printf_int_tests[cnt].expected) != 0)
144: {
145: puts (" -> FAILED");
146: ++failures;
147: }
148: else
149: puts (" -> OK");
150: }
151:
152: printf ("%d failures in printf tests\n", failures);
153: status = failures != 0;
154:
155:
156: failures = 0;
157: for (cnt = 0; cnt < (int) nwprintf_int_tests; ++cnt)
158: {
159: wchar_t buf[100];
160: ssize_t n;
161:
162: n = swprintf (buf, sizeof buf / sizeof (buf[0]),
163: wprintf_int_tests[cnt].format,
164: wprintf_int_tests[cnt].n);
165:
166: printf ("%3d: got \"%ls\", expected \"%ls\"",
167: cnt, buf, wprintf_int_tests[cnt].expected);
168:
169: if (n != (ssize_t) wcslen (wprintf_int_tests[cnt].expected)
170: || wcscmp (buf, wprintf_int_tests[cnt].expected) != 0)
171: {
172: puts (" -> FAILED");
173: ++failures;
174: }
175: else
176: puts (" -> OK");
177: }
178:
179: printf ("%d failures in wprintf tests\n", failures);
180: status = failures != 0;
181:
182:
183:
184: failures = 0;
185: for (cnt = 0; cnt < 256; ++cnt)
186: if (cnt >= '0' && cnt <= '9')
187: {
188: if (! isdigit (cnt))
189: {
190: printf ("isdigit ('%c') == 0\n", cnt);
191: ++failures;
192: }
193: }
194: else
195: {
196: if (isdigit (cnt))
197: {
198: printf ("isdigit (%d) != 0\n", cnt);
199: ++failures;
200: }
201: }
202:
203: printf ("%d failures in ctype tests\n", failures);
204: status = failures != 0;
205:
206:
207:
208: failures = 0;
209: for (cnt = 0; cnt < 256; ++cnt)
210: if (cnt >= '0' && cnt <= '9')
211: {
212: if (! iswdigit (cnt))
213: {
214: printf ("iswdigit (L'%c') == 0\n", cnt);
215: ++failures;
216: }
217: }
218: else
219: {
220: if (iswdigit (cnt))
221: {
222: printf ("iswdigit (%d) != 0\n", cnt);
223: ++failures;
224: }
225: }
226:
227: for (cnt = 0x2070; cnt < 0x2090; ++cnt)
228: if (cnt >= 0x2080 && cnt <= 0x2089)
229: {
230: if (! iswdigit (cnt))
231: {
232: printf ("iswdigit (U%04X) == 0\n", cnt);
233: ++failures;
234: }
235: }
236: else
237: {
238: if (iswdigit (cnt))
239: {
240: printf ("iswdigit (U%04X) != 0\n", cnt);
241: ++failures;
242: }
243: }
244:
245: printf ("%d failures in wctype tests\n", failures);
246: status = failures != 0;
247:
248: return status;
249: }