1 /* Test of gl_locale_name function and its variants.
2 Copyright (C) 2007-2024 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
21 #include "localename.h"
29 #if HAVE_WORKING_NEWLOCALE && HAVE_WORKING_USELOCALE && !HAVE_FAKE_LOCALES
30 # define HAVE_GOOD_USELOCALE 1
34 /* Work around Haiku bug <https://dev.haiku-os.org/ticket/18344>. */
35 # define freelocale(loc) ((void) (loc))
38 /* Suppress GCC false positive. */
40 # pragma GCC diagnostic ignored "-Wanalyzer-use-of-uninitialized-value"
43 /* The name that setlocale(,NULL) returns for the "C" locale. */
45 # define C_CANONICALIZED "POSIX"
47 # define C_CANONICALIZED "C"
51 is_default (const char *name
)
53 return strcmp (name
, gl_locale_name_default ()) == 0
54 || (strcmp (name
, C_CANONICALIZED
) == 0
55 && strcmp (gl_locale_name_default (), "C") == 0)
57 || (strcmp (name
, "C.UTF-8") == 0
58 && strcmp (gl_locale_name_default (), "C") == 0)
63 #if HAVE_GOOD_USELOCALE
65 static struct { int cat
; int mask
; const char *string
; } const categories
[] =
67 { LC_CTYPE
, LC_CTYPE_MASK
, "LC_CTYPE" },
68 { LC_NUMERIC
, LC_NUMERIC_MASK
, "LC_NUMERIC" },
69 { LC_TIME
, LC_TIME_MASK
, "LC_TIME" },
70 { LC_COLLATE
, LC_COLLATE_MASK
, "LC_COLLATE" },
71 { LC_MONETARY
, LC_MONETARY_MASK
, "LC_MONETARY" },
72 { LC_MESSAGES
, LC_MESSAGES_MASK
, "LC_MESSAGES" }
74 , { LC_PAPER
, LC_PAPER_MASK
, "LC_PAPER" }
77 , { LC_NAME
, LC_NAME_MASK
, "LC_NAME" }
80 , { LC_ADDRESS
, LC_ADDRESS_MASK
, "LC_ADDRESS" }
83 , { LC_TELEPHONE
, LC_TELEPHONE_MASK
, "LC_TELEPHONE" }
85 # ifdef LC_MEASUREMENT
86 , { LC_MEASUREMENT
, LC_MEASUREMENT_MASK
, "LC_MEASUREMENT" }
88 # ifdef LC_IDENTIFICATION
89 , { LC_IDENTIFICATION
, LC_IDENTIFICATION_MASK
, "LC_IDENTIFICATION" }
95 /* Test the gl_locale_name() function. */
97 test_locale_name (void)
102 /* Check that gl_locale_name returns non-NULL. */
103 ASSERT (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES") != NULL
);
105 /* Get into a defined state, */
106 setlocale (LC_ALL
, "en_US.UTF-8");
107 #if HAVE_GOOD_USELOCALE
108 uselocale (LC_GLOBAL_LOCALE
);
111 /* Check that when all environment variables are unset,
112 gl_locale_name returns the default locale. */
114 unsetenv ("LC_CTYPE");
115 unsetenv ("LC_MESSAGES");
116 unsetenv ("LC_NUMERIC");
118 /* Need also to unset all environment variables that specify standard or
119 non-standard locale categories. Otherwise, on glibc systems, when some
120 of these variables are set and reference a nonexistent locale, the
121 setlocale (LC_ALL, "") call below would fail. */
122 unsetenv ("LC_COLLATE");
123 unsetenv ("LC_MONETARY");
124 unsetenv ("LC_TIME");
125 unsetenv ("LC_ADDRESS");
126 unsetenv ("LC_IDENTIFICATION");
127 unsetenv ("LC_MEASUREMENT");
128 unsetenv ("LC_NAME");
129 unsetenv ("LC_PAPER");
130 unsetenv ("LC_TELEPHONE");
131 ret
= setlocale (LC_ALL
, "");
132 ASSERT (ret
!= NULL
);
133 ASSERT (is_default (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES")));
134 ASSERT (is_default (gl_locale_name (LC_NUMERIC
, "LC_NUMERIC")));
136 /* Check that an empty environment variable is treated like an unset
137 environment variable. */
139 setenv ("LC_ALL", "", 1);
140 unsetenv ("LC_CTYPE");
141 unsetenv ("LC_MESSAGES");
143 setlocale (LC_ALL
, "");
144 ASSERT (is_default (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES")));
147 setenv ("LC_CTYPE", "", 1);
148 unsetenv ("LC_MESSAGES");
150 setlocale (LC_ALL
, "");
151 ASSERT (is_default (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES")));
154 unsetenv ("LC_CTYPE");
155 setenv ("LC_MESSAGES", "", 1);
157 setlocale (LC_ALL
, "");
158 ASSERT (is_default (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES")));
161 unsetenv ("LC_CTYPE");
162 unsetenv ("LC_MESSAGES");
163 setenv ("LANG", "", 1);
164 setlocale (LC_ALL
, "");
165 ASSERT (is_default (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES")));
167 /* Check that LC_ALL overrides the others, and LANG is overridden by the
170 setenv ("LC_ALL", "C", 1);
171 unsetenv ("LC_CTYPE");
172 unsetenv ("LC_MESSAGES");
174 setlocale (LC_ALL
, "");
175 ASSERT (strcmp (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES"),
176 C_CANONICALIZED
) == 0);
179 setenv ("LC_CTYPE", "C", 1);
180 setenv ("LC_MESSAGES", "C", 1);
182 setlocale (LC_ALL
, "");
183 ASSERT (strcmp (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES"),
184 C_CANONICALIZED
) == 0);
187 unsetenv ("LC_CTYPE");
188 unsetenv ("LC_MESSAGES");
189 setenv ("LANG", "C", 1);
190 setlocale (LC_ALL
, "");
191 ASSERT (strcmp (gl_locale_name (LC_MESSAGES
, "LC_MESSAGES"),
192 C_CANONICALIZED
) == 0);
194 /* Check mixed situations. */
197 unsetenv ("LC_CTYPE");
198 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
199 setenv ("LANG", "de_DE.UTF-8", 1);
200 if (setlocale (LC_ALL
, "") != NULL
)
202 name
= gl_locale_name (LC_CTYPE
, "LC_CTYPE");
203 #if defined _WIN32 && !defined __CYGWIN__
204 /* On native Windows, here,
205 gl_locale_name_thread (LC_CTYPE, "LC_CTYPE")
207 gl_locale_name_posix (LC_CTYPE, "LC_CTYPE")
208 returns either "de_DE" or "de_DE.UTF-8". */
209 ASSERT (strcmp (name
, "de_DE") == 0 || strcmp (name
, "de_DE.UTF-8") == 0);
211 ASSERT (strcmp (name
, "de_DE.UTF-8") == 0);
213 name
= gl_locale_name (LC_MESSAGES
, "LC_MESSAGES");
214 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
218 unsetenv ("LC_CTYPE");
219 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
221 if (setlocale (LC_ALL
, "") != NULL
)
223 name
= gl_locale_name (LC_CTYPE
, "LC_CTYPE");
224 ASSERT (is_default (name
));
225 name
= gl_locale_name (LC_MESSAGES
, "LC_MESSAGES");
226 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
229 #if HAVE_GOOD_USELOCALE
230 /* Check that gl_locale_name considers the thread locale. */
232 locale_t locale
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
236 name
= gl_locale_name (LC_CTYPE
, "LC_CTYPE");
237 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
238 name
= gl_locale_name (LC_MESSAGES
, "LC_MESSAGES");
239 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
240 uselocale (LC_GLOBAL_LOCALE
);
245 /* Check that gl_locale_name distinguishes different categories of the
246 thread locale, and that the name is the right one for each. */
250 for (i
= 0; i
< SIZEOF (categories
); i
++)
252 int category_mask
= categories
[i
].mask
;
253 locale_t loc
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
256 locale_t locale
= newlocale (category_mask
, "de_DE.UTF-8", loc
);
264 for (j
= 0; j
< SIZEOF (categories
); j
++)
267 gl_locale_name (categories
[j
].cat
, categories
[j
].string
);
269 ASSERT (strcmp (name_j
, "de_DE.UTF-8") == 0);
271 ASSERT (strcmp (name_j
, "fr_FR.UTF-8") == 0);
273 uselocale (LC_GLOBAL_LOCALE
);
282 /* Test the gl_locale_name_thread() function. */
284 test_locale_name_thread (void)
286 /* Get into a defined state, */
287 setlocale (LC_ALL
, "en_US.UTF-8");
289 #if HAVE_GOOD_USELOCALE
290 /* Check that gl_locale_name_thread returns NULL when no thread locale is
292 uselocale (LC_GLOBAL_LOCALE
);
293 ASSERT (gl_locale_name_thread (LC_CTYPE
, "LC_CTYPE") == NULL
);
294 ASSERT (gl_locale_name_thread (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
296 /* Check that gl_locale_name_thread considers the thread locale. */
298 locale_t locale
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
304 name
= gl_locale_name_thread (LC_CTYPE
, "LC_CTYPE");
305 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
306 name
= gl_locale_name_thread (LC_MESSAGES
, "LC_MESSAGES");
307 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
308 uselocale (LC_GLOBAL_LOCALE
);
313 /* Check that gl_locale_name_thread distinguishes different categories of the
314 thread locale, and that the name is the right one for each. */
318 for (i
= 0; i
< SIZEOF (categories
); i
++)
320 int category_mask
= categories
[i
].mask
;
321 locale_t loc
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
324 locale_t locale
= newlocale (category_mask
, "de_DE.UTF-8", loc
);
332 for (j
= 0; j
< SIZEOF (categories
); j
++)
335 gl_locale_name_thread (categories
[j
].cat
,
336 categories
[j
].string
);
338 ASSERT (strcmp (name_j
, "de_DE.UTF-8") == 0);
340 ASSERT (strcmp (name_j
, "fr_FR.UTF-8") == 0);
342 uselocale (LC_GLOBAL_LOCALE
);
349 /* Check that gl_locale_name_thread returns a string that is allocated with
350 indefinite extent. */
352 /* Try many locale names in turn, in order to defeat possible caches. */
353 static const char * const choices
[] =
459 /* Remember which locales are available. */
460 unsigned char /* bool */ available
[SIZEOF (choices
)];
461 /* Array of remembered results of gl_locale_name_thread. */
462 const char *unsaved_names
[SIZEOF (choices
)][SIZEOF (categories
)];
463 /* Array of remembered results of gl_locale_name_thread, stored in safe
465 char *saved_names
[SIZEOF (choices
)][SIZEOF (categories
)];
468 for (j
= 0; j
< SIZEOF (choices
); j
++)
470 locale_t locale
= newlocale (LC_ALL_MASK
, choices
[j
], NULL
);
471 available
[j
] = (locale
!= NULL
);
477 for (i
= 0; i
< SIZEOF (categories
); i
++)
479 unsaved_names
[j
][i
] = gl_locale_name_thread (categories
[i
].cat
, categories
[i
].string
);
480 saved_names
[j
][i
] = strdup (unsaved_names
[j
][i
]);
482 uselocale (LC_GLOBAL_LOCALE
);
486 /* Verify the unsaved_names are still valid. */
487 for (j
= 0; j
< SIZEOF (choices
); j
++)
492 for (i
= 0; i
< SIZEOF (categories
); i
++)
493 ASSERT (strcmp (unsaved_names
[j
][i
], saved_names
[j
][i
]) == 0);
495 /* Allocate many locales, without freeing them. This is an attempt at
496 overwriting as much of the previously allocated memory as possible. */
497 for (j
= SIZEOF (choices
); j
> 0; )
502 locale_t locale
= newlocale (LC_ALL_MASK
, choices
[j
], NULL
);
505 ASSERT (locale
!= NULL
);
507 for (i
= 0; i
< SIZEOF (categories
); i
++)
509 const char *name
= gl_locale_name_thread (categories
[i
].cat
, categories
[i
].string
);
510 ASSERT (strcmp (unsaved_names
[j
][i
], name
) == 0);
512 uselocale (LC_GLOBAL_LOCALE
);
516 /* Verify the unsaved_names are still valid. */
517 for (j
= 0; j
< SIZEOF (choices
); j
++)
522 for (i
= 0; i
< SIZEOF (categories
); i
++)
524 ASSERT (strcmp (unsaved_names
[j
][i
], saved_names
[j
][i
]) == 0);
525 free (saved_names
[j
][i
]);
530 /* Check that gl_locale_name_thread always returns NULL. */
531 ASSERT (gl_locale_name_thread (LC_CTYPE
, "LC_CTYPE") == NULL
);
532 ASSERT (gl_locale_name_thread (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
536 /* Test the gl_locale_name_posix() function. */
538 test_locale_name_posix (void)
543 /* Get into a defined state, */
544 setlocale (LC_ALL
, "en_US.UTF-8");
545 #if HAVE_GOOD_USELOCALE
546 uselocale (LC_GLOBAL_LOCALE
);
549 /* Check that when all environment variables are unset,
550 gl_locale_name_posix returns either NULL or the default locale. */
552 unsetenv ("LC_CTYPE");
553 unsetenv ("LC_MESSAGES");
554 unsetenv ("LC_NUMERIC");
556 /* Need also to unset all environment variables that specify standard or
557 non-standard locale categories. Otherwise, on glibc systems, when some
558 of these variables are set and reference a nonexistent locale, the
559 setlocale (LC_ALL, "") call below would fail. */
560 unsetenv ("LC_COLLATE");
561 unsetenv ("LC_MONETARY");
562 unsetenv ("LC_TIME");
563 unsetenv ("LC_ADDRESS");
564 unsetenv ("LC_IDENTIFICATION");
565 unsetenv ("LC_MEASUREMENT");
566 unsetenv ("LC_NAME");
567 unsetenv ("LC_PAPER");
568 unsetenv ("LC_TELEPHONE");
569 ret
= setlocale (LC_ALL
, "");
570 ASSERT (ret
!= NULL
);
571 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
572 ASSERT (name
== NULL
|| is_default (name
));
573 name
= gl_locale_name_posix (LC_NUMERIC
, "LC_NUMERIC");
574 ASSERT (name
== NULL
|| is_default (name
));
576 /* Check that an empty environment variable is treated like an unset
577 environment variable. */
579 setenv ("LC_ALL", "", 1);
580 unsetenv ("LC_CTYPE");
581 unsetenv ("LC_MESSAGES");
583 setlocale (LC_ALL
, "");
584 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
585 ASSERT (name
== NULL
|| is_default (name
));
588 setenv ("LC_CTYPE", "", 1);
589 unsetenv ("LC_MESSAGES");
591 setlocale (LC_ALL
, "");
592 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
593 ASSERT (name
== NULL
|| is_default (name
));
596 unsetenv ("LC_CTYPE");
597 setenv ("LC_MESSAGES", "", 1);
599 setlocale (LC_ALL
, "");
600 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
601 ASSERT (name
== NULL
|| is_default (name
));
604 unsetenv ("LC_CTYPE");
605 unsetenv ("LC_MESSAGES");
606 setenv ("LANG", "", 1);
607 setlocale (LC_ALL
, "");
608 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
609 ASSERT (name
== NULL
|| is_default (name
));
611 /* Check that LC_ALL overrides the others, and LANG is overridden by the
614 setenv ("LC_ALL", "C", 1);
615 unsetenv ("LC_CTYPE");
616 unsetenv ("LC_MESSAGES");
618 setlocale (LC_ALL
, "");
619 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
620 ASSERT (strcmp (name
, C_CANONICALIZED
) == 0);
623 setenv ("LC_CTYPE", "C", 1);
624 setenv ("LC_MESSAGES", "C", 1);
626 setlocale (LC_ALL
, "");
627 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
628 ASSERT (strcmp (name
, C_CANONICALIZED
) == 0);
631 unsetenv ("LC_CTYPE");
632 unsetenv ("LC_MESSAGES");
633 setenv ("LANG", "C", 1);
634 setlocale (LC_ALL
, "");
635 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
636 ASSERT (strcmp (name
, C_CANONICALIZED
) == 0);
638 /* Check mixed situations. */
641 unsetenv ("LC_CTYPE");
642 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
643 setenv ("LANG", "de_DE.UTF-8", 1);
644 if (setlocale (LC_ALL
, "") != NULL
)
646 name
= gl_locale_name_posix (LC_CTYPE
, "LC_CTYPE");
647 #if defined _WIN32 && !defined __CYGWIN__
648 ASSERT (strcmp (name
, "de_DE") == 0 || strcmp (name
, "de_DE.UTF-8") == 0);
650 ASSERT (strcmp (name
, "de_DE.UTF-8") == 0);
652 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
653 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
657 unsetenv ("LC_CTYPE");
658 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
660 if (setlocale (LC_ALL
, "") != NULL
)
662 name
= gl_locale_name_posix (LC_CTYPE
, "LC_CTYPE");
663 ASSERT (name
== NULL
|| is_default (name
));
664 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
665 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
668 #if HAVE_GOOD_USELOCALE
669 /* Check that gl_locale_name_posix ignores the thread locale. */
671 locale_t locale
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
675 unsetenv ("LC_CTYPE");
676 unsetenv ("LC_MESSAGES");
677 setenv ("LANG", "C", 1);
678 setlocale (LC_ALL
, "");
680 name
= gl_locale_name_posix (LC_MESSAGES
, "LC_MESSAGES");
681 ASSERT (strcmp (name
, C_CANONICALIZED
) == 0);
682 uselocale (LC_GLOBAL_LOCALE
);
689 /* Test the gl_locale_name_environ() function. */
691 test_locale_name_environ (void)
695 /* Get into a defined state, */
696 setlocale (LC_ALL
, "en_US.UTF-8");
697 #if HAVE_GOOD_USELOCALE
698 uselocale (LC_GLOBAL_LOCALE
);
701 /* Check that when all environment variables are unset,
702 gl_locale_name_environ returns NULL. */
704 unsetenv ("LC_CTYPE");
705 unsetenv ("LC_MESSAGES");
706 unsetenv ("LC_NUMERIC");
708 ASSERT (gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
709 ASSERT (gl_locale_name_environ (LC_NUMERIC
, "LC_NUMERIC") == NULL
);
711 /* Check that an empty environment variable is treated like an unset
712 environment variable. */
714 setenv ("LC_ALL", "", 1);
715 unsetenv ("LC_CTYPE");
716 unsetenv ("LC_MESSAGES");
718 ASSERT (gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
721 setenv ("LC_CTYPE", "", 1);
722 unsetenv ("LC_MESSAGES");
724 ASSERT (gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
727 unsetenv ("LC_CTYPE");
728 setenv ("LC_MESSAGES", "", 1);
730 ASSERT (gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
733 unsetenv ("LC_CTYPE");
734 unsetenv ("LC_MESSAGES");
735 setenv ("LANG", "", 1);
736 ASSERT (gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES") == NULL
);
738 /* Check that LC_ALL overrides the others, and LANG is overridden by the
741 setenv ("LC_ALL", "C", 1);
742 unsetenv ("LC_CTYPE");
743 unsetenv ("LC_MESSAGES");
745 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
746 ASSERT (strcmp (name
, "C") == 0);
749 setenv ("LC_CTYPE", "C", 1);
750 setenv ("LC_MESSAGES", "C", 1);
752 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
753 ASSERT (strcmp (name
, "C") == 0);
756 unsetenv ("LC_CTYPE");
757 unsetenv ("LC_MESSAGES");
758 setenv ("LANG", "C", 1);
759 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
760 ASSERT (strcmp (name
, "C") == 0);
762 /* Check mixed situations. */
765 unsetenv ("LC_CTYPE");
766 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
767 setenv ("LANG", "de_DE.UTF-8", 1);
768 name
= gl_locale_name_environ (LC_CTYPE
, "LC_CTYPE");
769 ASSERT (strcmp (name
, "de_DE.UTF-8") == 0);
770 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
771 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
774 unsetenv ("LC_CTYPE");
775 setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
777 name
= gl_locale_name_environ (LC_CTYPE
, "LC_CTYPE");
778 ASSERT (name
== NULL
);
779 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
780 ASSERT (strcmp (name
, "fr_FR.UTF-8") == 0);
782 #if HAVE_GOOD_USELOCALE
783 /* Check that gl_locale_name_environ ignores the thread locale. */
785 locale_t locale
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
789 unsetenv ("LC_CTYPE");
790 unsetenv ("LC_MESSAGES");
791 setenv ("LANG", "C", 1);
792 setlocale (LC_ALL
, "");
794 name
= gl_locale_name_environ (LC_MESSAGES
, "LC_MESSAGES");
795 ASSERT (strcmp (name
, "C") == 0);
796 uselocale (LC_GLOBAL_LOCALE
);
803 /* Test the gl_locale_name_default() function. */
805 test_locale_name_default (void)
807 const char *name
= gl_locale_name_default ();
809 ASSERT (name
!= NULL
);
811 /* Only Mac OS X and Windows have a facility for the user to set the default
813 #if !((defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __CYGWIN__))
814 ASSERT (strcmp (name
, "C") == 0);
817 #if HAVE_GOOD_USELOCALE
818 /* Check that gl_locale_name_default ignores the thread locale. */
820 locale_t locale
= newlocale (LC_ALL_MASK
, "fr_FR.UTF-8", NULL
);
824 ASSERT (strcmp (gl_locale_name_default (), name
) == 0);
825 uselocale (LC_GLOBAL_LOCALE
);
836 test_locale_name_thread ();
837 test_locale_name_posix ();
838 test_locale_name_environ ();
839 test_locale_name_default ();
841 return test_exit_status
;