Blame gettext-runtime/gnulib-lib/setlocale.c

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