Clean up __exit_thread.
[glibc.git] / localedata / tst-langinfo.c
blobb3806ff119ba4947c96f5a675fa9d6126b4fd374
1 /* Test program for nl_langinfo() function.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 #include <langinfo.h>
21 #include <locale.h>
22 #include <stdio.h>
23 #include <string.h>
26 struct map
28 const char *str;
29 int val;
30 } map[] =
32 #define VAL(name) { #name, name }
33 VAL (ABDAY_1),
34 VAL (ABDAY_2),
35 VAL (ABDAY_3),
36 VAL (ABDAY_4),
37 VAL (ABDAY_5),
38 VAL (ABDAY_6),
39 VAL (ABDAY_7),
40 VAL (ABMON_1),
41 VAL (ABMON_10),
42 VAL (ABMON_11),
43 VAL (ABMON_12),
44 VAL (ABMON_2),
45 VAL (ABMON_3),
46 VAL (ABMON_4),
47 VAL (ABMON_5),
48 VAL (ABMON_6),
49 VAL (ABMON_7),
50 VAL (ABMON_8),
51 VAL (ABMON_9),
52 VAL (ALT_DIGITS),
53 VAL (AM_STR),
54 VAL (CRNCYSTR),
55 VAL (CURRENCY_SYMBOL),
56 VAL (DAY_1),
57 VAL (DAY_2),
58 VAL (DAY_3),
59 VAL (DAY_4),
60 VAL (DAY_5),
61 VAL (DAY_6),
62 VAL (DAY_7),
63 VAL (DECIMAL_POINT),
64 VAL (D_FMT),
65 VAL (D_T_FMT),
66 VAL (ERA),
67 VAL (ERA_D_FMT),
68 VAL (ERA_D_T_FMT),
69 VAL (ERA_T_FMT),
70 VAL (ERA_YEAR),
71 VAL (FRAC_DIGITS),
72 VAL (GROUPING),
73 VAL (INT_CURR_SYMBOL),
74 VAL (INT_FRAC_DIGITS),
75 VAL (MON_1),
76 VAL (MON_10),
77 VAL (MON_11),
78 VAL (MON_12),
79 VAL (MON_2),
80 VAL (MON_3),
81 VAL (MON_4),
82 VAL (MON_5),
83 VAL (MON_6),
84 VAL (MON_7),
85 VAL (MON_8),
86 VAL (MON_9),
87 VAL (MON_DECIMAL_POINT),
88 VAL (MON_GROUPING),
89 VAL (MON_THOUSANDS_SEP),
90 VAL (NEGATIVE_SIGN),
91 VAL (NOEXPR),
92 VAL (NOSTR),
93 VAL (N_CS_PRECEDES),
94 VAL (N_SEP_BY_SPACE),
95 VAL (N_SIGN_POSN),
96 VAL (PM_STR),
97 VAL (POSITIVE_SIGN),
98 VAL (P_CS_PRECEDES),
99 VAL (P_SEP_BY_SPACE),
100 VAL (P_SIGN_POSN),
101 VAL (RADIXCHAR),
102 VAL (THOUSANDS_SEP),
103 VAL (THOUSEP),
104 VAL (T_FMT),
105 VAL (T_FMT_AMPM),
106 VAL (YESEXPR),
107 VAL (YESSTR)
111 static int
112 map_paramstr (const char *str)
114 int low = 0;
115 int high = sizeof (map) / sizeof (map[0]);
117 while (low < high)
119 int med = (low + high) / 2;
120 int cmpres;
122 cmpres = strcmp (str, map[med].str);
123 if (cmpres == 0)
124 return map[med].val;
125 else if (cmpres > 0)
126 low = med + 1;
127 else
128 high = med;
131 return -1;
135 #ifdef DEBUG
136 # define REASON(str) printf ("\"%s\" ignored: %s\n", buf, str)
137 #else
138 # define REASON(str)
139 #endif
142 main (void)
144 int result = 0;
146 while (! feof (stdin))
148 char buf[1000];
149 char *rp;
150 char *locale;
151 char *paramstr;
152 char *expected;
153 char *actual;
154 int param;
156 if (fgets (buf, sizeof (buf), stdin) == NULL)
157 break;
159 /* Split the fields. There are three is them:
160 1. locale
161 2. langinfo() parameter
162 3. expected result; this can be a string with white space etc.
164 rp = buf;
165 while (*rp == ' ' || *rp == '\t')
166 ++rp;
168 if (*rp == '#')
170 /* It's a comment line. Ignore it. */
171 REASON ("comment");
172 continue;
174 locale = rp;
176 while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n')
177 ++rp;
178 if (*rp == '\0' || *rp == '\n')
180 /* Incomplete line. */
181 REASON ("incomplete line");
182 continue;
184 *rp++ = '\0';
186 while (*rp == ' ' || *rp == '\t')
187 ++rp;
188 paramstr = rp;
190 while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n')
191 ++rp;
192 if (*rp == '\0' || *rp == '\n')
194 /* Incomplete line. */
195 REASON ("incomplete line");
196 continue;
198 *rp++ = '\0';
200 while (*rp == ' ' || *rp == '\t')
201 ++rp;
203 if (*rp == '"')
205 char *wp;
207 expected = wp = ++rp;
208 while (*rp != '"' && *rp != '\n' && *rp != '\0')
210 if (*rp == '\\')
212 ++rp;
213 if (*rp == '\0')
214 break;
215 if (*rp >= '0' && *rp <= '9')
217 int val = *rp - '0';
218 if (rp[1] >= '0' && rp[1] <= '9')
220 ++rp;
221 val *= 10;
222 val += *rp - '0';
223 if (rp[1] >= '0' && rp[1] <= '9')
225 ++rp;
226 val *= 10;
227 val += *rp - '0';
230 *rp = val;
233 *wp++ = *rp++;
236 if (*rp != '"')
238 REASON ("missing '\"'");
239 continue;
242 *wp = '\0';
244 else
246 expected = rp;
247 while (*rp != '\0' && *rp != '\n')
248 ++rp;
249 *rp = '\0';
252 param = map_paramstr (paramstr);
253 if (param == -1)
255 /* Invalid parameter. */
256 REASON ("invalid parameter");
257 continue;
260 /* Set the locale and check whether it worked. */
261 printf ("LC_ALL=%s nl_langinfo(%s)", locale, paramstr);
262 setlocale (LC_ALL, locale);
263 if (strcmp (locale, setlocale (LC_ALL, NULL)) != 0)
265 puts (": failed to set locale");
266 result = 1;
267 continue;
270 actual = nl_langinfo (param);
271 printf (" = \"%s\", ", actual);
273 if (strcmp (actual, expected) == 0)
274 puts ("OK");
275 else
277 printf ("FAILED (expected: %s)\n", expected);
278 result = 1;
282 return result;