1 : /* Test of character handling in C locale.
2 : Copyright (C) 2005, 2007-2008 Free Software Foundation, Inc.
3 :
4 : This program is free software: you can redistribute it and/or modify
5 : it under the terms of the GNU General Public License as published by
6 : the Free Software Foundation; either version 3 of the License, or
7 : (at your option) any later version.
8 :
9 : This program is distributed in the hope that it will be useful,
10 : but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : GNU General Public License for more details.
13 :
14 : You should have received a copy of the GNU General Public License
15 : along with this program. If not, see <http://www.gnu.org/licenses/>. */
16 :
17 : /* Written by Bruno Haible <bruno@clisp.org>, 2005. */
18 :
19 : #include <config.h>
20 :
21 : #include "c-ctype.h"
22 :
23 : #include <locale.h>
24 : #include <stdio.h>
25 : #include <stdlib.h>
26 :
27 : #define ASSERT(expr) \
28 : do \
29 : { \
30 : if (!(expr)) \
31 : { \
32 : fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
33 : fflush (stderr); \
34 : abort (); \
35 : } \
36 : } \
37 : while (0)
38 :
39 : static void
40 : test_all (void)
41 3 : {
42 : int c;
43 :
44 1155 : for (c = -0x80; c < 0x100; c++)
45 : {
46 1152 : ASSERT (c_isascii (c) == (c >= 0 && c < 0x80));
47 :
48 1152 : switch (c)
49 : {
50 : case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
51 : case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
52 : case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
53 : case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
54 : case 'Y': case 'Z':
55 : case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
56 : case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
57 : case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
58 : case 's': case 't': case 'u': case 'v': case 'w': case 'x':
59 : case 'y': case 'z':
60 : case '0': case '1': case '2': case '3': case '4': case '5':
61 : case '6': case '7': case '8': case '9':
62 186 : ASSERT (c_isalnum (c) == 1);
63 186 : break;
64 : default:
65 966 : ASSERT (c_isalnum (c) == 0);
66 : break;
67 : }
68 :
69 1152 : switch (c)
70 : {
71 : case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
72 : case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
73 : case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
74 : case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
75 : case 'Y': case 'Z':
76 : case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
77 : case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
78 : case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
79 : case 's': case 't': case 'u': case 'v': case 'w': case 'x':
80 : case 'y': case 'z':
81 156 : ASSERT (c_isalpha (c) == 1);
82 156 : break;
83 : default:
84 996 : ASSERT (c_isalpha (c) == 0);
85 : break;
86 : }
87 :
88 1152 : switch (c)
89 : {
90 : case '\t': case ' ':
91 6 : ASSERT (c_isblank (c) == 1);
92 6 : break;
93 : default:
94 1146 : ASSERT (c_isblank (c) == 0);
95 : break;
96 : }
97 :
98 1152 : ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f));
99 :
100 1152 : switch (c)
101 : {
102 : case '0': case '1': case '2': case '3': case '4': case '5':
103 : case '6': case '7': case '8': case '9':
104 30 : ASSERT (c_isdigit (c) == 1);
105 30 : break;
106 : default:
107 1122 : ASSERT (c_isdigit (c) == 0);
108 : break;
109 : }
110 :
111 1152 : switch (c)
112 : {
113 : case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
114 : case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
115 : case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
116 : case 's': case 't': case 'u': case 'v': case 'w': case 'x':
117 : case 'y': case 'z':
118 78 : ASSERT (c_islower (c) == 1);
119 78 : break;
120 : default:
121 1074 : ASSERT (c_islower (c) == 0);
122 : break;
123 : }
124 :
125 1152 : ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' '));
126 :
127 1152 : ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f));
128 :
129 1152 : ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c)));
130 :
131 1152 : switch (c)
132 : {
133 : case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
134 18 : ASSERT (c_isspace (c) == 1);
135 18 : break;
136 : default:
137 1134 : ASSERT (c_isspace (c) == 0);
138 : break;
139 : }
140 :
141 1152 : switch (c)
142 : {
143 : case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
144 : case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
145 : case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
146 : case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
147 : case 'Y': case 'Z':
148 78 : ASSERT (c_isupper (c) == 1);
149 78 : break;
150 : default:
151 1074 : ASSERT (c_isupper (c) == 0);
152 : break;
153 : }
154 :
155 1152 : switch (c)
156 : {
157 : case '0': case '1': case '2': case '3': case '4': case '5':
158 : case '6': case '7': case '8': case '9':
159 : case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
160 : case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
161 66 : ASSERT (c_isxdigit (c) == 1);
162 66 : break;
163 : default:
164 1086 : ASSERT (c_isxdigit (c) == 0);
165 : break;
166 : }
167 :
168 1152 : switch (c)
169 : {
170 : case 'A':
171 3 : ASSERT (c_tolower (c) == 'a');
172 3 : ASSERT (c_toupper (c) == c);
173 3 : break;
174 : case 'B':
175 3 : ASSERT (c_tolower (c) == 'b');
176 3 : ASSERT (c_toupper (c) == c);
177 3 : break;
178 : case 'C':
179 3 : ASSERT (c_tolower (c) == 'c');
180 3 : ASSERT (c_toupper (c) == c);
181 3 : break;
182 : case 'D':
183 3 : ASSERT (c_tolower (c) == 'd');
184 3 : ASSERT (c_toupper (c) == c);
185 3 : break;
186 : case 'E':
187 3 : ASSERT (c_tolower (c) == 'e');
188 3 : ASSERT (c_toupper (c) == c);
189 3 : break;
190 : case 'F':
191 3 : ASSERT (c_tolower (c) == 'f');
192 3 : ASSERT (c_toupper (c) == c);
193 3 : break;
194 : case 'G':
195 3 : ASSERT (c_tolower (c) == 'g');
196 3 : ASSERT (c_toupper (c) == c);
197 3 : break;
198 : case 'H':
199 3 : ASSERT (c_tolower (c) == 'h');
200 3 : ASSERT (c_toupper (c) == c);
201 3 : break;
202 : case 'I':
203 3 : ASSERT (c_tolower (c) == 'i');
204 3 : ASSERT (c_toupper (c) == c);
205 3 : break;
206 : case 'J':
207 3 : ASSERT (c_tolower (c) == 'j');
208 3 : ASSERT (c_toupper (c) == c);
209 3 : break;
210 : case 'K':
211 3 : ASSERT (c_tolower (c) == 'k');
212 3 : ASSERT (c_toupper (c) == c);
213 3 : break;
214 : case 'L':
215 3 : ASSERT (c_tolower (c) == 'l');
216 3 : ASSERT (c_toupper (c) == c);
217 3 : break;
218 : case 'M':
219 3 : ASSERT (c_tolower (c) == 'm');
220 3 : ASSERT (c_toupper (c) == c);
221 3 : break;
222 : case 'N':
223 3 : ASSERT (c_tolower (c) == 'n');
224 3 : ASSERT (c_toupper (c) == c);
225 3 : break;
226 : case 'O':
227 3 : ASSERT (c_tolower (c) == 'o');
228 3 : ASSERT (c_toupper (c) == c);
229 3 : break;
230 : case 'P':
231 3 : ASSERT (c_tolower (c) == 'p');
232 3 : ASSERT (c_toupper (c) == c);
233 3 : break;
234 : case 'Q':
235 3 : ASSERT (c_tolower (c) == 'q');
236 3 : ASSERT (c_toupper (c) == c);
237 3 : break;
238 : case 'R':
239 3 : ASSERT (c_tolower (c) == 'r');
240 3 : ASSERT (c_toupper (c) == c);
241 3 : break;
242 : case 'S':
243 3 : ASSERT (c_tolower (c) == 's');
244 3 : ASSERT (c_toupper (c) == c);
245 3 : break;
246 : case 'T':
247 3 : ASSERT (c_tolower (c) == 't');
248 3 : ASSERT (c_toupper (c) == c);
249 3 : break;
250 : case 'U':
251 3 : ASSERT (c_tolower (c) == 'u');
252 3 : ASSERT (c_toupper (c) == c);
253 3 : break;
254 : case 'V':
255 3 : ASSERT (c_tolower (c) == 'v');
256 3 : ASSERT (c_toupper (c) == c);
257 3 : break;
258 : case 'W':
259 3 : ASSERT (c_tolower (c) == 'w');
260 3 : ASSERT (c_toupper (c) == c);
261 3 : break;
262 : case 'X':
263 3 : ASSERT (c_tolower (c) == 'x');
264 3 : ASSERT (c_toupper (c) == c);
265 3 : break;
266 : case 'Y':
267 3 : ASSERT (c_tolower (c) == 'y');
268 3 : ASSERT (c_toupper (c) == c);
269 3 : break;
270 : case 'Z':
271 3 : ASSERT (c_tolower (c) == 'z');
272 3 : ASSERT (c_toupper (c) == c);
273 3 : break;
274 : case 'a':
275 3 : ASSERT (c_tolower (c) == c);
276 3 : ASSERT (c_toupper (c) == 'A');
277 3 : break;
278 : case 'b':
279 3 : ASSERT (c_tolower (c) == c);
280 3 : ASSERT (c_toupper (c) == 'B');
281 3 : break;
282 : case 'c':
283 3 : ASSERT (c_tolower (c) == c);
284 3 : ASSERT (c_toupper (c) == 'C');
285 3 : break;
286 : case 'd':
287 3 : ASSERT (c_tolower (c) == c);
288 3 : ASSERT (c_toupper (c) == 'D');
289 3 : break;
290 : case 'e':
291 3 : ASSERT (c_tolower (c) == c);
292 3 : ASSERT (c_toupper (c) == 'E');
293 3 : break;
294 : case 'f':
295 3 : ASSERT (c_tolower (c) == c);
296 3 : ASSERT (c_toupper (c) == 'F');
297 3 : break;
298 : case 'g':
299 3 : ASSERT (c_tolower (c) == c);
300 3 : ASSERT (c_toupper (c) == 'G');
301 3 : break;
302 : case 'h':
303 3 : ASSERT (c_tolower (c) == c);
304 3 : ASSERT (c_toupper (c) == 'H');
305 3 : break;
306 : case 'i':
307 3 : ASSERT (c_tolower (c) == c);
308 3 : ASSERT (c_toupper (c) == 'I');
309 3 : break;
310 : case 'j':
311 3 : ASSERT (c_tolower (c) == c);
312 3 : ASSERT (c_toupper (c) == 'J');
313 3 : break;
314 : case 'k':
315 3 : ASSERT (c_tolower (c) == c);
316 3 : ASSERT (c_toupper (c) == 'K');
317 3 : break;
318 : case 'l':
319 3 : ASSERT (c_tolower (c) == c);
320 3 : ASSERT (c_toupper (c) == 'L');
321 3 : break;
322 : case 'm':
323 3 : ASSERT (c_tolower (c) == c);
324 3 : ASSERT (c_toupper (c) == 'M');
325 3 : break;
326 : case 'n':
327 3 : ASSERT (c_tolower (c) == c);
328 3 : ASSERT (c_toupper (c) == 'N');
329 3 : break;
330 : case 'o':
331 3 : ASSERT (c_tolower (c) == c);
332 3 : ASSERT (c_toupper (c) == 'O');
333 3 : break;
334 : case 'p':
335 3 : ASSERT (c_tolower (c) == c);
336 3 : ASSERT (c_toupper (c) == 'P');
337 3 : break;
338 : case 'q':
339 3 : ASSERT (c_tolower (c) == c);
340 3 : ASSERT (c_toupper (c) == 'Q');
341 3 : break;
342 : case 'r':
343 3 : ASSERT (c_tolower (c) == c);
344 3 : ASSERT (c_toupper (c) == 'R');
345 3 : break;
346 : case 's':
347 3 : ASSERT (c_tolower (c) == c);
348 3 : ASSERT (c_toupper (c) == 'S');
349 3 : break;
350 : case 't':
351 3 : ASSERT (c_tolower (c) == c);
352 3 : ASSERT (c_toupper (c) == 'T');
353 3 : break;
354 : case 'u':
355 3 : ASSERT (c_tolower (c) == c);
356 3 : ASSERT (c_toupper (c) == 'U');
357 3 : break;
358 : case 'v':
359 3 : ASSERT (c_tolower (c) == c);
360 3 : ASSERT (c_toupper (c) == 'V');
361 3 : break;
362 : case 'w':
363 3 : ASSERT (c_tolower (c) == c);
364 3 : ASSERT (c_toupper (c) == 'W');
365 3 : break;
366 : case 'x':
367 3 : ASSERT (c_tolower (c) == c);
368 3 : ASSERT (c_toupper (c) == 'X');
369 3 : break;
370 : case 'y':
371 3 : ASSERT (c_tolower (c) == c);
372 3 : ASSERT (c_toupper (c) == 'Y');
373 3 : break;
374 : case 'z':
375 3 : ASSERT (c_tolower (c) == c);
376 3 : ASSERT (c_toupper (c) == 'Z');
377 3 : break;
378 : default:
379 996 : ASSERT (c_tolower (c) == c);
380 996 : ASSERT (c_toupper (c) == c);
381 : break;
382 : }
383 : }
384 3 : }
385 :
386 : int
387 : main ()
388 1 : {
389 1 : test_all ();
390 :
391 1 : setlocale (LC_ALL, "de_DE");
392 1 : test_all ();
393 :
394 1 : setlocale (LC_ALL, "ja_JP.EUC-JP");
395 1 : test_all ();
396 :
397 1 : return 0;
398 : }
|