Test program for test of ctype functions with locales.
[kopensolaris-gnu/glibc.git] / localedata / tst-ctype.c
1 /* Copyright (C) 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@gnu.org>, 2000.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <ctype.h>
21 #include <locale.h>
22 #include <stdio.h>
23
24
25 static const char lower[] = "abcdefghijklmnopqrstuvwxyz";
26 static const char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
27 static const char digits[] = "0123456789";
28
29
30 #define FAIL(str, args...) \
31   {                                                                           \
32     printf ("      " str "\n", ##args);                                       \
33     ++errors;                                                                 \
34   }
35
36
37 int
38 main (void)
39 {
40   const char *cp;
41   const char *cp2;
42   int errors = 0;
43
44   setlocale (LC_ALL, "");
45
46   printf ("Testing the ctype data of the `%s' locale\n",
47           setlocale (LC_CTYPE, NULL));
48
49 #if 0
50   /* Just for debugging.  */
51   {
52     /* Contents of the class array.  */
53     int n = 0;
54
55     printf ("upper = %04x  lower = %04x  alpha = %04x  digit = %04x  xdigit = %04x\n"
56             "space = %04x  print = %04x  graph = %04x  blank = %04x  cntrl  = %04x\n"
57             "punct = %04x  alnum = %04x\n",
58             _ISupper, _ISlower, _ISalpha, _ISdigit, _ISxdigit,
59             _ISspace, _ISprint, _ISgraph, _ISblank, _IScntrl,
60             _ISpunct, _ISalnum);
61
62     while (n < 256)
63       {
64         if (n % 8 == 0)
65           printf ("%02x: ", n);
66         printf ("%04x%s", __ctype_b[n], (n + 1) % 8 == 0 ? "\n" : " ");
67         ++n;
68       }
69   }
70 #endif
71
72   puts ("  Test of ASCII character range\n    special NUL byte handling");
73   if (isupper ('\0'))
74     FAIL ("isupper ('\\0') is true");
75   if (islower ('\0'))
76     FAIL ("islower ('\\0') is true");
77   if (isalpha ('\0'))
78     FAIL ("isalpha ('\\0') is true");
79   if (isdigit ('\0'))
80     FAIL ("isdigit ('\\0') is true");
81   if (isxdigit ('\0'))
82     FAIL ("isxdigit ('\\0') is true");
83   if (isspace ('\0'))
84     FAIL ("isspace ('\\0') is true");
85   if (isprint ('\0'))
86     FAIL ("isprint ('\\0') is true");
87   if (isgraph ('\0'))
88     FAIL ("isgraph ('\\0') is true");
89   if (isblank ('\0'))
90     FAIL ("isblank ('\\0') is true");
91   if (iscntrl ('\0'))
92     FAIL ("iscntrl ('\\0') is true");
93   if (ispunct ('\0'))
94     FAIL ("ispunct ('\\0') is true");
95   if (isalnum ('\0'))
96     FAIL ("isalnum ('\\0') is true");
97
98   puts ("    islower()");
99   for (cp = lower; *cp != '\0'; ++cp)
100     if (! islower (*cp))
101       FAIL ("islower ('%c') not true", *cp);
102   for (cp = upper; *cp != '\0'; ++cp)
103     if (islower (*cp))
104       FAIL ("islower ('%c') is true", *cp);
105   for (cp = digits; *cp != '\0'; ++cp)
106     if (islower (*cp))
107       FAIL ("islower ('%c') is true", *cp);
108
109   puts ("    isupper()");
110   for (cp = lower; *cp != '\0'; ++cp)
111     if (isupper (*cp))
112       FAIL ("isupper ('%c') is true", *cp);
113   for (cp = upper; *cp != '\0'; ++cp)
114     if (! isupper (*cp))
115       FAIL ("isupper ('%c') not true", *cp);
116   for (cp = digits; *cp != '\0'; ++cp)
117     if (isupper (*cp))
118       FAIL ("isupper ('%c') is true", *cp);
119
120   puts ("    isalpha()");
121   for (cp = lower; *cp != '\0'; ++cp)
122     if (! isalpha (*cp))
123       FAIL ("isalpha ('%c') not true", *cp);
124   for (cp = upper; *cp != '\0'; ++cp)
125     if (! isalpha (*cp))
126       FAIL ("isalpha ('%c') not true", *cp);
127   for (cp = digits; *cp != '\0'; ++cp)
128     if (isalpha (*cp))
129       FAIL ("isalpha ('%c') is true", *cp);
130
131   puts ("    isdigit()");
132   for (cp = lower; *cp != '\0'; ++cp)
133     if (isdigit (*cp))
134       FAIL ("isdigit ('%c') is true", *cp);
135   for (cp = upper; *cp != '\0'; ++cp)
136     if (isdigit (*cp))
137       FAIL ("isdigit ('%c') is true", *cp);
138   for (cp = digits; *cp != '\0'; ++cp)
139     if (! isdigit (*cp))
140       FAIL ("isdigit ('%c') not true", *cp);
141
142   puts ("    isxdigit()");
143   for (cp = lower; *cp != '\0'; ++cp)
144     if ((! isxdigit (*cp) && cp - lower < 6)
145         || (isxdigit (*cp) && cp - lower >= 6))
146       FAIL ("isxdigit ('%c') %s true", *cp, cp - upper < 6 ? "not" : "is");
147   for (cp = upper; *cp != '\0'; ++cp)
148     if ((! isxdigit (*cp) && cp - upper < 6)
149         || (isxdigit (*cp) && cp - upper >= 6))
150       FAIL ("isxdigit ('%c') %s true", *cp, cp - upper < 6 ? "not" : "is");
151   for (cp = digits; *cp != '\0'; ++cp)
152     if (! isxdigit (*cp))
153       FAIL ("isxdigit ('%c') not true", *cp);
154
155   puts ("    isspace()");
156   for (cp = lower; *cp != '\0'; ++cp)
157     if (isspace (*cp))
158       FAIL ("isspace ('%c') is true", *cp);
159   for (cp = upper; *cp != '\0'; ++cp)
160     if (isspace (*cp))
161       FAIL ("isspace ('%c') is true", *cp);
162   for (cp = digits; *cp != '\0'; ++cp)
163     if (isspace (*cp))
164       FAIL ("isspace ('%c') is true", *cp);
165
166   puts ("    isprint()");
167   for (cp = lower; *cp != '\0'; ++cp)
168     if (! isprint (*cp))
169       FAIL ("isprint ('%c') not true", *cp);
170   for (cp = upper; *cp != '\0'; ++cp)
171     if (! isprint (*cp))
172       FAIL ("isprint ('%c') not true", *cp);
173   for (cp = digits; *cp != '\0'; ++cp)
174     if (! isprint (*cp))
175       FAIL ("isprint ('%c') not true", *cp);
176
177   puts ("    isgraph()");
178   for (cp = lower; *cp != '\0'; ++cp)
179     if (! isgraph (*cp))
180       FAIL ("isgraph ('%c') not true", *cp);
181   for (cp = upper; *cp != '\0'; ++cp)
182     if (! isgraph (*cp))
183       FAIL ("isgraph ('%c') not true", *cp);
184   for (cp = digits; *cp != '\0'; ++cp)
185     if (! isgraph (*cp))
186       FAIL ("isgraph ('%c') not true", *cp);
187
188   puts ("    isblank()");
189   for (cp = lower; *cp != '\0'; ++cp)
190     if (isblank (*cp))
191       FAIL ("isblank ('%c') is true", *cp);
192   for (cp = upper; *cp != '\0'; ++cp)
193     if (isblank (*cp))
194       FAIL ("isblank ('%c') is true", *cp);
195   for (cp = digits; *cp != '\0'; ++cp)
196     if (isblank (*cp))
197       FAIL ("isblank ('%c') is true", *cp);
198
199   puts ("    iscntrl()");
200   for (cp = lower; *cp != '\0'; ++cp)
201     if (iscntrl (*cp))
202       FAIL ("iscntrl ('%c') is true", *cp);
203   for (cp = upper; *cp != '\0'; ++cp)
204     if (iscntrl (*cp))
205       FAIL ("iscntrl ('%c') is true", *cp);
206   for (cp = digits; *cp != '\0'; ++cp)
207     if (iscntrl (*cp))
208       FAIL ("iscntrl ('%c') is true", *cp);
209
210   puts ("    ispunct()");
211   for (cp = lower; *cp != '\0'; ++cp)
212     if (ispunct (*cp))
213       FAIL ("ispunct ('%c') is true", *cp);
214   for (cp = upper; *cp != '\0'; ++cp)
215     if (ispunct (*cp))
216       FAIL ("ispunct ('%c') is true", *cp);
217   for (cp = digits; *cp != '\0'; ++cp)
218     if (ispunct (*cp))
219       FAIL ("ispunct ('%c') is true", *cp);
220
221   puts ("    isalnum()");
222   for (cp = lower; *cp != '\0'; ++cp)
223     if (! isalnum (*cp))
224       FAIL ("isalnum ('%c') not true", *cp);
225   for (cp = upper; *cp != '\0'; ++cp)
226     if (! isalnum (*cp))
227       FAIL ("isalnum ('%c') not true", *cp);
228   for (cp = digits; *cp != '\0'; ++cp)
229     if (! isalnum (*cp))
230       FAIL ("isalnum ('%c') not true", *cp);
231
232
233   puts ("    tolower()");
234   for (cp = lower; *cp != '\0'; ++cp)
235     if (tolower (*cp) != *cp)
236       FAIL ("tolower ('%c') != '%c'", *cp, *cp);
237   for (cp = upper, cp2 = lower; *cp != '\0'; ++cp, ++cp2)
238     if (tolower (*cp) != *cp2)
239       FAIL ("tolower ('%c') != '%c'", *cp, *cp2);
240   for (cp = digits; *cp != '\0'; ++cp)
241     if (tolower (*cp) != *cp)
242       FAIL ("tolower ('%c') != '%c'", *cp, *cp);
243
244   puts ("    toupper()");
245   for (cp = lower, cp2 = upper; *cp != '\0'; ++cp, ++cp2)
246     if (toupper (*cp) != *cp2)
247       FAIL ("toupper ('%c') != '%c'", *cp, *cp2);
248   for (cp = upper; *cp != '\0'; ++cp)
249     if (toupper (*cp) != *cp)
250       FAIL ("toupper ('%c') != '%c'", *cp, *cp);
251   for (cp = digits; *cp != '\0'; ++cp)
252     if (toupper (*cp) != *cp)
253       FAIL ("toupper ('%c') != '%c'", *cp, *cp);
254
255
256   if (errors != 0)
257     {
258       printf ("  %d errors for `%s' locale\n\n\n", errors,
259               setlocale (LC_ALL, NULL));
260       return 1;
261     }
262
263   printf ("  No errors for `%s' locale\n\n\n", setlocale (LC_ALL, NULL));
264   return 0;
265 }