Blame gnulib-tests/setlocale.c

Packit Service fdd496
/* Set the current locale.  -*- coding: utf-8 -*-
Packit Service fdd496
   Copyright (C) 2009, 2011-2017 Free Software Foundation, Inc.
Packit Service fdd496
Packit Service fdd496
   This program is free software: you can redistribute it and/or modify
Packit Service fdd496
   it under the terms of the GNU General Public License as published by
Packit Service fdd496
   the Free Software Foundation; either version 3 of the License, or
Packit Service fdd496
   (at your option) any later version.
Packit Service fdd496
Packit Service fdd496
   This program is distributed in the hope that it will be useful,
Packit Service fdd496
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
   GNU General Public License for more details.
Packit Service fdd496
Packit Service fdd496
   You should have received a copy of the GNU General Public License
Packit Service fdd496
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service fdd496
Packit Service fdd496
/* Written by Bruno Haible <bruno@clisp.org>, 2009.  */
Packit Service fdd496
Packit Service fdd496
#include <config.h>
Packit Service fdd496
Packit Service fdd496
/* Override setlocale() so that when the default locale is requested
Packit Service fdd496
   (locale = ""), the environment variables LC_ALL, LC_*, and LANG are
Packit Service fdd496
   considered.
Packit Service fdd496
   Also include all the functionality from libintl's setlocale() override.  */
Packit Service fdd496
Packit Service fdd496
/* Please keep this file in sync with
Packit Service fdd496
   gettext/gettext-runtime/intl/setlocale.c !  */
Packit Service fdd496
Packit Service fdd496
/* Specification.  */
Packit Service fdd496
#include <locale.h>
Packit Service fdd496
Packit Service fdd496
#include <stdlib.h>
Packit Service fdd496
#include <string.h>
Packit Service fdd496
Packit Service fdd496
#include "localename.h"
Packit Service fdd496
Packit Service fdd496
#if 1
Packit Service fdd496
Packit Service fdd496
# undef setlocale
Packit Service fdd496
Packit Service fdd496
/* Return string representation of locale category CATEGORY.  */
Packit Service fdd496
static const char *
Packit Service fdd496
category_to_name (int category)
Packit Service fdd496
{
Packit Service fdd496
  const char *retval;
Packit Service fdd496
Packit Service fdd496
  switch (category)
Packit Service fdd496
  {
Packit Service fdd496
  case LC_COLLATE:
Packit Service fdd496
    retval = "LC_COLLATE";
Packit Service fdd496
    break;
Packit Service fdd496
  case LC_CTYPE:
Packit Service fdd496
    retval = "LC_CTYPE";
Packit Service fdd496
    break;
Packit Service fdd496
  case LC_MONETARY:
Packit Service fdd496
    retval = "LC_MONETARY";
Packit Service fdd496
    break;
Packit Service fdd496
  case LC_NUMERIC:
Packit Service fdd496
    retval = "LC_NUMERIC";
Packit Service fdd496
    break;
Packit Service fdd496
  case LC_TIME:
Packit Service fdd496
    retval = "LC_TIME";
Packit Service fdd496
    break;
Packit Service fdd496
  case LC_MESSAGES:
Packit Service fdd496
    retval = "LC_MESSAGES";
Packit Service fdd496
    break;
Packit Service fdd496
  default:
Packit Service fdd496
    /* If you have a better idea for a default value let me know.  */
Packit Service fdd496
    retval = "LC_XXX";
Packit Service fdd496
  }
Packit Service fdd496
Packit Service fdd496
  return retval;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
Packit Service fdd496
Packit Service fdd496
/* The native Windows setlocale() function expects locale names of the form
Packit Service fdd496
   "German" or "German_Germany" or "DEU", but not "de" or "de_DE".  We need
Packit Service fdd496
   to convert the names from the form with ISO 639 language code and ISO 3166
Packit Service fdd496
   country code to the form with English names or with three-letter identifier.
Packit Service fdd496
   The three-letter identifiers known by a Windows XP SP2 or SP3 are:
Packit Service fdd496
     AFK  Afrikaans_South Africa.1252
Packit Service fdd496
     ARA  Arabic_Saudi Arabia.1256
Packit Service fdd496
     ARB  Arabic_Lebanon.1256
Packit Service fdd496
     ARE  Arabic_Egypt.1256
Packit Service fdd496
     ARG  Arabic_Algeria.1256
Packit Service fdd496
     ARH  Arabic_Bahrain.1256
Packit Service fdd496
     ARI  Arabic_Iraq.1256
Packit Service fdd496
     ARJ  Arabic_Jordan.1256
Packit Service fdd496
     ARK  Arabic_Kuwait.1256
Packit Service fdd496
     ARL  Arabic_Libya.1256
Packit Service fdd496
     ARM  Arabic_Morocco.1256
Packit Service fdd496
     ARO  Arabic_Oman.1256
Packit Service fdd496
     ARQ  Arabic_Qatar.1256
Packit Service fdd496
     ARS  Arabic_Syria.1256
Packit Service fdd496
     ART  Arabic_Tunisia.1256
Packit Service fdd496
     ARU  Arabic_U.A.E..1256
Packit Service fdd496
     ARY  Arabic_Yemen.1256
Packit Service fdd496
     AZE  Azeri (Latin)_Azerbaijan.1254
Packit Service fdd496
     BEL  Belarusian_Belarus.1251
Packit Service fdd496
     BGR  Bulgarian_Bulgaria.1251
Packit Service fdd496
     BSB  Bosnian_Bosnia and Herzegovina.1250
Packit Service fdd496
     BSC  Bosnian (Cyrillic)_Bosnia and Herzegovina.1250  (wrong encoding!)
Packit Service fdd496
     CAT  Catalan_Spain.1252
Packit Service fdd496
     CHH  Chinese_Hong Kong S.A.R..950
Packit Service fdd496
     CHI  Chinese_Singapore.936
Packit Service fdd496
     CHS  Chinese_People's Republic of China.936
Packit Service fdd496
     CHT  Chinese_Taiwan.950
Packit Service fdd496
     CSY  Czech_Czech Republic.1250
Packit Service fdd496
     CYM  Welsh_United Kingdom.1252
Packit Service fdd496
     DAN  Danish_Denmark.1252
Packit Service fdd496
     DEA  German_Austria.1252
Packit Service fdd496
     DEC  German_Liechtenstein.1252
Packit Service fdd496
     DEL  German_Luxembourg.1252
Packit Service fdd496
     DES  German_Switzerland.1252
Packit Service fdd496
     DEU  German_Germany.1252
Packit Service fdd496
     ELL  Greek_Greece.1253
Packit Service fdd496
     ENA  English_Australia.1252
Packit Service fdd496
     ENB  English_Caribbean.1252
Packit Service fdd496
     ENC  English_Canada.1252
Packit Service fdd496
     ENG  English_United Kingdom.1252
Packit Service fdd496
     ENI  English_Ireland.1252
Packit Service fdd496
     ENJ  English_Jamaica.1252
Packit Service fdd496
     ENL  English_Belize.1252
Packit Service fdd496
     ENP  English_Republic of the Philippines.1252
Packit Service fdd496
     ENS  English_South Africa.1252
Packit Service fdd496
     ENT  English_Trinidad and Tobago.1252
Packit Service fdd496
     ENU  English_United States.1252
Packit Service fdd496
     ENW  English_Zimbabwe.1252
Packit Service fdd496
     ENZ  English_New Zealand.1252
Packit Service fdd496
     ESA  Spanish_Panama.1252
Packit Service fdd496
     ESB  Spanish_Bolivia.1252
Packit Service fdd496
     ESC  Spanish_Costa Rica.1252
Packit Service fdd496
     ESD  Spanish_Dominican Republic.1252
Packit Service fdd496
     ESE  Spanish_El Salvador.1252
Packit Service fdd496
     ESF  Spanish_Ecuador.1252
Packit Service fdd496
     ESG  Spanish_Guatemala.1252
Packit Service fdd496
     ESH  Spanish_Honduras.1252
Packit Service fdd496
     ESI  Spanish_Nicaragua.1252
Packit Service fdd496
     ESL  Spanish_Chile.1252
Packit Service fdd496
     ESM  Spanish_Mexico.1252
Packit Service fdd496
     ESN  Spanish_Spain.1252
Packit Service fdd496
     ESO  Spanish_Colombia.1252
Packit Service fdd496
     ESP  Spanish_Spain.1252
Packit Service fdd496
     ESR  Spanish_Peru.1252
Packit Service fdd496
     ESS  Spanish_Argentina.1252
Packit Service fdd496
     ESU  Spanish_Puerto Rico.1252
Packit Service fdd496
     ESV  Spanish_Venezuela.1252
Packit Service fdd496
     ESY  Spanish_Uruguay.1252
Packit Service fdd496
     ESZ  Spanish_Paraguay.1252
Packit Service fdd496
     ETI  Estonian_Estonia.1257
Packit Service fdd496
     EUQ  Basque_Spain.1252
Packit Service fdd496
     FAR  Farsi_Iran.1256
Packit Service fdd496
     FIN  Finnish_Finland.1252
Packit Service fdd496
     FOS  Faroese_Faroe Islands.1252
Packit Service fdd496
     FPO  Filipino_Philippines.1252
Packit Service fdd496
     FRA  French_France.1252
Packit Service fdd496
     FRB  French_Belgium.1252
Packit Service fdd496
     FRC  French_Canada.1252
Packit Service fdd496
     FRL  French_Luxembourg.1252
Packit Service fdd496
     FRM  French_Principality of Monaco.1252
Packit Service fdd496
     FRS  French_Switzerland.1252
Packit Service fdd496
     FYN  Frisian_Netherlands.1252
Packit Service fdd496
     GLC  Galician_Spain.1252
Packit Service fdd496
     HEB  Hebrew_Israel.1255
Packit Service fdd496
     HRB  Croatian_Bosnia and Herzegovina.1250
Packit Service fdd496
     HRV  Croatian_Croatia.1250
Packit Service fdd496
     HUN  Hungarian_Hungary.1250
Packit Service fdd496
     IND  Indonesian_Indonesia.1252
Packit Service fdd496
     IRE  Irish_Ireland.1252
Packit Service fdd496
     ISL  Icelandic_Iceland.1252
Packit Service fdd496
     ITA  Italian_Italy.1252
Packit Service fdd496
     ITS  Italian_Switzerland.1252
Packit Service fdd496
     IUK  Inuktitut (Latin)_Canada.1252
Packit Service fdd496
     JPN  Japanese_Japan.932
Packit Service fdd496
     KKZ  Kazakh_Kazakhstan.1251
Packit Service fdd496
     KOR  Korean_Korea.949
Packit Service fdd496
     KYR  Kyrgyz_Kyrgyzstan.1251
Packit Service fdd496
     LBX  Luxembourgish_Luxembourg.1252
Packit Service fdd496
     LTH  Lithuanian_Lithuania.1257
Packit Service fdd496
     LVI  Latvian_Latvia.1257
Packit Service fdd496
     MKI  FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251
Packit Service fdd496
     MON  Mongolian_Mongolia.1251
Packit Service fdd496
     MPD  Mapudungun_Chile.1252
Packit Service fdd496
     MSB  Malay_Brunei Darussalam.1252
Packit Service fdd496
     MSL  Malay_Malaysia.1252
Packit Service fdd496
     MWK  Mohawk_Canada.1252
Packit Service fdd496
     NLB  Dutch_Belgium.1252
Packit Service fdd496
     NLD  Dutch_Netherlands.1252
Packit Service fdd496
     NON  Norwegian-Nynorsk_Norway.1252
Packit Service fdd496
     NOR  Norwegian (Bokmål)_Norway.1252
Packit Service fdd496
     NSO  Northern Sotho_South Africa.1252
Packit Service fdd496
     PLK  Polish_Poland.1250
Packit Service fdd496
     PTB  Portuguese_Brazil.1252
Packit Service fdd496
     PTG  Portuguese_Portugal.1252
Packit Service fdd496
     QUB  Quechua_Bolivia.1252
Packit Service fdd496
     QUE  Quechua_Ecuador.1252
Packit Service fdd496
     QUP  Quechua_Peru.1252
Packit Service fdd496
     RMC  Romansh_Switzerland.1252
Packit Service fdd496
     ROM  Romanian_Romania.1250
Packit Service fdd496
     RUS  Russian_Russia.1251
Packit Service fdd496
     SKY  Slovak_Slovakia.1250
Packit Service fdd496
     SLV  Slovenian_Slovenia.1250
Packit Service fdd496
     SMA  Sami (Southern)_Norway.1252
Packit Service fdd496
     SMB  Sami (Southern)_Sweden.1252
Packit Service fdd496
     SME  Sami (Northern)_Norway.1252
Packit Service fdd496
     SMF  Sami (Northern)_Sweden.1252
Packit Service fdd496
     SMG  Sami (Northern)_Finland.1252
Packit Service fdd496
     SMJ  Sami (Lule)_Norway.1252
Packit Service fdd496
     SMK  Sami (Lule)_Sweden.1252
Packit Service fdd496
     SMN  Sami (Inari)_Finland.1252
Packit Service fdd496
     SMS  Sami (Skolt)_Finland.1252
Packit Service fdd496
     SQI  Albanian_Albania.1250
Packit Service fdd496
     SRB  Serbian (Cyrillic)_Serbia and Montenegro.1251
Packit Service fdd496
     SRL  Serbian (Latin)_Serbia and Montenegro.1250
Packit Service fdd496
     SRN  Serbian (Cyrillic)_Bosnia and Herzegovina.1251
Packit Service fdd496
     SRS  Serbian (Latin)_Bosnia and Herzegovina.1250
Packit Service fdd496
     SVE  Swedish_Sweden.1252
Packit Service fdd496
     SVF  Swedish_Finland.1252
Packit Service fdd496
     SWK  Swahili_Kenya.1252
Packit Service fdd496
     THA  Thai_Thailand.874
Packit Service fdd496
     TRK  Turkish_Turkey.1254
Packit Service fdd496
     TSN  Tswana_South Africa.1252
Packit Service fdd496
     TTT  Tatar_Russia.1251
Packit Service fdd496
     UKR  Ukrainian_Ukraine.1251
Packit Service fdd496
     URD  Urdu_Islamic Republic of Pakistan.1256
Packit Service fdd496
     USA  English_United States.1252
Packit Service fdd496
     UZB  Uzbek (Latin)_Uzbekistan.1254
Packit Service fdd496
     VIT  Vietnamese_Viet Nam.1258
Packit Service fdd496
     XHO  Xhosa_South Africa.1252
Packit Service fdd496
     ZHH  Chinese_Hong Kong S.A.R..950
Packit Service fdd496
     ZHI  Chinese_Singapore.936
Packit Service fdd496
     ZHM  Chinese_Macau S.A.R..950
Packit Service fdd496
     ZUL  Zulu_South Africa.1252
Packit Service fdd496
 */
Packit Service fdd496
Packit Service fdd496
/* Table from ISO 639 language code, optionally with country or script suffix,
Packit Service fdd496
   to English name.
Packit Service fdd496
   Keep in sync with the gl_locale_name_from_win32_LANGID function in
Packit Service fdd496
   localename.c!  */
Packit Service fdd496
struct table_entry
Packit Service fdd496
{
Packit Service fdd496
  const char *code;
Packit Service fdd496
  const char *english;
Packit Service fdd496
};
Packit Service fdd496
static const struct table_entry language_table[] =
Packit Service fdd496
  {
Packit Service fdd496
    { "af", "Afrikaans" },
Packit Service fdd496
    { "am", "Amharic" },
Packit Service fdd496
    { "ar", "Arabic" },
Packit Service fdd496
    { "arn", "Mapudungun" },
Packit Service fdd496
    { "as", "Assamese" },
Packit Service fdd496
    { "az@cyrillic", "Azeri (Cyrillic)" },
Packit Service fdd496
    { "az@latin", "Azeri (Latin)" },
Packit Service fdd496
    { "ba", "Bashkir" },
Packit Service fdd496
    { "be", "Belarusian" },
Packit Service fdd496
    { "ber", "Tamazight" },
Packit Service fdd496
    { "ber@arabic", "Tamazight (Arabic)" },
Packit Service fdd496
    { "ber@latin", "Tamazight (Latin)" },
Packit Service fdd496
    { "bg", "Bulgarian" },
Packit Service fdd496
    { "bin", "Edo" },
Packit Service fdd496
    { "bn", "Bengali" },
Packit Service fdd496
    { "bn_BD", "Bengali (Bangladesh)" },
Packit Service fdd496
    { "bn_IN", "Bengali (India)" },
Packit Service fdd496
    { "bnt", "Sutu" },
Packit Service fdd496
    { "bo", "Tibetan" },
Packit Service fdd496
    { "br", "Breton" },
Packit Service fdd496
    { "bs", "BSB" }, /* "Bosnian (Latin)" */
Packit Service fdd496
    { "bs@cyrillic", "BSC" }, /* Bosnian (Cyrillic) */
Packit Service fdd496
    { "ca", "Catalan" },
Packit Service fdd496
    { "chr", "Cherokee" },
Packit Service fdd496
    { "co", "Corsican" },
Packit Service fdd496
    { "cpe", "Hawaiian" },
Packit Service fdd496
    { "cs", "Czech" },
Packit Service fdd496
    { "cy", "Welsh" },
Packit Service fdd496
    { "da", "Danish" },
Packit Service fdd496
    { "de", "German" },
Packit Service fdd496
    { "dsb", "Lower Sorbian" },
Packit Service fdd496
    { "dv", "Divehi" },
Packit Service fdd496
    { "el", "Greek" },
Packit Service fdd496
    { "en", "English" },
Packit Service fdd496
    { "es", "Spanish" },
Packit Service fdd496
    { "et", "Estonian" },
Packit Service fdd496
    { "eu", "Basque" },
Packit Service fdd496
    { "fa", "Farsi" },
Packit Service fdd496
    { "ff", "Fulfulde" },
Packit Service fdd496
    { "fi", "Finnish" },
Packit Service fdd496
    { "fo", "Faroese" }, /* "Faeroese" does not work */
Packit Service fdd496
    { "fr", "French" },
Packit Service fdd496
    { "fy", "Frisian" },
Packit Service fdd496
    { "ga", "IRE" }, /* Gaelic (Ireland) */
Packit Service fdd496
    { "gd", "Gaelic (Scotland)" },
Packit Service fdd496
    { "gd", "Scottish Gaelic" },
Packit Service fdd496
    { "gl", "Galician" },
Packit Service fdd496
    { "gn", "Guarani" },
Packit Service fdd496
    { "gsw", "Alsatian" },
Packit Service fdd496
    { "gu", "Gujarati" },
Packit Service fdd496
    { "ha", "Hausa" },
Packit Service fdd496
    { "he", "Hebrew" },
Packit Service fdd496
    { "hi", "Hindi" },
Packit Service fdd496
    { "hr", "Croatian" },
Packit Service fdd496
    { "hsb", "Upper Sorbian" },
Packit Service fdd496
    { "hu", "Hungarian" },
Packit Service fdd496
    { "hy", "Armenian" },
Packit Service fdd496
    { "id", "Indonesian" },
Packit Service fdd496
    { "ig", "Igbo" },
Packit Service fdd496
    { "ii", "Yi" },
Packit Service fdd496
    { "is", "Icelandic" },
Packit Service fdd496
    { "it", "Italian" },
Packit Service fdd496
    { "iu", "IUK" }, /* Inuktitut */
Packit Service fdd496
    { "ja", "Japanese" },
Packit Service fdd496
    { "ka", "Georgian" },
Packit Service fdd496
    { "kk", "Kazakh" },
Packit Service fdd496
    { "kl", "Greenlandic" },
Packit Service fdd496
    { "km", "Cambodian" },
Packit Service fdd496
    { "km", "Khmer" },
Packit Service fdd496
    { "kn", "Kannada" },
Packit Service fdd496
    { "ko", "Korean" },
Packit Service fdd496
    { "kok", "Konkani" },
Packit Service fdd496
    { "kr", "Kanuri" },
Packit Service fdd496
    { "ks", "Kashmiri" },
Packit Service fdd496
    { "ks_IN", "Kashmiri_India" },
Packit Service fdd496
    { "ks_PK", "Kashmiri (Arabic)_Pakistan" },
Packit Service fdd496
    { "ky", "Kyrgyz" },
Packit Service fdd496
    { "la", "Latin" },
Packit Service fdd496
    { "lb", "Luxembourgish" },
Packit Service fdd496
    { "lo", "Lao" },
Packit Service fdd496
    { "lt", "Lithuanian" },
Packit Service fdd496
    { "lv", "Latvian" },
Packit Service fdd496
    { "mi", "Maori" },
Packit Service fdd496
    { "mk", "FYRO Macedonian" },
Packit Service fdd496
    { "mk", "Macedonian" },
Packit Service fdd496
    { "ml", "Malayalam" },
Packit Service fdd496
    { "mn", "Mongolian" },
Packit Service fdd496
    { "mni", "Manipuri" },
Packit Service fdd496
    { "moh", "Mohawk" },
Packit Service fdd496
    { "mr", "Marathi" },
Packit Service fdd496
    { "ms", "Malay" },
Packit Service fdd496
    { "mt", "Maltese" },
Packit Service fdd496
    { "my", "Burmese" },
Packit Service fdd496
    { "nb", "NOR" }, /* Norwegian Bokmål */
Packit Service fdd496
    { "ne", "Nepali" },
Packit Service fdd496
    { "nic", "Ibibio" },
Packit Service fdd496
    { "nl", "Dutch" },
Packit Service fdd496
    { "nn", "NON" }, /* Norwegian Nynorsk */
Packit Service fdd496
    { "no", "Norwegian" },
Packit Service fdd496
    { "nso", "Northern Sotho" },
Packit Service fdd496
    { "nso", "Sepedi" },
Packit Service fdd496
    { "oc", "Occitan" },
Packit Service fdd496
    { "om", "Oromo" },
Packit Service fdd496
    { "or", "Oriya" },
Packit Service fdd496
    { "pa", "Punjabi" },
Packit Service fdd496
    { "pap", "Papiamentu" },
Packit Service fdd496
    { "pl", "Polish" },
Packit Service fdd496
    { "prs", "Dari" },
Packit Service fdd496
    { "ps", "Pashto" },
Packit Service fdd496
    { "pt", "Portuguese" },
Packit Service fdd496
    { "qu", "Quechua" },
Packit Service fdd496
    { "qut", "K'iche'" },
Packit Service fdd496
    { "rm", "Romansh" },
Packit Service fdd496
    { "ro", "Romanian" },
Packit Service fdd496
    { "ru", "Russian" },
Packit Service fdd496
    { "rw", "Kinyarwanda" },
Packit Service fdd496
    { "sa", "Sanskrit" },
Packit Service fdd496
    { "sah", "Yakut" },
Packit Service fdd496
    { "sd", "Sindhi" },
Packit Service fdd496
    { "se", "Sami (Northern)" },
Packit Service fdd496
    { "se", "Northern Sami" },
Packit Service fdd496
    { "si", "Sinhalese" },
Packit Service fdd496
    { "sk", "Slovak" },
Packit Service fdd496
    { "sl", "Slovenian" },
Packit Service fdd496
    { "sma", "Sami (Southern)" },
Packit Service fdd496
    { "sma", "Southern Sami" },
Packit Service fdd496
    { "smj", "Sami (Lule)" },
Packit Service fdd496
    { "smj", "Lule Sami" },
Packit Service fdd496
    { "smn", "Sami (Inari)" },
Packit Service fdd496
    { "smn", "Inari Sami" },
Packit Service fdd496
    { "sms", "Sami (Skolt)" },
Packit Service fdd496
    { "sms", "Skolt Sami" },
Packit Service fdd496
    { "so", "Somali" },
Packit Service fdd496
    { "sq", "Albanian" },
Packit Service fdd496
    { "sr", "Serbian (Latin)" },
Packit Service fdd496
    { "sr@cyrillic", "SRB" }, /* Serbian (Cyrillic) */
Packit Service fdd496
    { "sv", "Swedish" },
Packit Service fdd496
    { "sw", "Swahili" },
Packit Service fdd496
    { "syr", "Syriac" },
Packit Service fdd496
    { "ta", "Tamil" },
Packit Service fdd496
    { "te", "Telugu" },
Packit Service fdd496
    { "tg", "Tajik" },
Packit Service fdd496
    { "th", "Thai" },
Packit Service fdd496
    { "ti", "Tigrinya" },
Packit Service fdd496
    { "tk", "Turkmen" },
Packit Service fdd496
    { "tl", "Filipino" },
Packit Service fdd496
    { "tn", "Tswana" },
Packit Service fdd496
    { "tr", "Turkish" },
Packit Service fdd496
    { "ts", "Tsonga" },
Packit Service fdd496
    { "tt", "Tatar" },
Packit Service fdd496
    { "ug", "Uighur" },
Packit Service fdd496
    { "uk", "Ukrainian" },
Packit Service fdd496
    { "ur", "Urdu" },
Packit Service fdd496
    { "uz", "Uzbek" },
Packit Service fdd496
    { "uz", "Uzbek (Latin)" },
Packit Service fdd496
    { "uz@cyrillic", "Uzbek (Cyrillic)" },
Packit Service fdd496
    { "ve", "Venda" },
Packit Service fdd496
    { "vi", "Vietnamese" },
Packit Service fdd496
    { "wen", "Sorbian" },
Packit Service fdd496
    { "wo", "Wolof" },
Packit Service fdd496
    { "xh", "Xhosa" },
Packit Service fdd496
    { "yi", "Yiddish" },
Packit Service fdd496
    { "yo", "Yoruba" },
Packit Service fdd496
    { "zh", "Chinese" },
Packit Service fdd496
    { "zu", "Zulu" }
Packit Service fdd496
  };
Packit Service fdd496
Packit Service fdd496
/* Table from ISO 3166 country code to English name.
Packit Service fdd496
   Keep in sync with the gl_locale_name_from_win32_LANGID function in
Packit Service fdd496
   localename.c!  */
Packit Service fdd496
static const struct table_entry country_table[] =
Packit Service fdd496
  {
Packit Service fdd496
    { "AE", "U.A.E." },
Packit Service fdd496
    { "AF", "Afghanistan" },
Packit Service fdd496
    { "AL", "Albania" },
Packit Service fdd496
    { "AM", "Armenia" },
Packit Service fdd496
    { "AN", "Netherlands Antilles" },
Packit Service fdd496
    { "AR", "Argentina" },
Packit Service fdd496
    { "AT", "Austria" },
Packit Service fdd496
    { "AU", "Australia" },
Packit Service fdd496
    { "AZ", "Azerbaijan" },
Packit Service fdd496
    { "BA", "Bosnia and Herzegovina" },
Packit Service fdd496
    { "BD", "Bangladesh" },
Packit Service fdd496
    { "BE", "Belgium" },
Packit Service fdd496
    { "BG", "Bulgaria" },
Packit Service fdd496
    { "BH", "Bahrain" },
Packit Service fdd496
    { "BN", "Brunei Darussalam" },
Packit Service fdd496
    { "BO", "Bolivia" },
Packit Service fdd496
    { "BR", "Brazil" },
Packit Service fdd496
    { "BT", "Bhutan" },
Packit Service fdd496
    { "BY", "Belarus" },
Packit Service fdd496
    { "BZ", "Belize" },
Packit Service fdd496
    { "CA", "Canada" },
Packit Service fdd496
    { "CG", "Congo" },
Packit Service fdd496
    { "CH", "Switzerland" },
Packit Service fdd496
    { "CI", "Cote d'Ivoire" },
Packit Service fdd496
    { "CL", "Chile" },
Packit Service fdd496
    { "CM", "Cameroon" },
Packit Service fdd496
    { "CN", "People's Republic of China" },
Packit Service fdd496
    { "CO", "Colombia" },
Packit Service fdd496
    { "CR", "Costa Rica" },
Packit Service fdd496
    { "CS", "Serbia and Montenegro" },
Packit Service fdd496
    { "CZ", "Czech Republic" },
Packit Service fdd496
    { "DE", "Germany" },
Packit Service fdd496
    { "DK", "Denmark" },
Packit Service fdd496
    { "DO", "Dominican Republic" },
Packit Service fdd496
    { "DZ", "Algeria" },
Packit Service fdd496
    { "EC", "Ecuador" },
Packit Service fdd496
    { "EE", "Estonia" },
Packit Service fdd496
    { "EG", "Egypt" },
Packit Service fdd496
    { "ER", "Eritrea" },
Packit Service fdd496
    { "ES", "Spain" },
Packit Service fdd496
    { "ET", "Ethiopia" },
Packit Service fdd496
    { "FI", "Finland" },
Packit Service fdd496
    { "FO", "Faroe Islands" },
Packit Service fdd496
    { "FR", "France" },
Packit Service fdd496
    { "GB", "United Kingdom" },
Packit Service fdd496
    { "GD", "Caribbean" },
Packit Service fdd496
    { "GE", "Georgia" },
Packit Service fdd496
    { "GL", "Greenland" },
Packit Service fdd496
    { "GR", "Greece" },
Packit Service fdd496
    { "GT", "Guatemala" },
Packit Service fdd496
    { "HK", "Hong Kong" },
Packit Service fdd496
    { "HK", "Hong Kong S.A.R." },
Packit Service fdd496
    { "HN", "Honduras" },
Packit Service fdd496
    { "HR", "Croatia" },
Packit Service fdd496
    { "HT", "Haiti" },
Packit Service fdd496
    { "HU", "Hungary" },
Packit Service fdd496
    { "ID", "Indonesia" },
Packit Service fdd496
    { "IE", "Ireland" },
Packit Service fdd496
    { "IL", "Israel" },
Packit Service fdd496
    { "IN", "India" },
Packit Service fdd496
    { "IQ", "Iraq" },
Packit Service fdd496
    { "IR", "Iran" },
Packit Service fdd496
    { "IS", "Iceland" },
Packit Service fdd496
    { "IT", "Italy" },
Packit Service fdd496
    { "JM", "Jamaica" },
Packit Service fdd496
    { "JO", "Jordan" },
Packit Service fdd496
    { "JP", "Japan" },
Packit Service fdd496
    { "KE", "Kenya" },
Packit Service fdd496
    { "KG", "Kyrgyzstan" },
Packit Service fdd496
    { "KH", "Cambodia" },
Packit Service fdd496
    { "KR", "South Korea" },
Packit Service fdd496
    { "KW", "Kuwait" },
Packit Service fdd496
    { "KZ", "Kazakhstan" },
Packit Service fdd496
    { "LA", "Laos" },
Packit Service fdd496
    { "LB", "Lebanon" },
Packit Service fdd496
    { "LI", "Liechtenstein" },
Packit Service fdd496
    { "LK", "Sri Lanka" },
Packit Service fdd496
    { "LT", "Lithuania" },
Packit Service fdd496
    { "LU", "Luxembourg" },
Packit Service fdd496
    { "LV", "Latvia" },
Packit Service fdd496
    { "LY", "Libya" },
Packit Service fdd496
    { "MA", "Morocco" },
Packit Service fdd496
    { "MC", "Principality of Monaco" },
Packit Service fdd496
    { "MD", "Moldava" },
Packit Service fdd496
    { "MD", "Moldova" },
Packit Service fdd496
    { "ME", "Montenegro" },
Packit Service fdd496
    { "MK", "Former Yugoslav Republic of Macedonia" },
Packit Service fdd496
    { "ML", "Mali" },
Packit Service fdd496
    { "MM", "Myanmar" },
Packit Service fdd496
    { "MN", "Mongolia" },
Packit Service fdd496
    { "MO", "Macau S.A.R." },
Packit Service fdd496
    { "MT", "Malta" },
Packit Service fdd496
    { "MV", "Maldives" },
Packit Service fdd496
    { "MX", "Mexico" },
Packit Service fdd496
    { "MY", "Malaysia" },
Packit Service fdd496
    { "NG", "Nigeria" },
Packit Service fdd496
    { "NI", "Nicaragua" },
Packit Service fdd496
    { "NL", "Netherlands" },
Packit Service fdd496
    { "NO", "Norway" },
Packit Service fdd496
    { "NP", "Nepal" },
Packit Service fdd496
    { "NZ", "New Zealand" },
Packit Service fdd496
    { "OM", "Oman" },
Packit Service fdd496
    { "PA", "Panama" },
Packit Service fdd496
    { "PE", "Peru" },
Packit Service fdd496
    { "PH", "Philippines" },
Packit Service fdd496
    { "PK", "Islamic Republic of Pakistan" },
Packit Service fdd496
    { "PL", "Poland" },
Packit Service fdd496
    { "PR", "Puerto Rico" },
Packit Service fdd496
    { "PT", "Portugal" },
Packit Service fdd496
    { "PY", "Paraguay" },
Packit Service fdd496
    { "QA", "Qatar" },
Packit Service fdd496
    { "RE", "Reunion" },
Packit Service fdd496
    { "RO", "Romania" },
Packit Service fdd496
    { "RS", "Serbia" },
Packit Service fdd496
    { "RU", "Russia" },
Packit Service fdd496
    { "RW", "Rwanda" },
Packit Service fdd496
    { "SA", "Saudi Arabia" },
Packit Service fdd496
    { "SE", "Sweden" },
Packit Service fdd496
    { "SG", "Singapore" },
Packit Service fdd496
    { "SI", "Slovenia" },
Packit Service fdd496
    { "SK", "Slovak" },
Packit Service fdd496
    { "SN", "Senegal" },
Packit Service fdd496
    { "SO", "Somalia" },
Packit Service fdd496
    { "SR", "Suriname" },
Packit Service fdd496
    { "SV", "El Salvador" },
Packit Service fdd496
    { "SY", "Syria" },
Packit Service fdd496
    { "TH", "Thailand" },
Packit Service fdd496
    { "TJ", "Tajikistan" },
Packit Service fdd496
    { "TM", "Turkmenistan" },
Packit Service fdd496
    { "TN", "Tunisia" },
Packit Service fdd496
    { "TR", "Turkey" },
Packit Service fdd496
    { "TT", "Trinidad and Tobago" },
Packit Service fdd496
    { "TW", "Taiwan" },
Packit Service fdd496
    { "TZ", "Tanzania" },
Packit Service fdd496
    { "UA", "Ukraine" },
Packit Service fdd496
    { "US", "United States" },
Packit Service fdd496
    { "UY", "Uruguay" },
Packit Service fdd496
    { "VA", "Vatican" },
Packit Service fdd496
    { "VE", "Venezuela" },
Packit Service fdd496
    { "VN", "Viet Nam" },
Packit Service fdd496
    { "YE", "Yemen" },
Packit Service fdd496
    { "ZA", "South Africa" },
Packit Service fdd496
    { "ZW", "Zimbabwe" }
Packit Service fdd496
  };
Packit Service fdd496
Packit Service fdd496
/* Given a string STRING, find the set of indices i such that TABLE[i].code is
Packit Service fdd496
   the given STRING.  It is a range [lo,hi-1].  */
Packit Service fdd496
typedef struct { size_t lo; size_t hi; } range_t;
Packit Service fdd496
static void
Packit Service fdd496
search (const struct table_entry *table, size_t table_size, const char *string,
Packit Service fdd496
        range_t *result)
Packit Service fdd496
{
Packit Service fdd496
  /* The table is sorted.  Perform a binary search.  */
Packit Service fdd496
  size_t hi = table_size;
Packit Service fdd496
  size_t lo = 0;
Packit Service fdd496
  while (lo < hi)
Packit Service fdd496
    {
Packit Service fdd496
      /* Invariant:
Packit Service fdd496
         for i < lo, strcmp (table[i].code, string) < 0,
Packit Service fdd496
         for i >= hi, strcmp (table[i].code, string) > 0.  */
Packit Service fdd496
      size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
Packit Service fdd496
      int cmp = strcmp (table[mid].code, string);
Packit Service fdd496
      if (cmp < 0)
Packit Service fdd496
        lo = mid + 1;
Packit Service fdd496
      else if (cmp > 0)
Packit Service fdd496
        hi = mid;
Packit Service fdd496
      else
Packit Service fdd496
        {
Packit Service fdd496
          /* Found an i with
Packit Service fdd496
               strcmp (language_table[i].code, string) == 0.
Packit Service fdd496
             Find the entire interval of such i.  */
Packit Service fdd496
          {
Packit Service fdd496
            size_t i;
Packit Service fdd496
Packit Service fdd496
            for (i = mid; i > lo; )
Packit Service fdd496
              {
Packit Service fdd496
                i--;
Packit Service fdd496
                if (strcmp (table[i].code, string) < 0)
Packit Service fdd496
                  {
Packit Service fdd496
                    lo = i + 1;
Packit Service fdd496
                    break;
Packit Service fdd496
                  }
Packit Service fdd496
              }
Packit Service fdd496
          }
Packit Service fdd496
          {
Packit Service fdd496
            size_t i;
Packit Service fdd496
Packit Service fdd496
            for (i = mid; i < hi; i++)
Packit Service fdd496
              {
Packit Service fdd496
                if (strcmp (table[i].code, string) > 0)
Packit Service fdd496
                  {
Packit Service fdd496
                    hi = i;
Packit Service fdd496
                    break;
Packit Service fdd496
                  }
Packit Service fdd496
              }
Packit Service fdd496
          }
Packit Service fdd496
          /* The set of i with
Packit Service fdd496
               strcmp (language_table[i].code, string) == 0
Packit Service fdd496
             is the interval [lo, hi-1].  */
Packit Service fdd496
          break;
Packit Service fdd496
        }
Packit Service fdd496
    }
Packit Service fdd496
  result->lo = lo;
Packit Service fdd496
  result->hi = hi;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
/* Like setlocale, but accept also locale names in the form ll or ll_CC,
Packit Service fdd496
   where ll is an ISO 639 language code and CC is an ISO 3166 country code.  */
Packit Service fdd496
static char *
Packit Service fdd496
setlocale_unixlike (int category, const char *locale)
Packit Service fdd496
{
Packit Service fdd496
  char *result;
Packit Service fdd496
  char llCC_buf[64];
Packit Service fdd496
  char ll_buf[64];
Packit Service fdd496
  char CC_buf[64];
Packit Service fdd496
Packit Service fdd496
  /* The native Windows implementation of setlocale understands the special
Packit Service fdd496
     locale name "C", but not "POSIX".  Therefore map "POSIX" to "C".  */
Packit Service fdd496
#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
Packit Service fdd496
  if (locale != NULL && strcmp (locale, "POSIX") == 0)
Packit Service fdd496
    locale = "C";
Packit Service fdd496
#endif
Packit Service fdd496
Packit Service fdd496
  /* First, try setlocale with the original argument unchanged.  */
Packit Service fdd496
  result = setlocale (category, locale);
Packit Service fdd496
  if (result != NULL)
Packit Service fdd496
    return result;
Packit Service fdd496
Packit Service fdd496
  /* Otherwise, assume the argument is in the form
Packit Service fdd496
       language[_territory][.codeset][@modifier]
Packit Service fdd496
     and try to map it using the tables.  */
Packit Service fdd496
  if (strlen (locale) < sizeof (llCC_buf))
Packit Service fdd496
    {
Packit Service fdd496
      /* Second try: Remove the codeset part.  */
Packit Service fdd496
      {
Packit Service fdd496
        const char *p = locale;
Packit Service fdd496
        char *q = llCC_buf;
Packit Service fdd496
Packit Service fdd496
        /* Copy the part before the dot.  */
Packit Service fdd496
        for (; *p != '\0' && *p != '.'; p++, q++)
Packit Service fdd496
          *q = *p;
Packit Service fdd496
        if (*p == '.')
Packit Service fdd496
          /* Skip the part up to the '@', if any.  */
Packit Service fdd496
          for (; *p != '\0' && *p != '@'; p++)
Packit Service fdd496
            ;
Packit Service fdd496
        /* Copy the part starting with '@', if any.  */
Packit Service fdd496
        for (; *p != '\0'; p++, q++)
Packit Service fdd496
          *q = *p;
Packit Service fdd496
        *q = '\0';
Packit Service fdd496
      }
Packit Service fdd496
      /* llCC_buf now contains
Packit Service fdd496
           language[_territory][@modifier]
Packit Service fdd496
       */
Packit Service fdd496
      if (strcmp (llCC_buf, locale) != 0)
Packit Service fdd496
        {
Packit Service fdd496
          result = setlocale (category, llCC_buf);
Packit Service fdd496
          if (result != NULL)
Packit Service fdd496
            return result;
Packit Service fdd496
        }
Packit Service fdd496
      /* Look it up in language_table.  */
Packit Service fdd496
      {
Packit Service fdd496
        range_t range;
Packit Service fdd496
        size_t i;
Packit Service fdd496
Packit Service fdd496
        search (language_table,
Packit Service fdd496
                sizeof (language_table) / sizeof (language_table[0]),
Packit Service fdd496
                llCC_buf,
Packit Service fdd496
                &range);
Packit Service fdd496
Packit Service fdd496
        for (i = range.lo; i < range.hi; i++)
Packit Service fdd496
          {
Packit Service fdd496
            /* Try the replacement in language_table[i].  */
Packit Service fdd496
            result = setlocale (category, language_table[i].english);
Packit Service fdd496
            if (result != NULL)
Packit Service fdd496
              return result;
Packit Service fdd496
          }
Packit Service fdd496
      }
Packit Service fdd496
      /* Split language[_territory][@modifier]
Packit Service fdd496
         into  ll_buf = language[@modifier]
Packit Service fdd496
         and   CC_buf = territory
Packit Service fdd496
       */
Packit Service fdd496
      {
Packit Service fdd496
        const char *underscore = strchr (llCC_buf, '_');
Packit Service fdd496
        if (underscore != NULL)
Packit Service fdd496
          {
Packit Service fdd496
            const char *territory_start = underscore + 1;
Packit Service fdd496
            const char *territory_end = strchr (territory_start, '@');
Packit Service fdd496
            if (territory_end == NULL)
Packit Service fdd496
              territory_end = territory_start + strlen (territory_start);
Packit Service fdd496
Packit Service fdd496
            memcpy (ll_buf, llCC_buf, underscore - llCC_buf);
Packit Service fdd496
            strcpy (ll_buf + (underscore - llCC_buf), territory_end);
Packit Service fdd496
Packit Service fdd496
            memcpy (CC_buf, territory_start, territory_end - territory_start);
Packit Service fdd496
            CC_buf[territory_end - territory_start] = '\0';
Packit Service fdd496
Packit Service fdd496
            {
Packit Service fdd496
              /* Look up ll_buf in language_table
Packit Service fdd496
                 and CC_buf in country_table.  */
Packit Service fdd496
              range_t language_range;
Packit Service fdd496
Packit Service fdd496
              search (language_table,
Packit Service fdd496
                      sizeof (language_table) / sizeof (language_table[0]),
Packit Service fdd496
                      ll_buf,
Packit Service fdd496
                      &language_range);
Packit Service fdd496
              if (language_range.lo < language_range.hi)
Packit Service fdd496
                {
Packit Service fdd496
                  range_t country_range;
Packit Service fdd496
Packit Service fdd496
                  search (country_table,
Packit Service fdd496
                          sizeof (country_table) / sizeof (country_table[0]),
Packit Service fdd496
                          CC_buf,
Packit Service fdd496
                          &country_range);
Packit Service fdd496
                  if (country_range.lo < country_range.hi)
Packit Service fdd496
                    {
Packit Service fdd496
                      size_t i;
Packit Service fdd496
                      size_t j;
Packit Service fdd496
Packit Service fdd496
                      for (i = language_range.lo; i < language_range.hi; i++)
Packit Service fdd496
                        for (j = country_range.lo; j < country_range.hi; j++)
Packit Service fdd496
                          {
Packit Service fdd496
                            /* Concatenate the replacements.  */
Packit Service fdd496
                            const char *part1 = language_table[i].english;
Packit Service fdd496
                            size_t part1_len = strlen (part1);
Packit Service fdd496
                            const char *part2 = country_table[j].english;
Packit Service fdd496
                            size_t part2_len = strlen (part2) + 1;
Packit Service fdd496
                            char buf[64+64];
Packit Service fdd496
Packit Service fdd496
                            if (!(part1_len + 1 + part2_len <= sizeof (buf)))
Packit Service fdd496
                              abort ();
Packit Service fdd496
                            memcpy (buf, part1, part1_len);
Packit Service fdd496
                            buf[part1_len] = '_';
Packit Service fdd496
                            memcpy (buf + part1_len + 1, part2, part2_len);
Packit Service fdd496
Packit Service fdd496
                            /* Try the concatenated replacements.  */
Packit Service fdd496
                            result = setlocale (category, buf);
Packit Service fdd496
                            if (result != NULL)
Packit Service fdd496
                              return result;
Packit Service fdd496
                          }
Packit Service fdd496
                    }
Packit Service fdd496
Packit Service fdd496
                  /* Try omitting the country entirely.  This may set a locale
Packit Service fdd496
                     corresponding to the wrong country, but is better than
Packit Service fdd496
                     failing entirely.  */
Packit Service fdd496
                  {
Packit Service fdd496
                    size_t i;
Packit Service fdd496
Packit Service fdd496
                    for (i = language_range.lo; i < language_range.hi; i++)
Packit Service fdd496
                      {
Packit Service fdd496
                        /* Try only the language replacement.  */
Packit Service fdd496
                        result =
Packit Service fdd496
                          setlocale (category, language_table[i].english);
Packit Service fdd496
                        if (result != NULL)
Packit Service fdd496
                          return result;
Packit Service fdd496
                      }
Packit Service fdd496
                  }
Packit Service fdd496
                }
Packit Service fdd496
            }
Packit Service fdd496
          }
Packit Service fdd496
      }
Packit Service fdd496
    }
Packit Service fdd496
Packit Service fdd496
  /* Failed.  */
Packit Service fdd496
  return NULL;
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
# else
Packit Service fdd496
#  define setlocale_unixlike setlocale
Packit Service fdd496
# endif
Packit Service fdd496
Packit Service fdd496
# if LC_MESSAGES == 1729
Packit Service fdd496
Packit Service fdd496
/* The system does not store an LC_MESSAGES locale category.  Do it here.  */
Packit Service fdd496
static char lc_messages_name[64] = "C";
Packit Service fdd496
Packit Service fdd496
/* Like setlocale, but support also LC_MESSAGES.  */
Packit Service fdd496
static char *
Packit Service fdd496
setlocale_single (int category, const char *locale)
Packit Service fdd496
{
Packit Service fdd496
  if (category == LC_MESSAGES)
Packit Service fdd496
    {
Packit Service fdd496
      if (locale != NULL)
Packit Service fdd496
        {
Packit Service fdd496
          lc_messages_name[sizeof (lc_messages_name) - 1] = '\0';
Packit Service fdd496
          strncpy (lc_messages_name, locale, sizeof (lc_messages_name) - 1);
Packit Service fdd496
        }
Packit Service fdd496
      return lc_messages_name;
Packit Service fdd496
    }
Packit Service fdd496
  else
Packit Service fdd496
    return setlocale_unixlike (category, locale);
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
# else
Packit Service fdd496
#  define setlocale_single setlocale_unixlike
Packit Service fdd496
# endif
Packit Service fdd496
Packit Service fdd496
char *
Packit Service fdd496
rpl_setlocale (int category, const char *locale)
Packit Service fdd496
{
Packit Service fdd496
  if (locale != NULL && locale[0] == '\0')
Packit Service fdd496
    {
Packit Service fdd496
      /* A request to the set the current locale to the default locale.  */
Packit Service fdd496
      if (category == LC_ALL)
Packit Service fdd496
        {
Packit Service fdd496
          /* Set LC_CTYPE first.  Then the other categories.  */
Packit Service fdd496
          static int const categories[] =
Packit Service fdd496
            {
Packit Service fdd496
              LC_NUMERIC,
Packit Service fdd496
              LC_TIME,
Packit Service fdd496
              LC_COLLATE,
Packit Service fdd496
              LC_MONETARY,
Packit Service fdd496
              LC_MESSAGES
Packit Service fdd496
            };
Packit Service fdd496
          char *saved_locale;
Packit Service fdd496
          const char *base_name;
Packit Service fdd496
          unsigned int i;
Packit Service fdd496
Packit Service fdd496
          /* Back up the old locale, in case one of the steps fails.  */
Packit Service fdd496
          saved_locale = setlocale (LC_ALL, NULL);
Packit Service fdd496
          if (saved_locale == NULL)
Packit Service fdd496
            return NULL;
Packit Service fdd496
          saved_locale = strdup (saved_locale);
Packit Service fdd496
          if (saved_locale == NULL)
Packit Service fdd496
            return NULL;
Packit Service fdd496
Packit Service fdd496
          /* Set LC_CTYPE category.  Set all other categories (except possibly
Packit Service fdd496
             LC_MESSAGES) to the same value in the same call; this is likely to
Packit Service fdd496
             save calls.  */
Packit Service fdd496
          base_name =
Packit Service fdd496
            gl_locale_name_environ (LC_CTYPE, category_to_name (LC_CTYPE));
Packit Service fdd496
          if (base_name == NULL)
Packit Service fdd496
            base_name = gl_locale_name_default ();
Packit Service fdd496
Packit Service fdd496
          if (setlocale_unixlike (LC_ALL, base_name) == NULL)
Packit Service fdd496
            goto fail;
Packit Service fdd496
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
Packit Service fdd496
          /* On native Windows, setlocale(LC_ALL,...) may succeed but set the
Packit Service fdd496
             LC_CTYPE category to an invalid value ("C") when it does not
Packit Service fdd496
             support the specified encoding.  Report a failure instead.  */
Packit Service fdd496
          if (strchr (base_name, '.') != NULL
Packit Service fdd496
              && strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
Packit Service fdd496
            goto fail;
Packit Service fdd496
# endif
Packit Service fdd496
Packit Service fdd496
          for (i = 0; i < sizeof (categories) / sizeof (categories[0]); i++)
Packit Service fdd496
            {
Packit Service fdd496
              int cat = categories[i];
Packit Service fdd496
              const char *name;
Packit Service fdd496
Packit Service fdd496
              name = gl_locale_name_environ (cat, category_to_name (cat));
Packit Service fdd496
              if (name == NULL)
Packit Service fdd496
                name = gl_locale_name_default ();
Packit Service fdd496
Packit Service fdd496
              /* If name is the same as base_name, it has already been set
Packit Service fdd496
                 through the setlocale call before the loop.  */
Packit Service fdd496
              if (strcmp (name, base_name) != 0
Packit Service fdd496
# if LC_MESSAGES == 1729
Packit Service fdd496
                  || cat == LC_MESSAGES
Packit Service fdd496
# endif
Packit Service fdd496
                 )
Packit Service fdd496
                if (setlocale_single (cat, name) == NULL)
Packit Service fdd496
                  goto fail;
Packit Service fdd496
            }
Packit Service fdd496
Packit Service fdd496
          /* All steps were successful.  */
Packit Service fdd496
          free (saved_locale);
Packit Service fdd496
          return setlocale (LC_ALL, NULL);
Packit Service fdd496
Packit Service fdd496
        fail:
Packit Service fdd496
          if (saved_locale[0] != '\0') /* don't risk an endless recursion */
Packit Service fdd496
            setlocale (LC_ALL, saved_locale);
Packit Service fdd496
          free (saved_locale);
Packit Service fdd496
          return NULL;
Packit Service fdd496
        }
Packit Service fdd496
      else
Packit Service fdd496
        {
Packit Service fdd496
          const char *name =
Packit Service fdd496
            gl_locale_name_environ (category, category_to_name (category));
Packit Service fdd496
          if (name == NULL)
Packit Service fdd496
            name = gl_locale_name_default ();
Packit Service fdd496
Packit Service fdd496
          return setlocale_single (category, name);
Packit Service fdd496
        }
Packit Service fdd496
    }
Packit Service fdd496
  else
Packit Service fdd496
    {
Packit Service fdd496
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
Packit Service fdd496
      if (category == LC_ALL && locale != NULL && strchr (locale, '.') != NULL)
Packit Service fdd496
        {
Packit Service fdd496
          char *saved_locale;
Packit Service fdd496
Packit Service fdd496
          /* Back up the old locale.  */
Packit Service fdd496
          saved_locale = setlocale (LC_ALL, NULL);
Packit Service fdd496
          if (saved_locale == NULL)
Packit Service fdd496
            return NULL;
Packit Service fdd496
          saved_locale = strdup (saved_locale);
Packit Service fdd496
          if (saved_locale == NULL)
Packit Service fdd496
            return NULL;
Packit Service fdd496
Packit Service fdd496
          if (setlocale_unixlike (LC_ALL, locale) == NULL)
Packit Service fdd496
            {
Packit Service fdd496
              free (saved_locale);
Packit Service fdd496
              return NULL;
Packit Service fdd496
            }
Packit Service fdd496
Packit Service fdd496
          /* On native Windows, setlocale(LC_ALL,...) may succeed but set the
Packit Service fdd496
             LC_CTYPE category to an invalid value ("C") when it does not
Packit Service fdd496
             support the specified encoding.  Report a failure instead.  */
Packit Service fdd496
          if (strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
Packit Service fdd496
            {
Packit Service fdd496
              if (saved_locale[0] != '\0') /* don't risk an endless recursion */
Packit Service fdd496
                setlocale (LC_ALL, saved_locale);
Packit Service fdd496
              free (saved_locale);
Packit Service fdd496
              return NULL;
Packit Service fdd496
            }
Packit Service fdd496
Packit Service fdd496
          /* It was really successful.  */
Packit Service fdd496
          free (saved_locale);
Packit Service fdd496
          return setlocale (LC_ALL, NULL);
Packit Service fdd496
        }
Packit Service fdd496
      else
Packit Service fdd496
# endif
Packit Service fdd496
        return setlocale_single (category, locale);
Packit Service fdd496
    }
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
#endif