Update.
[platform/upstream/glibc.git] / localedata / tst-langinfo.c
1 #include <langinfo.h>
2 #include <locale.h>
3 #include <stdio.h>
4
5
6 struct map
7 {
8   const char *str;
9   int val;
10 } map[] =
11 {
12 #define VAL(name) { #name, name }
13   VAL (ABDAY_1),
14   VAL (ABDAY_2),
15   VAL (ABDAY_3),
16   VAL (ABDAY_4),
17   VAL (ABDAY_5),
18   VAL (ABDAY_6),
19   VAL (ABDAY_7),
20   VAL (ABMON_1),
21   VAL (ABMON_10),
22   VAL (ABMON_11),
23   VAL (ABMON_12),
24   VAL (ABMON_2),
25   VAL (ABMON_3),
26   VAL (ABMON_4),
27   VAL (ABMON_5),
28   VAL (ABMON_6),
29   VAL (ABMON_7),
30   VAL (ABMON_8),
31   VAL (ABMON_9),
32   VAL (ALT_DIGITS),
33   VAL (AM_STR),
34   VAL (CRNCYSTR),
35   VAL (CURRENCY_SYMBOL),
36   VAL (DAY_1),
37   VAL (DAY_2),
38   VAL (DAY_3),
39   VAL (DAY_4),
40   VAL (DAY_5),
41   VAL (DAY_6),
42   VAL (DAY_7),
43   VAL (DECIMAL_POINT),
44   VAL (D_FMT),
45   VAL (D_T_FMT),
46   VAL (ERA),
47   VAL (ERA_D_FMT),
48   VAL (ERA_D_T_FMT),
49   VAL (ERA_T_FMT),
50   VAL (ERA_YEAR),
51   VAL (FRAC_DIGITS),
52   VAL (GROUPING),
53   VAL (INT_CURR_SYMBOL),
54   VAL (INT_FRAC_DIGITS),
55   VAL (MON_1),
56   VAL (MON_10),
57   VAL (MON_11),
58   VAL (MON_12),
59   VAL (MON_2),
60   VAL (MON_3),
61   VAL (MON_4),
62   VAL (MON_5),
63   VAL (MON_6),
64   VAL (MON_7),
65   VAL (MON_8),
66   VAL (MON_9),
67   VAL (MON_DECIMAL_POINT),
68   VAL (MON_GROUPING),
69   VAL (MON_THOUSANDS_SEP),
70   VAL (NEGATIVE_SIGN),
71   VAL (NOEXPR),
72   VAL (NOSTR),
73   VAL (N_CS_PRECEDES),
74   VAL (N_SEP_BY_SPACE),
75   VAL (N_SIGN_POSN),
76   VAL (PM_STR),
77   VAL (POSITIVE_SIGN),
78   VAL (P_CS_PRECEDES),
79   VAL (P_SEP_BY_SPACE),
80   VAL (P_SIGN_POSN),
81   VAL (RADIXCHAR),
82   VAL (THOUSANDS_SEP),
83   VAL (THOUSEP),
84   VAL (T_FMT),
85   VAL (T_FMT_AMPM),
86   VAL (YESEXPR),
87   VAL (YESSTR)
88 };
89
90
91 static int
92 map_paramstr (const char *str)
93 {
94   int low = 0;
95   int high = sizeof (map) / sizeof (map[0]);
96
97   while (low < high)
98     {
99       int med = (low + high) / 2;
100       int cmpres;
101
102       cmpres = strcmp (str, map[med].str);
103       if (cmpres == 0)
104         return map[med].val;
105       else if (cmpres > 0)
106         low = med + 1;
107       else
108         high = med;
109     }
110
111   return -1;
112 }
113
114
115 #ifdef DEBUG
116 # define REASON(str) printf ("\"%s\" ignored: %s\n", buf, str)
117 #else
118 # define REASON(str)
119 #endif
120
121 int
122 main (void)
123 {
124   int result = 0;
125
126   while (! feof (stdin))
127     {
128       char buf[1000];
129       char *rp;
130       char *locale;
131       char *paramstr;
132       char *expected;
133       char *actual;
134       int param;
135
136       if (fgets (buf, sizeof (buf), stdin) == NULL)
137         break;
138
139       /* Split the fields.   There are three is them:
140          1. locale
141          2. langinfo() parameter
142          3. expected result; this can be a string with white space etc.
143       */
144       rp = buf;
145       while (*rp == ' ' || *rp == '\t')
146         ++rp;
147
148       if  (*rp == '#')
149         {
150           /* It's a comment line.  Ignore it.  */
151           REASON ("comment");
152           continue;
153         }
154       locale = rp;
155
156       while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n')
157         ++rp;
158       if (*rp == '\0' || *rp == '\n')
159         {
160           /* Incomplete line.  */
161           REASON ("incomplete line");
162           continue;
163         }
164       *rp++ = '\0';
165
166       while (*rp == ' ' || *rp == '\t')
167         ++rp;
168       paramstr = rp;
169
170       while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n')
171         ++rp;
172       if (*rp == '\0' || *rp == '\n')
173         {
174           /* Incomplete line.  */
175           REASON ("incomplete line");
176           continue;
177         }
178       *rp++ = '\0';
179
180       while (*rp == ' ' || *rp == '\t')
181         ++rp;
182
183       if (*rp == '"')
184         {
185           char *wp;
186
187           expected = wp = ++rp;
188           while (*rp != '"' && *rp != '\n' && *rp != '\0')
189             {
190               if (*rp == '\\')
191                 {
192                   ++rp;
193                   if (*rp == '\0')
194                     break;
195                   if (*rp >= '\0' && *rp <= 'p')
196                     {
197                       int val = *rp - '0';
198                       if (rp[1] >= '0' && rp[1] <= '9')
199                         {
200                           ++rp;
201                           val *= 10;
202                           val += *rp - '0';
203                           if (rp[1] >= '0' && rp[1] <= '9')
204                             {
205                               ++rp;
206                               val *= 10;
207                               val += *rp - '0';
208                             }
209                         }
210                       *rp = val;
211                     }
212                 }
213               *wp++ = *rp++;
214             }
215
216           if (*rp != '"')
217             {
218               REASON ("missing '\"'");
219               continue;
220             }
221
222           *wp = '\0';
223         }
224       else
225         {
226           expected = rp;
227           while (*rp != '\0' && *rp != '\n')
228             ++rp;
229           *rp = '\0';
230         }
231
232       param = map_paramstr (paramstr);
233       if (param == -1)
234         {
235           /* Invalid parameter.  */
236           REASON ("invalid parameter");
237           continue;
238         }
239
240       /* Set the locale and check whether it worked.  */
241       printf ("LC_ALL=%s nl_langinfo(%s)", locale, paramstr);
242       setlocale (LC_ALL, locale);
243       if (strcmp (locale, setlocale (LC_ALL, NULL)) != 0)
244         {
245           puts (": failed to set locale");
246           result = 1;
247           continue;
248         }
249
250       actual = nl_langinfo (param);
251       printf (" = \"%s\", ", actual);
252
253       if (strcmp (actual, expected) == 0)
254         puts ("OK");
255       else
256         {
257           printf ("FAILED (expected: %s)\n", expected);
258           result = 1;
259         }
260     }
261
262   return result;
263 }