/* result->time is usually "janvier" */
}
-int
-main ()
+#if HAVE_USELOCALE
+
+static int
+test_with_uselocale (void)
{
struct locale_dependent_values expected_results;
locale_t mixed1;
/* Use a per-thread locale. */
perthread = newlocale (LC_ALL_MASK, "es_ES.UTF-8", NULL);
if (perthread == NULL)
- {
- fprintf (stderr, "Skipping test: Spanish Unicode locale is not installed\n");
- return 77;
- }
+ return 1;
uselocale (perthread);
/* Save the locale in a locale_t object again. */
return 0;
}
+#endif
+
+#if HAVE_STRFMON_L || HAVE_SNPRINTF_L || HAVE_NL_LANGINFO_L
+
+static void
+get_locale_dependent_values_from (struct locale_dependent_values *result, locale_t locale)
+{
+#if HAVE_STRFMON_L
+ strfmon_l (result->monetary, sizeof (result->monetary), locale,
+ "%n", 123.75);
+ /* result->monetary is usually "$123.75" */
+#endif
+#if HAVE_SNPRINTF_L
+ snprintf_l (result->numeric, sizeof (result->numeric), locale,
+ "%g", 3.5);
+ /* result->numeric is usually "3,5" */
+#endif
+#if HAVE_NL_LANGINFO_L
+ strcpy (result->time, nl_langinfo_l (MON_1, locale));
+ /* result->time is usually "janvier" */
+#endif
+}
+
+static int
+test_with_locale_parameter (void)
+{
+ struct locale_dependent_values expected_results;
+ locale_t mixed1;
+ locale_t mixed2;
+
+ /* Set up a locale which is a mix between different system locales. */
+ setlocale (LC_ALL, "en_US.UTF-8");
+ setlocale (LC_NUMERIC, "de_DE.UTF-8");
+ setlocale (LC_TIME, "fr_FR.UTF-8");
+ get_locale_dependent_values (&expected_results);
+
+ /* Save the locale in a locale_t object. */
+ mixed1 = duplocale (LC_GLOBAL_LOCALE);
+ ASSERT (mixed1 != NULL);
+
+ /* Create another locale_t object. */
+ mixed2 = newlocale (LC_ALL_MASK, "es_ES.UTF-8", NULL);
+ if (mixed2 == NULL)
+ return 1;
+
+ /* Set up a default locale. */
+ setlocale (LC_ALL, "C");
+ {
+ struct locale_dependent_values c_results;
+ get_locale_dependent_values (&c_results);
+ }
+
+ /* Now use the saved locale mixed2. */
+ {
+ struct locale_dependent_values results;
+ get_locale_dependent_values_from (&results, mixed2);
+ }
+
+ /* Now use the saved locale mixed1 again. */
+ {
+ struct locale_dependent_values results;
+ get_locale_dependent_values_from (&results, mixed1);
+#if HAVE_STRFMON_L
+ ASSERT (strcmp (results.monetary, expected_results.monetary) == 0);
+#endif
+#if HAVE_SNPRINTF_L
+ ASSERT (strcmp (results.numeric, expected_results.numeric) == 0);
+#endif
+#if HAVE_NL_LANGINFO_L
+ ASSERT (strcmp (results.time, expected_results.time) == 0);
+#endif
+ }
+
+ freelocale (mixed1);
+ freelocale (mixed2);
+ return 0;
+}
+
+#endif
+
+int
+main ()
+{
+ int skipped = 0;
+#if HAVE_USELOCALE
+ skipped |= test_with_uselocale ();
+#endif
+#if HAVE_STRFMON_L || HAVE_SNPRINTF_L || HAVE_NL_LANGINFO_L
+ skipped |= test_with_locale_parameter ();
+#endif
+
+ if (skipped)
+ {
+ fprintf (stderr, "Skipping test: Spanish Unicode locale is not installed\n");
+ return 77;
+ }
+
+ return 0;
+}
+
#else
#include <stdio.h>