Blame gnulib-tests/test-localename.c

Packit 709fb3
/* Test of gl_locale_name function and its variants.
Packit 709fb3
   Copyright (C) 2007-2017 Free Software Foundation, Inc.
Packit 709fb3
Packit 709fb3
   This program is free software: you can redistribute it and/or modify
Packit 709fb3
   it under the terms of the GNU General Public License as published by
Packit 709fb3
   the Free Software Foundation; either version 3 of the License, or
Packit 709fb3
   (at your option) any later version.
Packit 709fb3
Packit 709fb3
   This program is distributed in the hope that it will be useful,
Packit 709fb3
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 709fb3
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 709fb3
   GNU General Public License for more details.
Packit 709fb3
Packit 709fb3
   You should have received a copy of the GNU General Public License
Packit 709fb3
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 709fb3
Packit 709fb3
/* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
Packit 709fb3
Packit 709fb3
#include <config.h>
Packit 709fb3
Packit 709fb3
#include "localename.h"
Packit 709fb3
Packit 709fb3
#include <locale.h>
Packit 709fb3
#include <stdlib.h>
Packit 709fb3
#include <string.h>
Packit 709fb3
Packit 709fb3
#include "macros.h"
Packit 709fb3
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
Packit 709fb3
static struct { int cat; int mask; const char *string; } const categories[] =
Packit 709fb3
  {
Packit 709fb3
      { LC_CTYPE,          LC_CTYPE_MASK,          "LC_CTYPE" },
Packit 709fb3
      { LC_NUMERIC,        LC_NUMERIC_MASK,        "LC_NUMERIC" },
Packit 709fb3
      { LC_TIME,           LC_TIME_MASK,           "LC_TIME" },
Packit 709fb3
      { LC_COLLATE,        LC_COLLATE_MASK,        "LC_COLLATE" },
Packit 709fb3
      { LC_MONETARY,       LC_MONETARY_MASK,       "LC_MONETARY" },
Packit 709fb3
      { LC_MESSAGES,       LC_MESSAGES_MASK,       "LC_MESSAGES" }
Packit 709fb3
# ifdef LC_PAPER
Packit 709fb3
    , { LC_PAPER,          LC_PAPER_MASK,          "LC_PAPER" }
Packit 709fb3
# endif
Packit 709fb3
# ifdef LC_NAME
Packit 709fb3
    , { LC_NAME,           LC_NAME_MASK,           "LC_NAME" }
Packit 709fb3
# endif
Packit 709fb3
# ifdef LC_ADDRESS
Packit 709fb3
    , { LC_ADDRESS,        LC_ADDRESS_MASK,        "LC_ADDRESS" }
Packit 709fb3
# endif
Packit 709fb3
# ifdef LC_TELEPHONE
Packit 709fb3
    , { LC_TELEPHONE,      LC_TELEPHONE_MASK,      "LC_TELEPHONE" }
Packit 709fb3
# endif
Packit 709fb3
# ifdef LC_MEASUREMENT
Packit 709fb3
    , { LC_MEASUREMENT,    LC_MEASUREMENT_MASK,    "LC_MEASUREMENT" }
Packit 709fb3
# endif
Packit 709fb3
# ifdef LC_IDENTIFICATION
Packit 709fb3
    , { LC_IDENTIFICATION, LC_IDENTIFICATION_MASK, "LC_IDENTIFICATION" }
Packit 709fb3
# endif
Packit 709fb3
  };
Packit 709fb3
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
/* Test the gl_locale_name() function.  */
Packit 709fb3
static void
Packit 709fb3
test_locale_name (void)
Packit 709fb3
{
Packit 709fb3
  const char *name;
Packit 709fb3
Packit 709fb3
  /* Check that gl_locale_name returns non-NULL.  */
Packit 709fb3
  ASSERT (gl_locale_name (LC_MESSAGES, "LC_MESSAGES") != NULL);
Packit 709fb3
Packit 709fb3
  /* Get into a defined state,  */
Packit 709fb3
  setlocale (LC_ALL, "en_US.UTF-8");
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
  /* Check that when all environment variables are unset,
Packit 709fb3
     gl_locale_name returns the default locale.  */
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LC_NUMERIC");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_NUMERIC, "LC_NUMERIC"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  /* Check that an empty environment variable is treated like an unset
Packit 709fb3
     environment variable.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "", 1);
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "", 1);
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"),
Packit 709fb3
                  gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  /* Check that LC_ALL overrides the others, and LANG is overridden by the
Packit 709fb3
     others.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "C", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "C", 1);
Packit 709fb3
  setenv ("LC_MESSAGES", "C", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "C", 1);
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), "C") == 0);
Packit 709fb3
Packit 709fb3
  /* Check mixed situations.  */
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  setenv ("LANG", "de_DE.UTF-8", 1);
Packit 709fb3
  if (setlocale (LC_ALL, "") != NULL)
Packit 709fb3
    {
Packit 709fb3
      name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
      ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
Packit 709fb3
      name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
      ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  if (setlocale (LC_ALL, "") != NULL)
Packit 709fb3
    {
Packit 709fb3
      name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
      ASSERT (strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
      name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
      ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  /* Check that gl_locale_name considers the thread locale.  */
Packit 709fb3
  {
Packit 709fb3
    locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
    if (locale != NULL)
Packit 709fb3
      {
Packit 709fb3
        uselocale (locale);
Packit 709fb3
        name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
        ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
        name = gl_locale_name (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
        ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
        uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
        freelocale (locale);
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
Packit 709fb3
  /* Check that gl_locale_name distinguishes different categories of the
Packit 709fb3
     thread locale, and that the name is the right one for each.  */
Packit 709fb3
  {
Packit 709fb3
    unsigned int i;
Packit 709fb3
Packit 709fb3
    for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
      {
Packit 709fb3
        int category_mask = categories[i].mask;
Packit 709fb3
        locale_t loc = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
        if (loc != NULL)
Packit 709fb3
          {
Packit 709fb3
            locale_t locale = newlocale (category_mask, "de_DE.UTF-8", loc);
Packit 709fb3
            if (locale == NULL)
Packit 709fb3
              freelocale (loc);
Packit 709fb3
            else
Packit 709fb3
              {
Packit 709fb3
                unsigned int j;
Packit 709fb3
Packit 709fb3
                uselocale (locale);
Packit 709fb3
                for (j = 0; j < SIZEOF (categories); j++)
Packit 709fb3
                  {
Packit 709fb3
                    const char *name_j =
Packit 709fb3
                      gl_locale_name (categories[j].cat, categories[j].string);
Packit 709fb3
                    if (j == i)
Packit 709fb3
                      ASSERT (strcmp (name_j, "de_DE.UTF-8") == 0);
Packit 709fb3
                    else
Packit 709fb3
                      ASSERT (strcmp (name_j, "fr_FR.UTF-8") == 0);
Packit 709fb3
                  }
Packit 709fb3
                uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
                freelocale (locale);
Packit 709fb3
              }
Packit 709fb3
          }
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
#endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
/* Test the gl_locale_name_thread() function.  */
Packit 709fb3
static void
Packit 709fb3
test_locale_name_thread (void)
Packit 709fb3
{
Packit 709fb3
  /* Get into a defined state,  */
Packit 709fb3
  setlocale (LC_ALL, "en_US.UTF-8");
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  /* Check that gl_locale_name_thread returns NULL when no thread locale is
Packit 709fb3
     set.  */
Packit 709fb3
  uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
  ASSERT (gl_locale_name_thread (LC_CTYPE, "LC_CTYPE") == NULL);
Packit 709fb3
  ASSERT (gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
Packit 709fb3
  /* Check that gl_locale_name_thread considers the thread locale.  */
Packit 709fb3
  {
Packit 709fb3
    locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
    if (locale != NULL)
Packit 709fb3
      {
Packit 709fb3
        const char *name;
Packit 709fb3
Packit 709fb3
        uselocale (locale);
Packit 709fb3
        name = gl_locale_name_thread (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
        ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
        name = gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
        ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
        uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
        freelocale (locale);
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
Packit 709fb3
  /* Check that gl_locale_name_thread distinguishes different categories of the
Packit 709fb3
     thread locale, and that the name is the right one for each.  */
Packit 709fb3
  {
Packit 709fb3
    unsigned int i;
Packit 709fb3
Packit 709fb3
    for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
      {
Packit 709fb3
        int category_mask = categories[i].mask;
Packit 709fb3
        locale_t loc = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
        if (loc != NULL)
Packit 709fb3
          {
Packit 709fb3
            locale_t locale = newlocale (category_mask, "de_DE.UTF-8", loc);
Packit 709fb3
            if (locale == NULL)
Packit 709fb3
              freelocale (loc);
Packit 709fb3
            else
Packit 709fb3
              {
Packit 709fb3
                unsigned int j;
Packit 709fb3
Packit 709fb3
                uselocale (locale);
Packit 709fb3
                for (j = 0; j < SIZEOF (categories); j++)
Packit 709fb3
                  {
Packit 709fb3
                    const char *name_j =
Packit 709fb3
                      gl_locale_name_thread (categories[j].cat,
Packit 709fb3
                                             categories[j].string);
Packit 709fb3
                    if (j == i)
Packit 709fb3
                      ASSERT (strcmp (name_j, "de_DE.UTF-8") == 0);
Packit 709fb3
                    else
Packit 709fb3
                      ASSERT (strcmp (name_j, "fr_FR.UTF-8") == 0);
Packit 709fb3
                  }
Packit 709fb3
                uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
                freelocale (locale);
Packit 709fb3
              }
Packit 709fb3
          }
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
Packit 709fb3
  /* Check that gl_locale_name_thread returns a string that is allocated with
Packit 709fb3
     indefinite extent.  */
Packit 709fb3
  {
Packit 709fb3
    /* Try many locale names in turn, in order to defeat possible caches.  */
Packit 709fb3
    static const char * const choices[] =
Packit 709fb3
      {
Packit 709fb3
        "C",
Packit 709fb3
        "POSIX",
Packit 709fb3
        "af_ZA",
Packit 709fb3
        "af_ZA.UTF-8",
Packit 709fb3
        "am_ET",
Packit 709fb3
        "am_ET.UTF-8",
Packit 709fb3
        "be_BY",
Packit 709fb3
        "be_BY.UTF-8",
Packit 709fb3
        "bg_BG",
Packit 709fb3
        "bg_BG.UTF-8",
Packit 709fb3
        "ca_ES",
Packit 709fb3
        "ca_ES.UTF-8",
Packit 709fb3
        "cs_CZ",
Packit 709fb3
        "cs_CZ.UTF-8",
Packit 709fb3
        "da_DK",
Packit 709fb3
        "da_DK.UTF-8",
Packit 709fb3
        "de_AT",
Packit 709fb3
        "de_AT.UTF-8",
Packit 709fb3
        "de_CH",
Packit 709fb3
        "de_CH.UTF-8",
Packit 709fb3
        "de_DE",
Packit 709fb3
        "de_DE.UTF-8",
Packit 709fb3
        "el_GR",
Packit 709fb3
        "el_GR.UTF-8",
Packit 709fb3
        "en_AU",
Packit 709fb3
        "en_AU.UTF-8",
Packit 709fb3
        "en_CA",
Packit 709fb3
        "en_CA.UTF-8",
Packit 709fb3
        "en_GB",
Packit 709fb3
        "en_GB.UTF-8",
Packit 709fb3
        "en_IE",
Packit 709fb3
        "en_IE.UTF-8",
Packit 709fb3
        "en_NZ",
Packit 709fb3
        "en_NZ.UTF-8",
Packit 709fb3
        "en_US",
Packit 709fb3
        "en_US.UTF-8",
Packit 709fb3
        "es_ES",
Packit 709fb3
        "es_ES.UTF-8",
Packit 709fb3
        "et_EE",
Packit 709fb3
        "et_EE.UTF-8",
Packit 709fb3
        "eu_ES",
Packit 709fb3
        "eu_ES.UTF-8",
Packit 709fb3
        "fi_FI",
Packit 709fb3
        "fi_FI.UTF-8",
Packit 709fb3
        "fr_BE",
Packit 709fb3
        "fr_BE.UTF-8",
Packit 709fb3
        "fr_CA",
Packit 709fb3
        "fr_CA.UTF-8",
Packit 709fb3
        "fr_CH",
Packit 709fb3
        "fr_CH.UTF-8",
Packit 709fb3
        "fr_FR",
Packit 709fb3
        "fr_FR.UTF-8",
Packit 709fb3
        "he_IL",
Packit 709fb3
        "he_IL.UTF-8",
Packit 709fb3
        "hr_HR",
Packit 709fb3
        "hr_HR.UTF-8",
Packit 709fb3
        "hu_HU",
Packit 709fb3
        "hu_HU.UTF-8",
Packit 709fb3
        "hy_AM",
Packit 709fb3
        "is_IS",
Packit 709fb3
        "is_IS.UTF-8",
Packit 709fb3
        "it_CH",
Packit 709fb3
        "it_CH.UTF-8",
Packit 709fb3
        "it_IT",
Packit 709fb3
        "it_IT.UTF-8",
Packit 709fb3
        "ja_JP.UTF-8",
Packit 709fb3
        "kk_KZ",
Packit 709fb3
        "kk_KZ.UTF-8",
Packit 709fb3
        "ko_KR.UTF-8",
Packit 709fb3
        "lt_LT",
Packit 709fb3
        "lt_LT.UTF-8",
Packit 709fb3
        "nl_BE",
Packit 709fb3
        "nl_BE.UTF-8",
Packit 709fb3
        "nl_NL",
Packit 709fb3
        "nl_NL.UTF-8",
Packit 709fb3
        "no_NO",
Packit 709fb3
        "no_NO.UTF-8",
Packit 709fb3
        "pl_PL",
Packit 709fb3
        "pl_PL.UTF-8",
Packit 709fb3
        "pt_BR",
Packit 709fb3
        "pt_BR.UTF-8",
Packit 709fb3
        "pt_PT",
Packit 709fb3
        "pt_PT.UTF-8",
Packit 709fb3
        "ro_RO",
Packit 709fb3
        "ro_RO.UTF-8",
Packit 709fb3
        "ru_RU",
Packit 709fb3
        "ru_RU.UTF-8",
Packit 709fb3
        "sk_SK",
Packit 709fb3
        "sk_SK.UTF-8",
Packit 709fb3
        "sl_SI",
Packit 709fb3
        "sl_SI.UTF-8",
Packit 709fb3
        "sv_SE",
Packit 709fb3
        "sv_SE.UTF-8",
Packit 709fb3
        "tr_TR",
Packit 709fb3
        "tr_TR.UTF-8",
Packit 709fb3
        "uk_UA",
Packit 709fb3
        "uk_UA.UTF-8",
Packit 709fb3
        "zh_CN",
Packit 709fb3
        "zh_CN.UTF-8",
Packit 709fb3
        "zh_HK",
Packit 709fb3
        "zh_HK.UTF-8",
Packit 709fb3
        "zh_TW",
Packit 709fb3
        "zh_TW.UTF-8"
Packit 709fb3
      };
Packit 709fb3
    /* Remember which locales are available.  */
Packit 709fb3
    unsigned char /* bool */ available[SIZEOF (choices)];
Packit 709fb3
    /* Array of remembered results of gl_locale_name_thread.  */
Packit 709fb3
    const char *unsaved_names[SIZEOF (choices)][SIZEOF (categories)];
Packit 709fb3
    /* Array of remembered results of gl_locale_name_thread, stored in safe
Packit 709fb3
       memory.  */
Packit 709fb3
    char *saved_names[SIZEOF (choices)][SIZEOF (categories)];
Packit 709fb3
    unsigned int j;
Packit 709fb3
Packit 709fb3
    for (j = 0; j < SIZEOF (choices); j++)
Packit 709fb3
      {
Packit 709fb3
        locale_t locale = newlocale (LC_ALL_MASK, choices[j], NULL);
Packit 709fb3
        available[j] = (locale != NULL);
Packit 709fb3
        if (locale != NULL)
Packit 709fb3
          {
Packit 709fb3
            unsigned int i;
Packit 709fb3
Packit 709fb3
            uselocale (locale);
Packit 709fb3
            for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
              {
Packit 709fb3
                unsaved_names[j][i] = gl_locale_name_thread (categories[i].cat, categories[i].string);
Packit 709fb3
                saved_names[j][i] = strdup (unsaved_names[j][i]);
Packit 709fb3
              }
Packit 709fb3
            uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
            freelocale (locale);
Packit 709fb3
          }
Packit 709fb3
      }
Packit 709fb3
    /* Verify the unsaved_names are still valid.  */
Packit 709fb3
    for (j = 0; j < SIZEOF (choices); j++)
Packit 709fb3
      if (available[j])
Packit 709fb3
        {
Packit 709fb3
          unsigned int i;
Packit 709fb3
Packit 709fb3
          for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
            ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0);
Packit 709fb3
        }
Packit 709fb3
    /* Allocate many locales, without freeing them.  This is an attempt at
Packit 709fb3
       overwriting as much of the previously allocated memory as possible.  */
Packit 709fb3
    for (j = SIZEOF (choices); j > 0; )
Packit 709fb3
      {
Packit 709fb3
        j--;
Packit 709fb3
        if (available[j])
Packit 709fb3
          {
Packit 709fb3
            locale_t locale = newlocale (LC_ALL_MASK, choices[j], NULL);
Packit 709fb3
            unsigned int i;
Packit 709fb3
Packit 709fb3
            ASSERT (locale != NULL);
Packit 709fb3
            uselocale (locale);
Packit 709fb3
            for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
              {
Packit 709fb3
                const char *name = gl_locale_name_thread (categories[i].cat, categories[i].string);
Packit 709fb3
                ASSERT (strcmp (unsaved_names[j][i], name) == 0);
Packit 709fb3
              }
Packit 709fb3
            uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
            freelocale (locale);
Packit 709fb3
          }
Packit 709fb3
      }
Packit 709fb3
    /* Verify the unsaved_names are still valid.  */
Packit 709fb3
    for (j = 0; j < SIZEOF (choices); j++)
Packit 709fb3
      if (available[j])
Packit 709fb3
        {
Packit 709fb3
          unsigned int i;
Packit 709fb3
Packit 709fb3
          for (i = 0; i < SIZEOF (categories); i++)
Packit 709fb3
            {
Packit 709fb3
              ASSERT (strcmp (unsaved_names[j][i], saved_names[j][i]) == 0);
Packit 709fb3
              free (saved_names[j][i]);
Packit 709fb3
            }
Packit 709fb3
        }
Packit 709fb3
  }
Packit 709fb3
#else
Packit 709fb3
  /* Check that gl_locale_name_thread always returns NULL.  */
Packit 709fb3
  ASSERT (gl_locale_name_thread (LC_CTYPE, "LC_CTYPE") == NULL);
Packit 709fb3
  ASSERT (gl_locale_name_thread (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
#endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
/* Test the gl_locale_name_posix() function.  */
Packit 709fb3
static void
Packit 709fb3
test_locale_name_posix (void)
Packit 709fb3
{
Packit 709fb3
  const char *name;
Packit 709fb3
Packit 709fb3
  /* Get into a defined state,  */
Packit 709fb3
  setlocale (LC_ALL, "en_US.UTF-8");
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
  /* Check that when all environment variables are unset,
Packit 709fb3
     gl_locale_name_posix returns either NULL or the default locale.  */
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LC_NUMERIC");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
  name = gl_locale_name_posix (LC_NUMERIC, "LC_NUMERIC");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  /* Check that an empty environment variable is treated like an unset
Packit 709fb3
     environment variable.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "", 1);
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "", 1);
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
Packit 709fb3
  /* Check that LC_ALL overrides the others, and LANG is overridden by the
Packit 709fb3
     others.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "C", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "C", 1);
Packit 709fb3
  setenv ("LC_MESSAGES", "C", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "C", 1);
Packit 709fb3
  setlocale (LC_ALL, "");
Packit 709fb3
  name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  /* Check mixed situations.  */
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  setenv ("LANG", "de_DE.UTF-8", 1);
Packit 709fb3
  if (setlocale (LC_ALL, "") != NULL)
Packit 709fb3
    {
Packit 709fb3
      name = gl_locale_name_posix (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
      ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
Packit 709fb3
      name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
      ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  if (setlocale (LC_ALL, "") != NULL)
Packit 709fb3
    {
Packit 709fb3
      name = gl_locale_name_posix (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
      ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0);
Packit 709fb3
      name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
      ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  /* Check that gl_locale_name_posix ignores the thread locale.  */
Packit 709fb3
  {
Packit 709fb3
    locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
    if (locale != NULL)
Packit 709fb3
      {
Packit 709fb3
        unsetenv ("LC_ALL");
Packit 709fb3
        unsetenv ("LC_CTYPE");
Packit 709fb3
        unsetenv ("LC_MESSAGES");
Packit 709fb3
        setenv ("LANG", "C", 1);
Packit 709fb3
        setlocale (LC_ALL, "");
Packit 709fb3
        uselocale (locale);
Packit 709fb3
        name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
        ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
        uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
        freelocale (locale);
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
#endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
/* Test the gl_locale_name_environ() function.  */
Packit 709fb3
static void
Packit 709fb3
test_locale_name_environ (void)
Packit 709fb3
{
Packit 709fb3
  const char *name;
Packit 709fb3
Packit 709fb3
  /* Get into a defined state,  */
Packit 709fb3
  setlocale (LC_ALL, "en_US.UTF-8");
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
  /* Check that when all environment variables are unset,
Packit 709fb3
     gl_locale_name_environ returns NULL.  */
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LC_NUMERIC");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_NUMERIC, "LC_NUMERIC") == NULL);
Packit 709fb3
Packit 709fb3
  /* Check that an empty environment variable is treated like an unset
Packit 709fb3
     environment variable.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "", 1);
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "", 1);
Packit 709fb3
  ASSERT (gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES") == NULL);
Packit 709fb3
Packit 709fb3
  /* Check that LC_ALL overrides the others, and LANG is overridden by the
Packit 709fb3
     others.  */
Packit 709fb3
Packit 709fb3
  setenv ("LC_ALL", "C", 1);
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  setenv ("LC_CTYPE", "C", 1);
Packit 709fb3
  setenv ("LC_MESSAGES", "C", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  unsetenv ("LC_MESSAGES");
Packit 709fb3
  setenv ("LANG", "C", 1);
Packit 709fb3
  name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
Packit 709fb3
  /* Check mixed situations.  */
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  setenv ("LANG", "de_DE.UTF-8", 1);
Packit 709fb3
  name = gl_locale_name_environ (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
  ASSERT (strcmp (name, "de_DE.UTF-8") == 0);
Packit 709fb3
  name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
Packit 709fb3
  unsetenv ("LC_ALL");
Packit 709fb3
  unsetenv ("LC_CTYPE");
Packit 709fb3
  setenv ("LC_MESSAGES", "fr_FR.UTF-8", 1);
Packit 709fb3
  unsetenv ("LANG");
Packit 709fb3
  name = gl_locale_name_environ (LC_CTYPE, "LC_CTYPE");
Packit 709fb3
  ASSERT (name == NULL);
Packit 709fb3
  name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
  ASSERT (strcmp (name, "fr_FR.UTF-8") == 0);
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  /* Check that gl_locale_name_environ ignores the thread locale.  */
Packit 709fb3
  {
Packit 709fb3
    locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
    if (locale != NULL)
Packit 709fb3
      {
Packit 709fb3
        unsetenv ("LC_ALL");
Packit 709fb3
        unsetenv ("LC_CTYPE");
Packit 709fb3
        unsetenv ("LC_MESSAGES");
Packit 709fb3
        setenv ("LANG", "C", 1);
Packit 709fb3
        setlocale (LC_ALL, "");
Packit 709fb3
        uselocale (locale);
Packit 709fb3
        name = gl_locale_name_environ (LC_MESSAGES, "LC_MESSAGES");
Packit 709fb3
        ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
        uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
        freelocale (locale);
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
#endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
/* Test the gl_locale_name_default() function.  */
Packit 709fb3
static void
Packit 709fb3
test_locale_name_default (void)
Packit 709fb3
{
Packit 709fb3
  const char *name = gl_locale_name_default ();
Packit 709fb3
Packit 709fb3
  ASSERT (name != NULL);
Packit 709fb3
Packit 709fb3
  /* Only Mac OS X and Windows have a facility for the user to set the default
Packit 709fb3
     locale.  */
Packit 709fb3
#if !((defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__ || defined __CYGWIN__))
Packit 709fb3
  ASSERT (strcmp (name, "C") == 0);
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
#if HAVE_NEWLOCALE && HAVE_USELOCALE
Packit 709fb3
  /* Check that gl_locale_name_default ignores the thread locale.  */
Packit 709fb3
  {
Packit 709fb3
    locale_t locale = newlocale (LC_ALL_MASK, "fr_FR.UTF-8", NULL);
Packit 709fb3
    if (locale != NULL)
Packit 709fb3
      {
Packit 709fb3
        uselocale (locale);
Packit 709fb3
        ASSERT (strcmp (gl_locale_name_default (), name) == 0);
Packit 709fb3
        uselocale (LC_GLOBAL_LOCALE);
Packit 709fb3
        freelocale (locale);
Packit 709fb3
      }
Packit 709fb3
  }
Packit 709fb3
#endif
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
int
Packit 709fb3
main ()
Packit 709fb3
{
Packit 709fb3
  test_locale_name ();
Packit 709fb3
  test_locale_name_thread ();
Packit 709fb3
  test_locale_name_posix ();
Packit 709fb3
  test_locale_name_environ ();
Packit 709fb3
  test_locale_name_default ();
Packit 709fb3
Packit 709fb3
  return 0;
Packit 709fb3
}