1 /* Test that C/POSIX and C.UTF-8 are consistent.
2    Copyright (C) 2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include <langinfo.h>
20 #include <locale.h>
21 #include <stdbool.h>
22 #include <stdio.h>
23 #include <support/check.h>
24 
25 /* Initialized by do_test using newlocale.  */
26 static locale_t c_utf8;
27 
28 /* Set to true for second pass.  */
29 static bool use_nl_langinfo_l;
30 
31 static void
switch_to_c(void)32 switch_to_c (void)
33 {
34   if (setlocale (LC_ALL, "C") == NULL)
35     FAIL_EXIT1 ("setlocale (LC_ALL, \"C\")");
36 }
37 
38 static void
switch_to_c_utf8(void)39 switch_to_c_utf8 (void)
40 {
41   if (setlocale (LC_ALL, "C.UTF-8") == NULL)
42     FAIL_EXIT1 ("setlocale (LC_ALL, \"C.UTF-8\")");
43 }
44 
45 static char *
str(nl_item item)46 str (nl_item item)
47 {
48   if (!use_nl_langinfo_l)
49     switch_to_c  ();
50   return nl_langinfo (item);
51 }
52 
53 static char *
str_utf8(nl_item item)54 str_utf8 (nl_item item)
55 {
56   if (use_nl_langinfo_l)
57     return nl_langinfo_l (item, c_utf8);
58   else
59     {
60       switch_to_c_utf8  ();
61       return nl_langinfo (item);
62     }
63 }
64 
65 static wchar_t *
wstr(nl_item item)66 wstr (nl_item item)
67 {
68   return (wchar_t *) str (item);
69 }
70 
71 static wchar_t *
wstr_utf8(nl_item item)72 wstr_utf8 (nl_item item)
73 {
74   return (wchar_t *) str_utf8 (item);
75 }
76 
77 static int
byte(nl_item item)78 byte (nl_item item)
79 {
80   return (signed char) *str (item);
81 }
82 
83 static int
byte_utf8(nl_item item)84 byte_utf8 (nl_item item)
85 {
86   return (signed char) *str_utf8 (item);
87 }
88 
89 static int
word(nl_item item)90 word (nl_item item)
91 {
92   union
93   {
94     char *ptr;
95     int word;
96   } u;
97   u.ptr = str (item);
98   return u.word;
99 }
100 
101 static int
word_utf8(nl_item item)102 word_utf8 (nl_item item)
103 {
104   union
105   {
106     char *ptr;
107     int word;
108   } u;
109   u.ptr = str_utf8 (item);
110   return u.word;
111 }
112 
113 static void
one_pass(void)114 one_pass (void)
115 {
116   /* LC_TIME.  */
117   TEST_COMPARE_STRING (str (ABDAY_1), str_utf8 (ABDAY_1));
118   TEST_COMPARE_STRING (str (ABDAY_2), str_utf8 (ABDAY_2));
119   TEST_COMPARE_STRING (str (ABDAY_3), str_utf8 (ABDAY_3));
120   TEST_COMPARE_STRING (str (ABDAY_4), str_utf8 (ABDAY_4));
121   TEST_COMPARE_STRING (str (ABDAY_5), str_utf8 (ABDAY_5));
122   TEST_COMPARE_STRING (str (ABDAY_6), str_utf8 (ABDAY_6));
123   TEST_COMPARE_STRING (str (ABDAY_7), str_utf8 (ABDAY_7));
124 
125   TEST_COMPARE_STRING (str (DAY_1), str_utf8 (DAY_1));
126   TEST_COMPARE_STRING (str (DAY_2), str_utf8 (DAY_2));
127   TEST_COMPARE_STRING (str (DAY_3), str_utf8 (DAY_3));
128   TEST_COMPARE_STRING (str (DAY_4), str_utf8 (DAY_4));
129   TEST_COMPARE_STRING (str (DAY_5), str_utf8 (DAY_5));
130   TEST_COMPARE_STRING (str (DAY_6), str_utf8 (DAY_6));
131   TEST_COMPARE_STRING (str (DAY_7), str_utf8 (DAY_7));
132 
133   TEST_COMPARE_STRING (str (ABMON_1), str_utf8 (ABMON_1));
134   TEST_COMPARE_STRING (str (ABMON_2), str_utf8 (ABMON_2));
135   TEST_COMPARE_STRING (str (ABMON_3), str_utf8 (ABMON_3));
136   TEST_COMPARE_STRING (str (ABMON_4), str_utf8 (ABMON_4));
137   TEST_COMPARE_STRING (str (ABMON_5), str_utf8 (ABMON_5));
138   TEST_COMPARE_STRING (str (ABMON_6), str_utf8 (ABMON_6));
139   TEST_COMPARE_STRING (str (ABMON_7), str_utf8 (ABMON_7));
140   TEST_COMPARE_STRING (str (ABMON_8), str_utf8 (ABMON_8));
141   TEST_COMPARE_STRING (str (ABMON_9), str_utf8 (ABMON_9));
142   TEST_COMPARE_STRING (str (ABMON_10), str_utf8 (ABMON_10));
143   TEST_COMPARE_STRING (str (ABMON_11), str_utf8 (ABMON_11));
144   TEST_COMPARE_STRING (str (ABMON_12), str_utf8 (ABMON_12));
145 
146   TEST_COMPARE_STRING (str (MON_1), str_utf8 (MON_1));
147   TEST_COMPARE_STRING (str (MON_2), str_utf8 (MON_2));
148   TEST_COMPARE_STRING (str (MON_3), str_utf8 (MON_3));
149   TEST_COMPARE_STRING (str (MON_4), str_utf8 (MON_4));
150   TEST_COMPARE_STRING (str (MON_5), str_utf8 (MON_5));
151   TEST_COMPARE_STRING (str (MON_6), str_utf8 (MON_6));
152   TEST_COMPARE_STRING (str (MON_7), str_utf8 (MON_7));
153   TEST_COMPARE_STRING (str (MON_8), str_utf8 (MON_8));
154   TEST_COMPARE_STRING (str (MON_9), str_utf8 (MON_9));
155   TEST_COMPARE_STRING (str (MON_10), str_utf8 (MON_10));
156   TEST_COMPARE_STRING (str (MON_11), str_utf8 (MON_11));
157   TEST_COMPARE_STRING (str (MON_12), str_utf8 (MON_12));
158 
159   TEST_COMPARE_STRING (str (AM_STR), str_utf8 (AM_STR));
160   TEST_COMPARE_STRING (str (PM_STR), str_utf8 (PM_STR));
161 
162   TEST_COMPARE_STRING (str (D_T_FMT), str_utf8 (D_T_FMT));
163   TEST_COMPARE_STRING (str (D_FMT), str_utf8 (D_FMT));
164   TEST_COMPARE_STRING (str (T_FMT), str_utf8 (T_FMT));
165   TEST_COMPARE_STRING (str (T_FMT_AMPM),
166                        str_utf8 (T_FMT_AMPM));
167 
168   TEST_COMPARE_STRING (str (ERA), str_utf8 (ERA));
169   TEST_COMPARE_STRING (str (ERA_YEAR), str_utf8 (ERA_YEAR));
170   TEST_COMPARE_STRING (str (ERA_D_FMT), str_utf8 (ERA_D_FMT));
171   TEST_COMPARE_STRING (str (ALT_DIGITS), str_utf8 (ALT_DIGITS));
172   TEST_COMPARE_STRING (str (ERA_D_T_FMT), str_utf8 (ERA_D_T_FMT));
173   TEST_COMPARE_STRING (str (ERA_T_FMT), str_utf8 (ERA_T_FMT));
174   TEST_COMPARE (word (_NL_TIME_ERA_NUM_ENTRIES),
175                 word_utf8 (_NL_TIME_ERA_NUM_ENTRIES));
176   /* No array elements, so nothing to compare for _NL_TIME_ERA_ENTRIES.  */
177   TEST_COMPARE (word (_NL_TIME_ERA_NUM_ENTRIES), 0);
178 
179   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_1), wstr_utf8 (_NL_WABDAY_1));
180   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_2), wstr_utf8 (_NL_WABDAY_2));
181   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_3), wstr_utf8 (_NL_WABDAY_3));
182   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_4), wstr_utf8 (_NL_WABDAY_4));
183   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_5), wstr_utf8 (_NL_WABDAY_5));
184   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_6), wstr_utf8 (_NL_WABDAY_6));
185   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABDAY_7), wstr_utf8 (_NL_WABDAY_7));
186 
187   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_1), wstr_utf8 (_NL_WDAY_1));
188   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_2), wstr_utf8 (_NL_WDAY_2));
189   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_3), wstr_utf8 (_NL_WDAY_3));
190   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_4), wstr_utf8 (_NL_WDAY_4));
191   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_5), wstr_utf8 (_NL_WDAY_5));
192   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_6), wstr_utf8 (_NL_WDAY_6));
193   TEST_COMPARE_STRING_WIDE (wstr (_NL_WDAY_7), wstr_utf8 (_NL_WDAY_7));
194 
195   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_1), wstr_utf8 (_NL_WABMON_1));
196   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_2), wstr_utf8 (_NL_WABMON_2));
197   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_3), wstr_utf8 (_NL_WABMON_3));
198   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_4), wstr_utf8 (_NL_WABMON_4));
199   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_5), wstr_utf8 (_NL_WABMON_5));
200   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_6), wstr_utf8 (_NL_WABMON_6));
201   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_7), wstr_utf8 (_NL_WABMON_7));
202   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_8), wstr_utf8 (_NL_WABMON_8));
203   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_9), wstr_utf8 (_NL_WABMON_9));
204   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_10), wstr_utf8 (_NL_WABMON_10));
205   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_11), wstr_utf8 (_NL_WABMON_11));
206   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABMON_12), wstr_utf8 (_NL_WABMON_12));
207 
208   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_1), wstr_utf8 (_NL_WMON_1));
209   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_2), wstr_utf8 (_NL_WMON_2));
210   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_3), wstr_utf8 (_NL_WMON_3));
211   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_4), wstr_utf8 (_NL_WMON_4));
212   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_5), wstr_utf8 (_NL_WMON_5));
213   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_6), wstr_utf8 (_NL_WMON_6));
214   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_7), wstr_utf8 (_NL_WMON_7));
215   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_8), wstr_utf8 (_NL_WMON_8));
216   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_9), wstr_utf8 (_NL_WMON_9));
217   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_10), wstr_utf8 (_NL_WMON_10));
218   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_11), wstr_utf8 (_NL_WMON_11));
219   TEST_COMPARE_STRING_WIDE (wstr (_NL_WMON_12), wstr_utf8 (_NL_WMON_12));
220 
221   TEST_COMPARE_STRING_WIDE (wstr (_NL_WAM_STR), wstr_utf8 (_NL_WAM_STR));
222   TEST_COMPARE_STRING_WIDE (wstr (_NL_WPM_STR), wstr_utf8 (_NL_WPM_STR));
223 
224   TEST_COMPARE_STRING_WIDE (wstr (_NL_WD_T_FMT), wstr_utf8 (_NL_WD_T_FMT));
225   TEST_COMPARE_STRING_WIDE (wstr (_NL_WD_FMT), wstr_utf8 (_NL_WD_FMT));
226   TEST_COMPARE_STRING_WIDE (wstr (_NL_WT_FMT), wstr_utf8 (_NL_WT_FMT));
227   TEST_COMPARE_STRING_WIDE (wstr (_NL_WT_FMT_AMPM),
228                             wstr_utf8 (_NL_WT_FMT_AMPM));
229 
230   TEST_COMPARE_STRING_WIDE (wstr (_NL_WERA_YEAR), wstr_utf8 (_NL_WERA_YEAR));
231   TEST_COMPARE_STRING_WIDE (wstr (_NL_WERA_D_FMT), wstr_utf8 (_NL_WERA_D_FMT));
232   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALT_DIGITS),
233                             wstr_utf8 (_NL_WALT_DIGITS));
234   TEST_COMPARE_STRING_WIDE (wstr (_NL_WERA_D_T_FMT),
235                             wstr_utf8 (_NL_WERA_D_T_FMT));
236   TEST_COMPARE_STRING_WIDE (wstr (_NL_WERA_T_FMT), wstr_utf8 (_NL_WERA_T_FMT));
237 
238   /* This is somewhat inconsistent, but see locale/categories.def.  */
239   TEST_COMPARE (byte (_NL_TIME_WEEK_NDAYS), byte_utf8 (_NL_TIME_WEEK_NDAYS));
240   TEST_COMPARE (word (_NL_TIME_WEEK_1STDAY),
241                 word_utf8 (_NL_TIME_WEEK_1STDAY));
242   TEST_COMPARE (byte (_NL_TIME_WEEK_1STWEEK),
243                 byte_utf8 (_NL_TIME_WEEK_1STWEEK));
244   TEST_COMPARE (byte (_NL_TIME_FIRST_WEEKDAY),
245                 byte_utf8 (_NL_TIME_FIRST_WEEKDAY));
246   TEST_COMPARE (byte (_NL_TIME_FIRST_WORKDAY),
247                 byte_utf8 (_NL_TIME_FIRST_WORKDAY));
248   TEST_COMPARE (byte (_NL_TIME_CAL_DIRECTION),
249                 byte_utf8 (_NL_TIME_CAL_DIRECTION));
250   TEST_COMPARE_STRING (str (_NL_TIME_TIMEZONE), str_utf8 (_NL_TIME_TIMEZONE));
251 
252   TEST_COMPARE_STRING (str (_DATE_FMT), str_utf8 (_DATE_FMT));
253   TEST_COMPARE_STRING_WIDE (wstr (_NL_W_DATE_FMT), wstr_utf8 (_NL_W_DATE_FMT));
254 
255   /* Expected difference.  */
256   TEST_COMPARE_STRING (str (_NL_TIME_CODESET), "ANSI_X3.4-1968");
257   TEST_COMPARE_STRING (str_utf8 (_NL_TIME_CODESET), "UTF-8");
258 
259   TEST_COMPARE_STRING (str (ALTMON_1), str_utf8 (ALTMON_1));
260   TEST_COMPARE_STRING (str (ALTMON_2), str_utf8 (ALTMON_2));
261   TEST_COMPARE_STRING (str (ALTMON_3), str_utf8 (ALTMON_3));
262   TEST_COMPARE_STRING (str (ALTMON_4), str_utf8 (ALTMON_4));
263   TEST_COMPARE_STRING (str (ALTMON_5), str_utf8 (ALTMON_5));
264   TEST_COMPARE_STRING (str (ALTMON_6), str_utf8 (ALTMON_6));
265   TEST_COMPARE_STRING (str (ALTMON_7), str_utf8 (ALTMON_7));
266   TEST_COMPARE_STRING (str (ALTMON_8), str_utf8 (ALTMON_8));
267   TEST_COMPARE_STRING (str (ALTMON_9), str_utf8 (ALTMON_9));
268   TEST_COMPARE_STRING (str (ALTMON_10), str_utf8 (ALTMON_10));
269   TEST_COMPARE_STRING (str (ALTMON_11), str_utf8 (ALTMON_11));
270   TEST_COMPARE_STRING (str (ALTMON_12), str_utf8 (ALTMON_12));
271 
272   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_1), wstr_utf8 (_NL_WALTMON_1));
273   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_2), wstr_utf8 (_NL_WALTMON_2));
274   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_3), wstr_utf8 (_NL_WALTMON_3));
275   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_4), wstr_utf8 (_NL_WALTMON_4));
276   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_5), wstr_utf8 (_NL_WALTMON_5));
277   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_6), wstr_utf8 (_NL_WALTMON_6));
278   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_7), wstr_utf8 (_NL_WALTMON_7));
279   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_8), wstr_utf8 (_NL_WALTMON_8));
280   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_9), wstr_utf8 (_NL_WALTMON_9));
281   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_10), wstr_utf8 (_NL_WALTMON_10));
282   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_11), wstr_utf8 (_NL_WALTMON_11));
283   TEST_COMPARE_STRING_WIDE (wstr (_NL_WALTMON_12), wstr_utf8 (_NL_WALTMON_12));
284 
285   TEST_COMPARE_STRING (str (_NL_ABALTMON_1), str_utf8 (_NL_ABALTMON_1));
286   TEST_COMPARE_STRING (str (_NL_ABALTMON_2), str_utf8 (_NL_ABALTMON_2));
287   TEST_COMPARE_STRING (str (_NL_ABALTMON_3), str_utf8 (_NL_ABALTMON_3));
288   TEST_COMPARE_STRING (str (_NL_ABALTMON_4), str_utf8 (_NL_ABALTMON_4));
289   TEST_COMPARE_STRING (str (_NL_ABALTMON_5), str_utf8 (_NL_ABALTMON_5));
290   TEST_COMPARE_STRING (str (_NL_ABALTMON_6), str_utf8 (_NL_ABALTMON_6));
291   TEST_COMPARE_STRING (str (_NL_ABALTMON_7), str_utf8 (_NL_ABALTMON_7));
292   TEST_COMPARE_STRING (str (_NL_ABALTMON_8), str_utf8 (_NL_ABALTMON_8));
293   TEST_COMPARE_STRING (str (_NL_ABALTMON_9), str_utf8 (_NL_ABALTMON_9));
294   TEST_COMPARE_STRING (str (_NL_ABALTMON_10), str_utf8 (_NL_ABALTMON_10));
295   TEST_COMPARE_STRING (str (_NL_ABALTMON_11), str_utf8 (_NL_ABALTMON_11));
296   TEST_COMPARE_STRING (str (_NL_ABALTMON_12), str_utf8 (_NL_ABALTMON_12));
297 
298   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_1),
299                             wstr_utf8 (_NL_WABALTMON_1));
300   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_2),
301                             wstr_utf8 (_NL_WABALTMON_2));
302   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_3),
303                             wstr_utf8 (_NL_WABALTMON_3));
304   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_4),
305                             wstr_utf8 (_NL_WABALTMON_4));
306   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_5),
307                             wstr_utf8 (_NL_WABALTMON_5));
308   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_6),
309                             wstr_utf8 (_NL_WABALTMON_6));
310   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_7),
311                             wstr_utf8 (_NL_WABALTMON_7));
312   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_8),
313                             wstr_utf8 (_NL_WABALTMON_8));
314   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_9),
315                             wstr_utf8 (_NL_WABALTMON_9));
316   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_10),
317                             wstr_utf8 (_NL_WABALTMON_10));
318   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_11),
319                             wstr_utf8 (_NL_WABALTMON_11));
320   TEST_COMPARE_STRING_WIDE (wstr (_NL_WABALTMON_12),
321                             wstr_utf8 (_NL_WABALTMON_12));
322 
323   /* LC_COLLATE.  Mostly untested, only expected differences.  */
324   TEST_COMPARE_STRING (str (_NL_COLLATE_CODESET), "ANSI_X3.4-1968");
325   TEST_COMPARE_STRING (str_utf8 (_NL_COLLATE_CODESET), "UTF-8");
326 
327   /* LC_CTYPE.  Mostly untested, only expected differences.  */
328   TEST_COMPARE_STRING (str (CODESET), "ANSI_X3.4-1968");
329   TEST_COMPARE_STRING (str_utf8 (CODESET), "UTF-8");
330 
331   /* LC_MONETARY.  */
332   TEST_COMPARE_STRING (str (INT_CURR_SYMBOL), str_utf8 (INT_CURR_SYMBOL));
333   TEST_COMPARE_STRING (str (CURRENCY_SYMBOL), str_utf8 (CURRENCY_SYMBOL));
334   TEST_COMPARE_STRING (str (MON_DECIMAL_POINT), str_utf8 (MON_DECIMAL_POINT));
335   TEST_COMPARE_STRING (str (MON_THOUSANDS_SEP), str_utf8 (MON_THOUSANDS_SEP));
336   TEST_COMPARE_STRING (str (MON_GROUPING), str_utf8 (MON_GROUPING));
337   TEST_COMPARE_STRING (str (POSITIVE_SIGN), str_utf8 (POSITIVE_SIGN));
338   TEST_COMPARE_STRING (str (NEGATIVE_SIGN), str_utf8 (NEGATIVE_SIGN));
339   TEST_COMPARE (byte (INT_FRAC_DIGITS), byte_utf8 (INT_FRAC_DIGITS));
340   TEST_COMPARE (byte (FRAC_DIGITS), byte_utf8 (FRAC_DIGITS));
341   TEST_COMPARE (byte (P_CS_PRECEDES), byte_utf8 (P_CS_PRECEDES));
342   TEST_COMPARE (byte (P_SEP_BY_SPACE), byte_utf8 (P_SEP_BY_SPACE));
343   TEST_COMPARE (byte (N_CS_PRECEDES), byte_utf8 (N_CS_PRECEDES));
344   TEST_COMPARE (byte (N_SEP_BY_SPACE), byte_utf8 (N_SEP_BY_SPACE));
345   TEST_COMPARE (byte (P_SIGN_POSN), byte_utf8 (P_SIGN_POSN));
346   TEST_COMPARE (byte (N_SIGN_POSN), byte_utf8 (N_SIGN_POSN));
347   TEST_COMPARE_STRING (str (CRNCYSTR), str_utf8 (CRNCYSTR));
348   TEST_COMPARE (byte (INT_P_CS_PRECEDES), byte_utf8 (INT_P_CS_PRECEDES));
349   TEST_COMPARE (byte (INT_P_SEP_BY_SPACE), byte_utf8 (INT_P_SEP_BY_SPACE));
350   TEST_COMPARE (byte (INT_N_CS_PRECEDES), byte_utf8 (INT_N_CS_PRECEDES));
351   TEST_COMPARE (byte (INT_N_SEP_BY_SPACE), byte_utf8 (INT_N_SEP_BY_SPACE));
352   TEST_COMPARE (byte (INT_P_SIGN_POSN), byte_utf8 (INT_P_SIGN_POSN));
353   TEST_COMPARE (byte (INT_N_SIGN_POSN), byte_utf8 (INT_N_SIGN_POSN));
354   TEST_COMPARE_STRING (str (_NL_MONETARY_DUO_INT_CURR_SYMBOL),
355                        str_utf8 (_NL_MONETARY_DUO_INT_CURR_SYMBOL));
356   TEST_COMPARE_STRING (str (_NL_MONETARY_DUO_CURRENCY_SYMBOL),
357                        str_utf8 (_NL_MONETARY_DUO_CURRENCY_SYMBOL));
358   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_FRAC_DIGITS),
359                 byte_utf8 (_NL_MONETARY_DUO_INT_FRAC_DIGITS));
360   TEST_COMPARE (byte (_NL_MONETARY_DUO_FRAC_DIGITS),
361                 byte_utf8 (_NL_MONETARY_DUO_FRAC_DIGITS));
362   TEST_COMPARE (byte (_NL_MONETARY_DUO_P_CS_PRECEDES),
363                 byte_utf8 (_NL_MONETARY_DUO_P_CS_PRECEDES));
364   TEST_COMPARE (byte (_NL_MONETARY_DUO_P_SEP_BY_SPACE),
365                 byte_utf8 (_NL_MONETARY_DUO_P_SEP_BY_SPACE));
366   TEST_COMPARE (byte (_NL_MONETARY_DUO_N_CS_PRECEDES),
367                 byte_utf8 (_NL_MONETARY_DUO_N_CS_PRECEDES));
368   TEST_COMPARE (byte (_NL_MONETARY_DUO_N_SEP_BY_SPACE),
369                 byte_utf8 (_NL_MONETARY_DUO_N_SEP_BY_SPACE));
370   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_P_CS_PRECEDES),
371                 byte_utf8 (_NL_MONETARY_DUO_INT_P_CS_PRECEDES));
372   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_P_SEP_BY_SPACE),
373                 byte_utf8 (_NL_MONETARY_DUO_INT_P_SEP_BY_SPACE));
374   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_N_CS_PRECEDES),
375                 byte_utf8 (_NL_MONETARY_DUO_INT_N_CS_PRECEDES));
376   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_N_SEP_BY_SPACE),
377                 byte_utf8 (_NL_MONETARY_DUO_INT_N_SEP_BY_SPACE));
378   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_P_SIGN_POSN),
379                 byte_utf8 (_NL_MONETARY_DUO_INT_P_SIGN_POSN));
380   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_N_SIGN_POSN),
381                 byte_utf8 (_NL_MONETARY_DUO_INT_N_SIGN_POSN));
382   TEST_COMPARE (byte (_NL_MONETARY_DUO_P_SIGN_POSN),
383                 byte_utf8 (_NL_MONETARY_DUO_P_SIGN_POSN));
384   TEST_COMPARE (byte (_NL_MONETARY_DUO_N_SIGN_POSN),
385                 byte_utf8 (_NL_MONETARY_DUO_N_SIGN_POSN));
386   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_P_SIGN_POSN),
387                 byte_utf8 (_NL_MONETARY_DUO_INT_P_SIGN_POSN));
388   TEST_COMPARE (byte (_NL_MONETARY_DUO_INT_N_SIGN_POSN),
389                 byte_utf8 (_NL_MONETARY_DUO_INT_N_SIGN_POSN));
390   TEST_COMPARE (word (_NL_MONETARY_UNO_VALID_FROM),
391                 word_utf8 (_NL_MONETARY_UNO_VALID_FROM));
392   TEST_COMPARE (word (_NL_MONETARY_UNO_VALID_TO),
393                 word_utf8 (_NL_MONETARY_UNO_VALID_TO));
394   TEST_COMPARE (word (_NL_MONETARY_DUO_VALID_FROM),
395                 word_utf8 (_NL_MONETARY_DUO_VALID_FROM));
396   TEST_COMPARE (word (_NL_MONETARY_DUO_VALID_TO),
397                 word_utf8 (_NL_MONETARY_DUO_VALID_TO));
398   /* _NL_MONETARY_CONVERSION_RATE cannot be tested (word array).  */
399   TEST_COMPARE (word (_NL_MONETARY_DECIMAL_POINT_WC),
400                 word_utf8 (_NL_MONETARY_DECIMAL_POINT_WC));
401   TEST_COMPARE (word (_NL_MONETARY_THOUSANDS_SEP_WC),
402                 word_utf8 (_NL_MONETARY_THOUSANDS_SEP_WC));
403   /* Expected difference.  */
404   TEST_COMPARE_STRING (str (_NL_MONETARY_CODESET), "ANSI_X3.4-1968");
405   TEST_COMPARE_STRING (str_utf8 (_NL_MONETARY_CODESET), "UTF-8");
406 
407   /* LC_NUMERIC.  */
408 
409   TEST_COMPARE_STRING (str (DECIMAL_POINT), str_utf8 (DECIMAL_POINT));
410   TEST_COMPARE_STRING (str (RADIXCHAR), str_utf8 (RADIXCHAR));
411   TEST_COMPARE_STRING (str (THOUSANDS_SEP), str_utf8 (THOUSANDS_SEP));
412   TEST_COMPARE_STRING (str (THOUSEP), str_utf8 (THOUSEP));
413   TEST_COMPARE_STRING (str (GROUPING), str_utf8 (GROUPING));
414   TEST_COMPARE (word (_NL_NUMERIC_DECIMAL_POINT_WC),
415                 word_utf8 (_NL_NUMERIC_DECIMAL_POINT_WC));
416   TEST_COMPARE (word (_NL_NUMERIC_THOUSANDS_SEP_WC),
417                 word_utf8 (_NL_NUMERIC_THOUSANDS_SEP_WC));
418   /* Expected difference.  */
419   TEST_COMPARE_STRING (str (_NL_NUMERIC_CODESET), "ANSI_X3.4-1968");
420   TEST_COMPARE_STRING (str_utf8 (_NL_NUMERIC_CODESET), "UTF-8");
421 
422   /* LC_MESSAGES.  */
423 
424   TEST_COMPARE_STRING (str (YESEXPR), str_utf8 (YESEXPR));
425   TEST_COMPARE_STRING (str (NOEXPR), str_utf8 (NOEXPR));
426   TEST_COMPARE_STRING (str (YESSTR), str_utf8 (YESSTR));
427   TEST_COMPARE_STRING (str (NOSTR), str_utf8 (NOSTR));
428   /* Expected difference.  */
429   TEST_COMPARE_STRING (str (_NL_MESSAGES_CODESET), "ANSI_X3.4-1968");
430   TEST_COMPARE_STRING (str_utf8 (_NL_MESSAGES_CODESET), "UTF-8");
431 
432   /* LC_PAPER.  */
433 
434   TEST_COMPARE (word (_NL_PAPER_HEIGHT), word_utf8 (_NL_PAPER_HEIGHT));
435   TEST_COMPARE (word (_NL_PAPER_WIDTH), word_utf8 (_NL_PAPER_WIDTH));
436   /* Expected difference.  */
437   TEST_COMPARE_STRING (str (_NL_PAPER_CODESET), "ANSI_X3.4-1968");
438   TEST_COMPARE_STRING (str_utf8 (_NL_PAPER_CODESET), "UTF-8");
439 
440   /* LC_NAME.  */
441 
442   TEST_COMPARE_STRING (str (_NL_NAME_NAME_FMT),
443                        str_utf8 (_NL_NAME_NAME_FMT));
444   TEST_COMPARE_STRING (str (_NL_NAME_NAME_GEN),
445                        str_utf8 (_NL_NAME_NAME_GEN));
446   TEST_COMPARE_STRING (str (_NL_NAME_NAME_MR),
447                        str_utf8 (_NL_NAME_NAME_MR));
448   TEST_COMPARE_STRING (str (_NL_NAME_NAME_MRS),
449                        str_utf8 (_NL_NAME_NAME_MRS));
450   TEST_COMPARE_STRING (str (_NL_NAME_NAME_MISS),
451                        str_utf8 (_NL_NAME_NAME_MISS));
452   TEST_COMPARE_STRING (str (_NL_NAME_NAME_MS),
453                        str_utf8 (_NL_NAME_NAME_MS));
454   /* Expected difference.  */
455   TEST_COMPARE_STRING (str (_NL_NAME_CODESET), "ANSI_X3.4-1968");
456   TEST_COMPARE_STRING (str_utf8 (_NL_NAME_CODESET), "UTF-8");
457 
458   /* LC_ADDRESS.  */
459 
460   TEST_COMPARE_STRING (str (_NL_ADDRESS_POSTAL_FMT),
461                        str_utf8 (_NL_ADDRESS_POSTAL_FMT));
462   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_NAME),
463                        str_utf8 (_NL_ADDRESS_COUNTRY_NAME));
464   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_POST),
465                        str_utf8 (_NL_ADDRESS_COUNTRY_POST));
466   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_AB2),
467                        str_utf8 (_NL_ADDRESS_COUNTRY_AB2));
468   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_AB3),
469                        str_utf8 (_NL_ADDRESS_COUNTRY_AB3));
470   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_CAR),
471                        str_utf8 (_NL_ADDRESS_COUNTRY_CAR));
472   TEST_COMPARE (word (_NL_ADDRESS_COUNTRY_NUM),
473                 word_utf8 (_NL_ADDRESS_COUNTRY_NUM));
474   TEST_COMPARE_STRING (str (_NL_ADDRESS_COUNTRY_ISBN),
475                        str_utf8 (_NL_ADDRESS_COUNTRY_ISBN));
476   TEST_COMPARE_STRING (str (_NL_ADDRESS_LANG_NAME),
477                        str_utf8 (_NL_ADDRESS_LANG_NAME));
478   TEST_COMPARE_STRING (str (_NL_ADDRESS_LANG_AB),
479                        str_utf8 (_NL_ADDRESS_LANG_AB));
480   TEST_COMPARE_STRING (str (_NL_ADDRESS_LANG_TERM),
481                        str_utf8 (_NL_ADDRESS_LANG_TERM));
482   TEST_COMPARE_STRING (str (_NL_ADDRESS_LANG_LIB),
483                        str_utf8 (_NL_ADDRESS_LANG_LIB));
484   /* Expected difference.  */
485   TEST_COMPARE_STRING (str (_NL_ADDRESS_CODESET), "ANSI_X3.4-1968");
486   TEST_COMPARE_STRING (str_utf8 (_NL_ADDRESS_CODESET), "UTF-8");
487 
488   /* LC_TELEPHONE.  */
489 
490   TEST_COMPARE_STRING (str (_NL_TELEPHONE_TEL_INT_FMT),
491                        str_utf8 (_NL_TELEPHONE_TEL_INT_FMT));
492   TEST_COMPARE_STRING (str (_NL_TELEPHONE_TEL_DOM_FMT),
493                        str_utf8 (_NL_TELEPHONE_TEL_DOM_FMT));
494   TEST_COMPARE_STRING (str (_NL_TELEPHONE_INT_SELECT),
495                        str_utf8 (_NL_TELEPHONE_INT_SELECT));
496   TEST_COMPARE_STRING (str (_NL_TELEPHONE_INT_PREFIX),
497                        str_utf8 (_NL_TELEPHONE_INT_PREFIX));
498   /* Expected difference.  */
499   TEST_COMPARE_STRING (str (_NL_TELEPHONE_CODESET), "ANSI_X3.4-1968");
500   TEST_COMPARE_STRING (str_utf8 (_NL_TELEPHONE_CODESET), "UTF-8");
501 
502   /* LC_MEASUREMENT.  */
503 
504   TEST_COMPARE (byte (_NL_MEASUREMENT_MEASUREMENT),
505                 byte_utf8 (_NL_MEASUREMENT_MEASUREMENT));
506   /* Expected difference.  */
507   TEST_COMPARE_STRING (str (_NL_MEASUREMENT_CODESET), "ANSI_X3.4-1968");
508   TEST_COMPARE_STRING (str_utf8 (_NL_MEASUREMENT_CODESET), "UTF-8");
509 
510   /* LC_IDENTIFICATION is skipped since C.UTF-8 is distinct from C.  */
511 
512   /* _NL_IDENTIFICATION_CATEGORY cannot be tested because it is a
513      string array.  */
514   /* Expected difference.  */
515   TEST_COMPARE_STRING (str (_NL_IDENTIFICATION_CODESET), "ANSI_X3.4-1968");
516   TEST_COMPARE_STRING (str_utf8 (_NL_IDENTIFICATION_CODESET), "UTF-8");
517 }
518 
519 static int
do_test(void)520 do_test (void)
521 {
522   puts ("info: using setlocale and nl_langinfo");
523   one_pass ();
524 
525   puts ("info: using nl_langinfo_l");
526 
527   c_utf8 = newlocale (LC_ALL_MASK, "C.UTF-8", (locale_t) 0);
528   TEST_VERIFY_EXIT (c_utf8 != (locale_t) 0);
529 
530   switch_to_c ();
531   use_nl_langinfo_l = true;
532   one_pass ();
533 
534   freelocale (c_utf8);
535 
536   return 0;
537 }
538 
539 #include <support/test-driver.c>
540