Update to LGPL v2.1.
[platform/upstream/glibc.git] / localedata / tst-digits.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 Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the 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    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
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   /* First: printf tests.  */
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   /* wprintf tests.  */
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   /* ctype tests.  This makes sure that the multibyte chracter digit
183      representations are not handle in this table.  */
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   /* wctype tests.  This makes sure the second set of digits is also
207      recorded.  */
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 }