]>
Commit | Line | Data |
---|---|---|
16093625 | 1 | /* Test program for nl_langinfo() function. |
b168057a | 2 | Copyright (C) 2000-2015 Free Software Foundation, Inc. |
16093625 UD |
3 | This file is part of the GNU C Library. |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
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. | |
16093625 UD |
10 | |
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 | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
16093625 | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
16093625 | 19 | |
f79d99cb UD |
20 | #include <langinfo.h> |
21 | #include <locale.h> | |
22 | #include <stdio.h> | |
f1e09846 | 23 | #include <string.h> |
f79d99cb UD |
24 | |
25 | ||
26 | struct map | |
27 | { | |
28 | const char *str; | |
29 | int val; | |
30 | } map[] = | |
31 | { | |
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) | |
108 | }; | |
109 | ||
110 | ||
111 | static int | |
112 | map_paramstr (const char *str) | |
113 | { | |
114 | int low = 0; | |
115 | int high = sizeof (map) / sizeof (map[0]); | |
116 | ||
117 | while (low < high) | |
118 | { | |
119 | int med = (low + high) / 2; | |
120 | int cmpres; | |
121 | ||
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; | |
129 | } | |
130 | ||
131 | return -1; | |
132 | } | |
133 | ||
134 | ||
135 | #ifdef DEBUG | |
136 | # define REASON(str) printf ("\"%s\" ignored: %s\n", buf, str) | |
137 | #else | |
138 | # define REASON(str) | |
139 | #endif | |
140 | ||
141 | int | |
142 | main (void) | |
143 | { | |
144 | int result = 0; | |
145 | ||
146 | while (! feof (stdin)) | |
147 | { | |
148 | char buf[1000]; | |
149 | char *rp; | |
150 | char *locale; | |
151 | char *paramstr; | |
152 | char *expected; | |
153 | char *actual; | |
154 | int param; | |
155 | ||
156 | if (fgets (buf, sizeof (buf), stdin) == NULL) | |
157 | break; | |
158 | ||
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. | |
163 | */ | |
164 | rp = buf; | |
165 | while (*rp == ' ' || *rp == '\t') | |
166 | ++rp; | |
167 | ||
168 | if (*rp == '#') | |
169 | { | |
170 | /* It's a comment line. Ignore it. */ | |
171 | REASON ("comment"); | |
172 | continue; | |
173 | } | |
174 | locale = rp; | |
175 | ||
176 | while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n') | |
177 | ++rp; | |
178 | if (*rp == '\0' || *rp == '\n') | |
179 | { | |
180 | /* Incomplete line. */ | |
181 | REASON ("incomplete line"); | |
182 | continue; | |
183 | } | |
184 | *rp++ = '\0'; | |
185 | ||
186 | while (*rp == ' ' || *rp == '\t') | |
187 | ++rp; | |
188 | paramstr = rp; | |
189 | ||
190 | while (*rp != '\0' && *rp != ' ' && *rp != '\t' && *rp != '\n') | |
191 | ++rp; | |
192 | if (*rp == '\0' || *rp == '\n') | |
193 | { | |
194 | /* Incomplete line. */ | |
195 | REASON ("incomplete line"); | |
196 | continue; | |
197 | } | |
198 | *rp++ = '\0'; | |
199 | ||
200 | while (*rp == ' ' || *rp == '\t') | |
201 | ++rp; | |
202 | ||
203 | if (*rp == '"') | |
204 | { | |
205 | char *wp; | |
206 | ||
207 | expected = wp = ++rp; | |
208 | while (*rp != '"' && *rp != '\n' && *rp != '\0') | |
209 | { | |
210 | if (*rp == '\\') | |
211 | { | |
212 | ++rp; | |
213 | if (*rp == '\0') | |
214 | break; | |
a9706118 | 215 | if (*rp >= '0' && *rp <= '9') |
f79d99cb UD |
216 | { |
217 | int val = *rp - '0'; | |
218 | if (rp[1] >= '0' && rp[1] <= '9') | |
219 | { | |
220 | ++rp; | |
221 | val *= 10; | |
222 | val += *rp - '0'; | |
223 | if (rp[1] >= '0' && rp[1] <= '9') | |
224 | { | |
225 | ++rp; | |
226 | val *= 10; | |
227 | val += *rp - '0'; | |
228 | } | |
229 | } | |
230 | *rp = val; | |
231 | } | |
232 | } | |
233 | *wp++ = *rp++; | |
234 | } | |
235 | ||
236 | if (*rp != '"') | |
237 | { | |
238 | REASON ("missing '\"'"); | |
239 | continue; | |
240 | } | |
241 | ||
242 | *wp = '\0'; | |
243 | } | |
244 | else | |
245 | { | |
246 | expected = rp; | |
247 | while (*rp != '\0' && *rp != '\n') | |
248 | ++rp; | |
249 | *rp = '\0'; | |
250 | } | |
251 | ||
252 | param = map_paramstr (paramstr); | |
253 | if (param == -1) | |
254 | { | |
255 | /* Invalid parameter. */ | |
256 | REASON ("invalid parameter"); | |
257 | continue; | |
258 | } | |
259 | ||
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) | |
264 | { | |
265 | puts (": failed to set locale"); | |
266 | result = 1; | |
267 | continue; | |
268 | } | |
269 | ||
270 | actual = nl_langinfo (param); | |
271 | printf (" = \"%s\", ", actual); | |
272 | ||
273 | if (strcmp (actual, expected) == 0) | |
274 | puts ("OK"); | |
275 | else | |
276 | { | |
277 | printf ("FAILED (expected: %s)\n", expected); | |
278 | result = 1; | |
279 | } | |
280 | } | |
281 | ||
282 | return result; | |
283 | } |