Blame src/w32-gettext.c

Packit fc043f
/* w32-gettext.h - A simple gettext implementation for Windows targets.
Packit fc043f
   Copyright (C) 1995, 1996, 1997, 1999, 2005, 2007,
Packit fc043f
                 2008, 2010 Free Software Foundation, Inc.
Packit fc043f
Packit fc043f
   This file is part of libgpg-error.
Packit fc043f
Packit fc043f
   libgpg-error is free software; you can redistribute it and/or
Packit fc043f
   modify it under the terms of the GNU Lesser General Public License
Packit fc043f
   as published by the Free Software Foundation; either version 2.1 of
Packit fc043f
   the License, or (at your option) any later version.
Packit fc043f
Packit fc043f
   libgpg-error is distributed in the hope that it will be useful, but
Packit fc043f
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit fc043f
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit fc043f
   Lesser General Public License for more details.
Packit fc043f
Packit fc043f
   You should have received a copy of the GNU Lesser General Public
Packit fc043f
   License along with this program; if not, see <https://www.gnu.org/licenses/>.
Packit fc043f
 */
Packit fc043f
Packit fc043f
#if HAVE_CONFIG_H
Packit fc043f
#include <config.h>
Packit fc043f
#endif
Packit fc043f
#if !defined (_WIN32) && !defined (__CYGWIN32__)
Packit fc043f
#  error This module may only be build for Windows or Cygwin32
Packit fc043f
#endif
Packit fc043f
Packit fc043f
#include <stdlib.h>
Packit fc043f
#include <stdio.h>
Packit fc043f
#include <string.h>
Packit fc043f
#include <errno.h>
Packit fc043f
#include <ctype.h>
Packit fc043f
#ifdef HAVE_SYS_TYPES_H
Packit fc043f
#include <sys/types.h>
Packit fc043f
#endif
Packit fc043f
#include <stdint.h>
Packit fc043f
#ifndef HAVE_W32CE_SYSTEM
Packit fc043f
# include <locale.h>
Packit fc043f
#endif /*HAVE_W32CE_SYSTEM*/
Packit fc043f
#include <windows.h>
Packit fc043f
Packit fc043f
#ifdef JNLIB_IN_JNLIB
Packit fc043f
#include "libjnlib-config.h"
Packit fc043f
#endif
Packit fc043f
Packit fc043f
#ifndef jnlib_malloc
Packit fc043f
# define jnlib_malloc(a)    malloc ((a))
Packit fc043f
# define jnlib_calloc(a,b)  calloc ((a), (b))
Packit fc043f
# define jnlib_free(a)      free ((a))
Packit fc043f
# define jnlib_xstrdup(a)   not_used
Packit fc043f
#endif /*!jnlib_malloc*/
Packit fc043f
Packit fc043f
#include "init.h"
Packit fc043f
#include "gpg-error.h"
Packit fc043f
Packit fc043f
#ifdef HAVE_W32CE_SYSTEM
Packit fc043f
/* Forward declaration.  */
Packit fc043f
static wchar_t *utf8_to_wchar (const char *string, size_t length, size_t *retlen);
Packit fc043f
Packit fc043f
static HANDLE
Packit fc043f
MyCreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode,
Packit fc043f
	     LPSECURITY_ATTRIBUTES lpSecurityAttributes,
Packit fc043f
	     DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
Packit fc043f
	     HANDLE hTemplateFile)
Packit fc043f
{
Packit fc043f
  wchar_t *filename;
Packit fc043f
  HANDLE result;
Packit fc043f
  int err;
Packit fc043f
  size_t size;
Packit fc043f
Packit fc043f
  filename = utf8_to_wchar (lpFileName, -1, &size);
Packit fc043f
  if (!filename)
Packit fc043f
    return INVALID_HANDLE_VALUE;
Packit fc043f
Packit fc043f
  result = CreateFileW (filename, dwDesiredAccess, dwSharedMode,
Packit fc043f
			lpSecurityAttributes, dwCreationDisposition,
Packit fc043f
			dwFlagsAndAttributes, hTemplateFile);
Packit fc043f
Packit fc043f
  err = GetLastError ();
Packit fc043f
  free (filename);
Packit fc043f
  SetLastError (err);
Packit fc043f
  return result;
Packit fc043f
}
Packit fc043f
#undef CreateFileA
Packit fc043f
#define CreateFileA MyCreateFileA
Packit fc043f
#endif
Packit fc043f
Packit fc043f

Packit fc043f
/* localname.c from gettext BEGIN.  */
Packit fc043f
Packit fc043f
/* Determine the current selected locale.
Packit fc043f
   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
Packit fc043f
Packit fc043f
   This program is free software; you can redistribute it and/or modify it
Packit fc043f
   under the terms of the GNU Library General Public License as published
Packit fc043f
   by the Free Software Foundation; either version 2, or (at your option)
Packit fc043f
   any later version.
Packit fc043f
Packit fc043f
   This program is distributed in the hope that it will be useful,
Packit fc043f
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit fc043f
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit fc043f
   Library General Public License for more details.
Packit fc043f
Packit fc043f
   You should have received a copy of the GNU Library General Public
Packit fc043f
   License along with this program; if not, write to the Free Software
Packit fc043f
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
Packit fc043f
   USA.  */
Packit fc043f
Packit fc043f
/* Written by Ulrich Drepper <drepper@gnu.org>, 1995.  */
Packit fc043f
/* Win32 code written by Tor Lillqvist <tml@iki.fi>.  */
Packit fc043f
/* Renamed _nl_locale_name, removed unused args, removed include files,
Packit fc043f
   non-W32 code and changed comments <wk@gnupg.org>.  */
Packit fc043f
Packit fc043f
/* Mingw headers don't have latest language and sublanguage codes.  */
Packit fc043f
#ifndef LANG_AFRIKAANS
Packit fc043f
#define LANG_AFRIKAANS 0x36
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ALBANIAN
Packit fc043f
#define LANG_ALBANIAN 0x1c
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_AMHARIC
Packit fc043f
#define LANG_AMHARIC 0x5e
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ARABIC
Packit fc043f
#define LANG_ARABIC 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ARMENIAN
Packit fc043f
#define LANG_ARMENIAN 0x2b
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ASSAMESE
Packit fc043f
#define LANG_ASSAMESE 0x4d
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_AZERI
Packit fc043f
#define LANG_AZERI 0x2c
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_BASQUE
Packit fc043f
#define LANG_BASQUE 0x2d
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_BELARUSIAN
Packit fc043f
#define LANG_BELARUSIAN 0x23
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_BENGALI
Packit fc043f
#define LANG_BENGALI 0x45
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_BURMESE
Packit fc043f
#define LANG_BURMESE 0x55
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_CAMBODIAN
Packit fc043f
#define LANG_CAMBODIAN 0x53
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_CATALAN
Packit fc043f
#define LANG_CATALAN 0x03
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_CHEROKEE
Packit fc043f
#define LANG_CHEROKEE 0x5c
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_DIVEHI
Packit fc043f
#define LANG_DIVEHI 0x65
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_EDO
Packit fc043f
#define LANG_EDO 0x66
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ESTONIAN
Packit fc043f
#define LANG_ESTONIAN 0x25
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_FAEROESE
Packit fc043f
#define LANG_FAEROESE 0x38
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_FARSI
Packit fc043f
#define LANG_FARSI 0x29
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_FRISIAN
Packit fc043f
#define LANG_FRISIAN 0x62
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_FULFULDE
Packit fc043f
#define LANG_FULFULDE 0x67
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_GAELIC
Packit fc043f
#define LANG_GAELIC 0x3c
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_GALICIAN
Packit fc043f
#define LANG_GALICIAN 0x56
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_GEORGIAN
Packit fc043f
#define LANG_GEORGIAN 0x37
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_GUARANI
Packit fc043f
#define LANG_GUARANI 0x74
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_GUJARATI
Packit fc043f
#define LANG_GUJARATI 0x47
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_HAUSA
Packit fc043f
#define LANG_HAUSA 0x68
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_HAWAIIAN
Packit fc043f
#define LANG_HAWAIIAN 0x75
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_HEBREW
Packit fc043f
#define LANG_HEBREW 0x0d
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_HINDI
Packit fc043f
#define LANG_HINDI 0x39
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_IBIBIO
Packit fc043f
#define LANG_IBIBIO 0x69
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_IGBO
Packit fc043f
#define LANG_IGBO 0x70
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_INDONESIAN
Packit fc043f
#define LANG_INDONESIAN 0x21
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_INUKTITUT
Packit fc043f
#define LANG_INUKTITUT 0x5d
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KANNADA
Packit fc043f
#define LANG_KANNADA 0x4b
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KANURI
Packit fc043f
#define LANG_KANURI 0x71
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KASHMIRI
Packit fc043f
#define LANG_KASHMIRI 0x60
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KAZAK
Packit fc043f
#define LANG_KAZAK 0x3f
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KONKANI
Packit fc043f
#define LANG_KONKANI 0x57
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_KYRGYZ
Packit fc043f
#define LANG_KYRGYZ 0x40
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_LAO
Packit fc043f
#define LANG_LAO 0x54
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_LATIN
Packit fc043f
#define LANG_LATIN 0x76
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_LATVIAN
Packit fc043f
#define LANG_LATVIAN 0x26
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_LITHUANIAN
Packit fc043f
#define LANG_LITHUANIAN 0x27
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MACEDONIAN
Packit fc043f
#define LANG_MACEDONIAN 0x2f
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MALAY
Packit fc043f
#define LANG_MALAY 0x3e
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MALAYALAM
Packit fc043f
#define LANG_MALAYALAM 0x4c
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MALTESE
Packit fc043f
#define LANG_MALTESE 0x3a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MANIPURI
Packit fc043f
#define LANG_MANIPURI 0x58
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MARATHI
Packit fc043f
#define LANG_MARATHI 0x4e
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_MONGOLIAN
Packit fc043f
#define LANG_MONGOLIAN 0x50
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_NEPALI
Packit fc043f
#define LANG_NEPALI 0x61
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ORIYA
Packit fc043f
#define LANG_ORIYA 0x48
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_OROMO
Packit fc043f
#define LANG_OROMO 0x72
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_PAPIAMENTU
Packit fc043f
#define LANG_PAPIAMENTU 0x79
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_PASHTO
Packit fc043f
#define LANG_PASHTO 0x63
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_PUNJABI
Packit fc043f
#define LANG_PUNJABI 0x46
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_RHAETO_ROMANCE
Packit fc043f
#define LANG_RHAETO_ROMANCE 0x17
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SAAMI
Packit fc043f
#define LANG_SAAMI 0x3b
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SANSKRIT
Packit fc043f
#define LANG_SANSKRIT 0x4f
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SERBIAN
Packit fc043f
#define LANG_SERBIAN 0x1a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SINDHI
Packit fc043f
#define LANG_SINDHI 0x59
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SINHALESE
Packit fc043f
#define LANG_SINHALESE 0x5b
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SLOVAK
Packit fc043f
#define LANG_SLOVAK 0x1b
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SOMALI
Packit fc043f
#define LANG_SOMALI 0x77
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SORBIAN
Packit fc043f
#define LANG_SORBIAN 0x2e
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SUTU
Packit fc043f
#define LANG_SUTU 0x30
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SWAHILI
Packit fc043f
#define LANG_SWAHILI 0x41
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_SYRIAC
Packit fc043f
#define LANG_SYRIAC 0x5a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TAGALOG
Packit fc043f
#define LANG_TAGALOG 0x64
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TAJIK
Packit fc043f
#define LANG_TAJIK 0x28
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TAMAZIGHT
Packit fc043f
#define LANG_TAMAZIGHT 0x5f
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TAMIL
Packit fc043f
#define LANG_TAMIL 0x49
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TATAR
Packit fc043f
#define LANG_TATAR 0x44
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TELUGU
Packit fc043f
#define LANG_TELUGU 0x4a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_THAI
Packit fc043f
#define LANG_THAI 0x1e
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TIBETAN
Packit fc043f
#define LANG_TIBETAN 0x51
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TIGRINYA
Packit fc043f
#define LANG_TIGRINYA 0x73
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TSONGA
Packit fc043f
#define LANG_TSONGA 0x31
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TSWANA
Packit fc043f
#define LANG_TSWANA 0x32
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_TURKMEN
Packit fc043f
#define LANG_TURKMEN 0x42
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_UKRAINIAN
Packit fc043f
#define LANG_UKRAINIAN 0x22
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_URDU
Packit fc043f
#define LANG_URDU 0x20
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_UZBEK
Packit fc043f
#define LANG_UZBEK 0x43
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_VENDA
Packit fc043f
#define LANG_VENDA 0x33
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_VIETNAMESE
Packit fc043f
#define LANG_VIETNAMESE 0x2a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_WELSH
Packit fc043f
#define LANG_WELSH 0x52
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_XHOSA
Packit fc043f
#define LANG_XHOSA 0x34
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_YI
Packit fc043f
#define LANG_YI 0x78
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_YIDDISH
Packit fc043f
#define LANG_YIDDISH 0x3d
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_YORUBA
Packit fc043f
#define LANG_YORUBA 0x6a
Packit fc043f
#endif
Packit fc043f
#ifndef LANG_ZULU
Packit fc043f
#define LANG_ZULU 0x35
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_SAUDI_ARABIA
Packit fc043f
#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_IRAQ
Packit fc043f
#define SUBLANG_ARABIC_IRAQ 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_EGYPT
Packit fc043f
#define SUBLANG_ARABIC_EGYPT 0x03
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_LIBYA
Packit fc043f
#define SUBLANG_ARABIC_LIBYA 0x04
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_ALGERIA
Packit fc043f
#define SUBLANG_ARABIC_ALGERIA 0x05
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_MOROCCO
Packit fc043f
#define SUBLANG_ARABIC_MOROCCO 0x06
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_TUNISIA
Packit fc043f
#define SUBLANG_ARABIC_TUNISIA 0x07
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_OMAN
Packit fc043f
#define SUBLANG_ARABIC_OMAN 0x08
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_YEMEN
Packit fc043f
#define SUBLANG_ARABIC_YEMEN 0x09
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_SYRIA
Packit fc043f
#define SUBLANG_ARABIC_SYRIA 0x0a
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_JORDAN
Packit fc043f
#define SUBLANG_ARABIC_JORDAN 0x0b
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_LEBANON
Packit fc043f
#define SUBLANG_ARABIC_LEBANON 0x0c
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_KUWAIT
Packit fc043f
#define SUBLANG_ARABIC_KUWAIT 0x0d
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_UAE
Packit fc043f
#define SUBLANG_ARABIC_UAE 0x0e
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_BAHRAIN
Packit fc043f
#define SUBLANG_ARABIC_BAHRAIN 0x0f
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ARABIC_QATAR
Packit fc043f
#define SUBLANG_ARABIC_QATAR 0x10
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_AZERI_LATIN
Packit fc043f
#define SUBLANG_AZERI_LATIN 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_AZERI_CYRILLIC
Packit fc043f
#define SUBLANG_AZERI_CYRILLIC 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_BENGALI_INDIA
Packit fc043f
#define SUBLANG_BENGALI_INDIA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_BENGALI_BANGLADESH
Packit fc043f
#define SUBLANG_BENGALI_BANGLADESH 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_CHINESE_MACAU
Packit fc043f
#define SUBLANG_CHINESE_MACAU 0x05
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
Packit fc043f
#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_JAMAICA
Packit fc043f
#define SUBLANG_ENGLISH_JAMAICA 0x08
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_CARIBBEAN
Packit fc043f
#define SUBLANG_ENGLISH_CARIBBEAN 0x09
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_BELIZE
Packit fc043f
#define SUBLANG_ENGLISH_BELIZE 0x0a
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_TRINIDAD
Packit fc043f
#define SUBLANG_ENGLISH_TRINIDAD 0x0b
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_ZIMBABWE
Packit fc043f
#define SUBLANG_ENGLISH_ZIMBABWE 0x0c
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_PHILIPPINES
Packit fc043f
#define SUBLANG_ENGLISH_PHILIPPINES 0x0d
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_INDONESIA
Packit fc043f
#define SUBLANG_ENGLISH_INDONESIA 0x0e
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_HONGKONG
Packit fc043f
#define SUBLANG_ENGLISH_HONGKONG 0x0f
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_INDIA
Packit fc043f
#define SUBLANG_ENGLISH_INDIA 0x10
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_MALAYSIA
Packit fc043f
#define SUBLANG_ENGLISH_MALAYSIA 0x11
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ENGLISH_SINGAPORE
Packit fc043f
#define SUBLANG_ENGLISH_SINGAPORE 0x12
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_LUXEMBOURG
Packit fc043f
#define SUBLANG_FRENCH_LUXEMBOURG 0x05
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_MONACO
Packit fc043f
#define SUBLANG_FRENCH_MONACO 0x06
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_WESTINDIES
Packit fc043f
#define SUBLANG_FRENCH_WESTINDIES 0x07
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_REUNION
Packit fc043f
#define SUBLANG_FRENCH_REUNION 0x08
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_CONGO
Packit fc043f
#define SUBLANG_FRENCH_CONGO 0x09
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_SENEGAL
Packit fc043f
#define SUBLANG_FRENCH_SENEGAL 0x0a
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_CAMEROON
Packit fc043f
#define SUBLANG_FRENCH_CAMEROON 0x0b
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_COTEDIVOIRE
Packit fc043f
#define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_MALI
Packit fc043f
#define SUBLANG_FRENCH_MALI 0x0d
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_MOROCCO
Packit fc043f
#define SUBLANG_FRENCH_MOROCCO 0x0e
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_FRENCH_HAITI
Packit fc043f
#define SUBLANG_FRENCH_HAITI 0x0f
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_GERMAN_LUXEMBOURG
Packit fc043f
#define SUBLANG_GERMAN_LUXEMBOURG 0x04
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_GERMAN_LIECHTENSTEIN
Packit fc043f
#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_KASHMIRI_INDIA
Packit fc043f
#define SUBLANG_KASHMIRI_INDIA 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_MALAY_MALAYSIA
Packit fc043f
#define SUBLANG_MALAY_MALAYSIA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
Packit fc043f
#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_NEPALI_INDIA
Packit fc043f
#define SUBLANG_NEPALI_INDIA 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_PUNJABI_INDIA
Packit fc043f
#define SUBLANG_PUNJABI_INDIA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_ROMANIAN_ROMANIA
Packit fc043f
#define SUBLANG_ROMANIAN_ROMANIA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SERBIAN_LATIN
Packit fc043f
#define SUBLANG_SERBIAN_LATIN 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SERBIAN_CYRILLIC
Packit fc043f
#define SUBLANG_SERBIAN_CYRILLIC 0x03
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SINDHI_INDIA
Packit fc043f
#define SUBLANG_SINDHI_INDIA 0x00
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SINDHI_PAKISTAN
Packit fc043f
#define SUBLANG_SINDHI_PAKISTAN 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_GUATEMALA
Packit fc043f
#define SUBLANG_SPANISH_GUATEMALA 0x04
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_COSTA_RICA
Packit fc043f
#define SUBLANG_SPANISH_COSTA_RICA 0x05
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_PANAMA
Packit fc043f
#define SUBLANG_SPANISH_PANAMA 0x06
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
Packit fc043f
#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_VENEZUELA
Packit fc043f
#define SUBLANG_SPANISH_VENEZUELA 0x08
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_COLOMBIA
Packit fc043f
#define SUBLANG_SPANISH_COLOMBIA 0x09
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_PERU
Packit fc043f
#define SUBLANG_SPANISH_PERU 0x0a
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_ARGENTINA
Packit fc043f
#define SUBLANG_SPANISH_ARGENTINA 0x0b
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_ECUADOR
Packit fc043f
#define SUBLANG_SPANISH_ECUADOR 0x0c
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_CHILE
Packit fc043f
#define SUBLANG_SPANISH_CHILE 0x0d
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_URUGUAY
Packit fc043f
#define SUBLANG_SPANISH_URUGUAY 0x0e
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_PARAGUAY
Packit fc043f
#define SUBLANG_SPANISH_PARAGUAY 0x0f
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_BOLIVIA
Packit fc043f
#define SUBLANG_SPANISH_BOLIVIA 0x10
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_EL_SALVADOR
Packit fc043f
#define SUBLANG_SPANISH_EL_SALVADOR 0x11
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_HONDURAS
Packit fc043f
#define SUBLANG_SPANISH_HONDURAS 0x12
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_NICARAGUA
Packit fc043f
#define SUBLANG_SPANISH_NICARAGUA 0x13
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SPANISH_PUERTO_RICO
Packit fc043f
#define SUBLANG_SPANISH_PUERTO_RICO 0x14
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_SWEDISH_FINLAND
Packit fc043f
#define SUBLANG_SWEDISH_FINLAND 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_TAMAZIGHT_ARABIC
Packit fc043f
#define SUBLANG_TAMAZIGHT_ARABIC 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_TAMAZIGHT_LATIN
Packit fc043f
#define SUBLANG_TAMAZIGHT_LATIN 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_TIGRINYA_ETHIOPIA
Packit fc043f
#define SUBLANG_TIGRINYA_ETHIOPIA 0x00
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_TIGRINYA_ERITREA
Packit fc043f
#define SUBLANG_TIGRINYA_ERITREA 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_URDU_PAKISTAN
Packit fc043f
#define SUBLANG_URDU_PAKISTAN 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_URDU_INDIA
Packit fc043f
#define SUBLANG_URDU_INDIA 0x02
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_UZBEK_LATIN
Packit fc043f
#define SUBLANG_UZBEK_LATIN 0x01
Packit fc043f
#endif
Packit fc043f
#ifndef SUBLANG_UZBEK_CYRILLIC
Packit fc043f
#define SUBLANG_UZBEK_CYRILLIC 0x02
Packit fc043f
#endif
Packit fc043f
Packit fc043f
/* Return an XPG style locale name
Packit fc043f
     language[_territory[.codeset]][@modifier].
Packit fc043f
   Don't even bother determining the codeset; it's not useful in this
Packit fc043f
   context, because message catalogs are not specific to a single
Packit fc043f
   codeset.  The result must not be freed; it is statically
Packit fc043f
   allocated.  */
Packit fc043f
static const char *
Packit fc043f
my_nl_locale_name (const char *categoryname)
Packit fc043f
{
Packit fc043f
#ifndef HAVE_W32CE_SYSTEM
Packit fc043f
  const char *retval;
Packit fc043f
#endif
Packit fc043f
  LCID lcid;
Packit fc043f
  LANGID langid;
Packit fc043f
  int primary, sub;
Packit fc043f
Packit fc043f
  /* Let the user override the system settings through environment
Packit fc043f
     variables, as on POSIX systems.  */
Packit fc043f
#ifndef HAVE_W32CE_SYSTEM
Packit fc043f
  retval = getenv ("LC_ALL");
Packit fc043f
  if (retval != NULL && retval[0] != '\0')
Packit fc043f
    return retval;
Packit fc043f
  retval = getenv (categoryname);
Packit fc043f
  if (retval != NULL && retval[0] != '\0')
Packit fc043f
    return retval;
Packit fc043f
  retval = getenv ("LANG");
Packit fc043f
  if (retval != NULL && retval[0] != '\0')
Packit fc043f
    return retval;
Packit fc043f
#endif /*!HAVE_W32CE_SYSTEM*/
Packit fc043f
Packit fc043f
  /* Use native Win32 API locale ID.  */
Packit fc043f
#ifdef HAVE_W32CE_SYSTEM
Packit fc043f
  lcid = GetSystemDefaultLCID ();
Packit fc043f
#else
Packit fc043f
  lcid = GetThreadLocale ();
Packit fc043f
#endif
Packit fc043f
Packit fc043f
  /* Strip off the sorting rules, keep only the language part.  */
Packit fc043f
  langid = LANGIDFROMLCID (lcid);
Packit fc043f
Packit fc043f
  /* Split into language and territory part.  */
Packit fc043f
  primary = PRIMARYLANGID (langid);
Packit fc043f
  sub = SUBLANGID (langid);
Packit fc043f
Packit fc043f
  /* Dispatch on language.
Packit fc043f
     For details about languages, see https://www.ethnologue.com/ .  */
Packit fc043f
  switch (primary)
Packit fc043f
    {
Packit fc043f
    case LANG_AFRIKAANS: return "af_ZA";
Packit fc043f
    case LANG_ALBANIAN: return "sq_AL";
Packit fc043f
    case LANG_AMHARIC: return "am_ET";
Packit fc043f
    case LANG_ARABIC:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
Packit fc043f
	case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
Packit fc043f
	case SUBLANG_ARABIC_EGYPT: return "ar_EG";
Packit fc043f
	case SUBLANG_ARABIC_LIBYA: return "ar_LY";
Packit fc043f
	case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
Packit fc043f
	case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
Packit fc043f
	case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
Packit fc043f
	case SUBLANG_ARABIC_OMAN: return "ar_OM";
Packit fc043f
	case SUBLANG_ARABIC_YEMEN: return "ar_YE";
Packit fc043f
	case SUBLANG_ARABIC_SYRIA: return "ar_SY";
Packit fc043f
	case SUBLANG_ARABIC_JORDAN: return "ar_JO";
Packit fc043f
	case SUBLANG_ARABIC_LEBANON: return "ar_LB";
Packit fc043f
	case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
Packit fc043f
	case SUBLANG_ARABIC_UAE: return "ar_AE";
Packit fc043f
	case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
Packit fc043f
	case SUBLANG_ARABIC_QATAR: return "ar_QA";
Packit fc043f
	}
Packit fc043f
      return "ar";
Packit fc043f
    case LANG_ARMENIAN: return "hy_AM";
Packit fc043f
    case LANG_ASSAMESE: return "as_IN";
Packit fc043f
    case LANG_AZERI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	/* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
Packit fc043f
	case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
Packit fc043f
	case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
Packit fc043f
	}
Packit fc043f
      return "az";
Packit fc043f
    case LANG_BASQUE:
Packit fc043f
      return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
Packit fc043f
    case LANG_BELARUSIAN: return "be_BY";
Packit fc043f
    case LANG_BENGALI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_BENGALI_INDIA: return "bn_IN";
Packit fc043f
	case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
Packit fc043f
	}
Packit fc043f
      return "bn";
Packit fc043f
    case LANG_BULGARIAN: return "bg_BG";
Packit fc043f
    case LANG_BURMESE: return "my_MM";
Packit fc043f
    case LANG_CAMBODIAN: return "km_KH";
Packit fc043f
    case LANG_CATALAN: return "ca_ES";
Packit fc043f
    case LANG_CHEROKEE: return "chr_US";
Packit fc043f
    case LANG_CHINESE:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
Packit fc043f
	case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
Packit fc043f
	case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
Packit fc043f
	case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
Packit fc043f
	case SUBLANG_CHINESE_MACAU: return "zh_MO";
Packit fc043f
	}
Packit fc043f
      return "zh";
Packit fc043f
    case LANG_CROATIAN:		/* LANG_CROATIAN == LANG_SERBIAN
Packit fc043f
				 * What used to be called Serbo-Croatian
Packit fc043f
				 * should really now be two separate
Packit fc043f
				 * languages because of political reasons.
Packit fc043f
				 * (Says tml, who knows nothing about Serbian
Packit fc043f
				 * or Croatian.)
Packit fc043f
				 * (I can feel those flames coming already.)
Packit fc043f
				 */
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_DEFAULT: return "hr_HR";
Packit fc043f
	case SUBLANG_SERBIAN_LATIN: return "sr_CS";
Packit fc043f
	case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
Packit fc043f
	}
Packit fc043f
      return "hr";
Packit fc043f
    case LANG_CZECH: return "cs_CZ";
Packit fc043f
    case LANG_DANISH: return "da_DK";
Packit fc043f
    case LANG_DIVEHI: return "div_MV";
Packit fc043f
    case LANG_DUTCH:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_DUTCH: return "nl_NL";
Packit fc043f
	case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
Packit fc043f
	}
Packit fc043f
      return "nl";
Packit fc043f
    case LANG_EDO: return "bin_NG";
Packit fc043f
    case LANG_ENGLISH:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	/* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
Packit fc043f
	 * English was the language spoken in England.
Packit fc043f
	 * Oh well.
Packit fc043f
	 */
Packit fc043f
	case SUBLANG_ENGLISH_US: return "en_US";
Packit fc043f
	case SUBLANG_ENGLISH_UK: return "en_GB";
Packit fc043f
	case SUBLANG_ENGLISH_AUS: return "en_AU";
Packit fc043f
	case SUBLANG_ENGLISH_CAN: return "en_CA";
Packit fc043f
	case SUBLANG_ENGLISH_NZ: return "en_NZ";
Packit fc043f
	case SUBLANG_ENGLISH_EIRE: return "en_IE";
Packit fc043f
	case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
Packit fc043f
	case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
Packit fc043f
	case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
Packit fc043f
	case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
Packit fc043f
	case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
Packit fc043f
	case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
Packit fc043f
	case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
Packit fc043f
	case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
Packit fc043f
	case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
Packit fc043f
	case SUBLANG_ENGLISH_INDIA: return "en_IN";
Packit fc043f
	case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
Packit fc043f
	case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
Packit fc043f
	}
Packit fc043f
      return "en";
Packit fc043f
    case LANG_ESTONIAN: return "et_EE";
Packit fc043f
    case LANG_FAEROESE: return "fo_FO";
Packit fc043f
    case LANG_FARSI: return "fa_IR";
Packit fc043f
    case LANG_FINNISH: return "fi_FI";
Packit fc043f
    case LANG_FRENCH:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_FRENCH: return "fr_FR";
Packit fc043f
	case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
Packit fc043f
	case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
Packit fc043f
	case SUBLANG_FRENCH_SWISS: return "fr_CH";
Packit fc043f
	case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
Packit fc043f
	case SUBLANG_FRENCH_MONACO: return "fr_MC";
Packit fc043f
	case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
Packit fc043f
	case SUBLANG_FRENCH_REUNION: return "fr_RE";
Packit fc043f
	case SUBLANG_FRENCH_CONGO: return "fr_CG";
Packit fc043f
	case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
Packit fc043f
	case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
Packit fc043f
	case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
Packit fc043f
	case SUBLANG_FRENCH_MALI: return "fr_ML";
Packit fc043f
	case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
Packit fc043f
	case SUBLANG_FRENCH_HAITI: return "fr_HT";
Packit fc043f
	}
Packit fc043f
      return "fr";
Packit fc043f
    case LANG_FRISIAN: return "fy_NL";
Packit fc043f
    case LANG_FULFULDE: return "ful_NG";
Packit fc043f
    case LANG_GAELIC:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case 0x01: /* SCOTTISH */ return "gd_GB";
Packit fc043f
	case 0x02: /* IRISH */ return "ga_IE";
Packit fc043f
	}
Packit fc043f
      return "C";
Packit fc043f
    case LANG_GALICIAN: return "gl_ES";
Packit fc043f
    case LANG_GEORGIAN: return "ka_GE";
Packit fc043f
    case LANG_GERMAN:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_GERMAN: return "de_DE";
Packit fc043f
	case SUBLANG_GERMAN_SWISS: return "de_CH";
Packit fc043f
	case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
Packit fc043f
	case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
Packit fc043f
	case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
Packit fc043f
	}
Packit fc043f
      return "de";
Packit fc043f
    case LANG_GREEK: return "el_GR";
Packit fc043f
    case LANG_GUARANI: return "gn_PY";
Packit fc043f
    case LANG_GUJARATI: return "gu_IN";
Packit fc043f
    case LANG_HAUSA: return "ha_NG";
Packit fc043f
    case LANG_HAWAIIAN:
Packit fc043f
      /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
Packit fc043f
	 or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
Packit fc043f
      return "cpe_US";
Packit fc043f
    case LANG_HEBREW: return "he_IL";
Packit fc043f
    case LANG_HINDI: return "hi_IN";
Packit fc043f
    case LANG_HUNGARIAN: return "hu_HU";
Packit fc043f
    case LANG_IBIBIO: return "nic_NG";
Packit fc043f
    case LANG_ICELANDIC: return "is_IS";
Packit fc043f
    case LANG_IGBO: return "ibo_NG";
Packit fc043f
    case LANG_INDONESIAN: return "id_ID";
Packit fc043f
    case LANG_INUKTITUT: return "iu_CA";
Packit fc043f
    case LANG_ITALIAN:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_ITALIAN: return "it_IT";
Packit fc043f
	case SUBLANG_ITALIAN_SWISS: return "it_CH";
Packit fc043f
	}
Packit fc043f
      return "it";
Packit fc043f
    case LANG_JAPANESE: return "ja_JP";
Packit fc043f
    case LANG_KANNADA: return "kn_IN";
Packit fc043f
    case LANG_KANURI: return "kau_NG";
Packit fc043f
    case LANG_KASHMIRI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_DEFAULT: return "ks_PK";
Packit fc043f
	case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
Packit fc043f
	}
Packit fc043f
      return "ks";
Packit fc043f
    case LANG_KAZAK: return "kk_KZ";
Packit fc043f
    case LANG_KONKANI:
Packit fc043f
      /* FIXME: Adjust this when such locales appear on Unix.  */
Packit fc043f
      return "kok_IN";
Packit fc043f
    case LANG_KOREAN: return "ko_KR";
Packit fc043f
    case LANG_KYRGYZ: return "ky_KG";
Packit fc043f
    case LANG_LAO: return "lo_LA";
Packit fc043f
    case LANG_LATIN: return "la_VA";
Packit fc043f
    case LANG_LATVIAN: return "lv_LV";
Packit fc043f
    case LANG_LITHUANIAN: return "lt_LT";
Packit fc043f
    case LANG_MACEDONIAN: return "mk_MK";
Packit fc043f
    case LANG_MALAY:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
Packit fc043f
	case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
Packit fc043f
	}
Packit fc043f
      return "ms";
Packit fc043f
    case LANG_MALAYALAM: return "ml_IN";
Packit fc043f
    case LANG_MALTESE: return "mt_MT";
Packit fc043f
    case LANG_MANIPURI:
Packit fc043f
      /* FIXME: Adjust this when such locales appear on Unix.  */
Packit fc043f
      return "mni_IN";
Packit fc043f
    case LANG_MARATHI: return "mr_IN";
Packit fc043f
    case LANG_MONGOLIAN:
Packit fc043f
      return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
Packit fc043f
    case LANG_NEPALI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_DEFAULT: return "ne_NP";
Packit fc043f
	case SUBLANG_NEPALI_INDIA: return "ne_IN";
Packit fc043f
	}
Packit fc043f
      return "ne";
Packit fc043f
    case LANG_NORWEGIAN:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO";
Packit fc043f
	case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
Packit fc043f
	}
Packit fc043f
      return "no";
Packit fc043f
    case LANG_ORIYA: return "or_IN";
Packit fc043f
    case LANG_OROMO: return "om_ET";
Packit fc043f
    case LANG_PAPIAMENTU: return "pap_AN";
Packit fc043f
    case LANG_PASHTO:
Packit fc043f
      return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
Packit fc043f
    case LANG_POLISH: return "pl_PL";
Packit fc043f
    case LANG_PORTUGUESE:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_PORTUGUESE: return "pt_PT";
Packit fc043f
	/* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
Packit fc043f
	   Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
Packit fc043f
	case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
Packit fc043f
	}
Packit fc043f
      return "pt";
Packit fc043f
    case LANG_PUNJABI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
Packit fc043f
	}
Packit fc043f
      return "pa";
Packit fc043f
    case LANG_RHAETO_ROMANCE: return "rm_CH";
Packit fc043f
    case LANG_ROMANIAN:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
Packit fc043f
	}
Packit fc043f
      return "ro";
Packit fc043f
    case LANG_RUSSIAN:
Packit fc043f
      return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD".  */
Packit fc043f
    case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
Packit fc043f
    case LANG_SANSKRIT: return "sa_IN";
Packit fc043f
    case LANG_SINDHI:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_SINDHI_INDIA: return "sd_IN";
Packit fc043f
	case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
Packit fc043f
	}
Packit fc043f
      return "sd";
Packit fc043f
    case LANG_SINHALESE: return "si_LK";
Packit fc043f
    case LANG_SLOVAK: return "sk_SK";
Packit fc043f
    case LANG_SLOVENIAN: return "sl_SI";
Packit fc043f
    case LANG_SOMALI: return "so_SO";
Packit fc043f
    case LANG_SORBIAN:
Packit fc043f
      /* FIXME: Adjust this when such locales appear on Unix.  */
Packit fc043f
      return "wen_DE";
Packit fc043f
    case LANG_SPANISH:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_SPANISH: return "es_ES";
Packit fc043f
	case SUBLANG_SPANISH_MEXICAN: return "es_MX";
Packit fc043f
	case SUBLANG_SPANISH_MODERN:
Packit fc043f
	  return "es_ES@modern";	/* not seen on Unix */
Packit fc043f
	case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
Packit fc043f
	case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
Packit fc043f
	case SUBLANG_SPANISH_PANAMA: return "es_PA";
Packit fc043f
	case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
Packit fc043f
	case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
Packit fc043f
	case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
Packit fc043f
	case SUBLANG_SPANISH_PERU: return "es_PE";
Packit fc043f
	case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
Packit fc043f
	case SUBLANG_SPANISH_ECUADOR: return "es_EC";
Packit fc043f
	case SUBLANG_SPANISH_CHILE: return "es_CL";
Packit fc043f
	case SUBLANG_SPANISH_URUGUAY: return "es_UY";
Packit fc043f
	case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
Packit fc043f
	case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
Packit fc043f
	case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
Packit fc043f
	case SUBLANG_SPANISH_HONDURAS: return "es_HN";
Packit fc043f
	case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
Packit fc043f
	case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
Packit fc043f
	}
Packit fc043f
      return "es";
Packit fc043f
    case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
Packit fc043f
    case LANG_SWAHILI: return "sw_KE";
Packit fc043f
    case LANG_SWEDISH:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_DEFAULT: return "sv_SE";
Packit fc043f
	case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
Packit fc043f
	}
Packit fc043f
      return "sv";
Packit fc043f
    case LANG_SYRIAC: return "syr_TR"; /* An extinct language.  */
Packit fc043f
    case LANG_TAGALOG: return "tl_PH";
Packit fc043f
    case LANG_TAJIK: return "tg_TJ";
Packit fc043f
    case LANG_TAMAZIGHT:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	/* FIXME: Adjust this when Tamazight locales appear on Unix.  */
Packit fc043f
	case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
Packit fc043f
	case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin";
Packit fc043f
	}
Packit fc043f
      return "ber_MA";
Packit fc043f
    case LANG_TAMIL:
Packit fc043f
      return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
Packit fc043f
    case LANG_TATAR: return "tt_RU";
Packit fc043f
    case LANG_TELUGU: return "te_IN";
Packit fc043f
    case LANG_THAI: return "th_TH";
Packit fc043f
    case LANG_TIBETAN: return "bo_CN";
Packit fc043f
    case LANG_TIGRINYA:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
Packit fc043f
	case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
Packit fc043f
	}
Packit fc043f
      return "ti";
Packit fc043f
    case LANG_TSONGA: return "ts_ZA";
Packit fc043f
    case LANG_TSWANA: return "tn_BW";
Packit fc043f
    case LANG_TURKISH: return "tr_TR";
Packit fc043f
    case LANG_TURKMEN: return "tk_TM";
Packit fc043f
    case LANG_UKRAINIAN: return "uk_UA";
Packit fc043f
    case LANG_URDU:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_URDU_PAKISTAN: return "ur_PK";
Packit fc043f
	case SUBLANG_URDU_INDIA: return "ur_IN";
Packit fc043f
	}
Packit fc043f
      return "ur";
Packit fc043f
    case LANG_UZBEK:
Packit fc043f
      switch (sub)
Packit fc043f
	{
Packit fc043f
	case SUBLANG_UZBEK_LATIN: return "uz_UZ";
Packit fc043f
	case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
Packit fc043f
	}
Packit fc043f
      return "uz";
Packit fc043f
    case LANG_VENDA:
Packit fc043f
      return "ve_ZA";
Packit fc043f
    case LANG_VIETNAMESE: return "vi_VN";
Packit fc043f
    case LANG_WELSH: return "cy_GB";
Packit fc043f
    case LANG_XHOSA: return "xh_ZA";
Packit fc043f
    case LANG_YI: return "sit_CN";
Packit fc043f
    case LANG_YIDDISH: return "yi_IL";
Packit fc043f
    case LANG_YORUBA: return "yo_NG";
Packit fc043f
    case LANG_ZULU: return "zu_ZA";
Packit fc043f
    default: return "C";
Packit fc043f
    }
Packit fc043f
}
Packit fc043f
Packit fc043f
/* localname.c from gettext END.  */
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/* Support functions.  */
Packit fc043f
Packit fc043f
static GPG_ERR_INLINE uint32_t
Packit fc043f
do_swap_u32 (uint32_t i)
Packit fc043f
{
Packit fc043f
  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
Packit fc043f
}
Packit fc043f
Packit fc043f
#define SWAPIT(flag, data) ((flag) ? do_swap_u32(data) : (data))
Packit fc043f
Packit fc043f
Packit fc043f
/* We assume to have `unsigned long int' value with at least 32 bits.  */
Packit fc043f
#define HASHWORDBITS 32
Packit fc043f
Packit fc043f
/* The so called `hashpjw' function by P.J. Weinberger
Packit fc043f
   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
Packit fc043f
   1986, 1987 Bell Telephone Laboratories, Inc.]  */
Packit fc043f
static GPG_ERR_INLINE unsigned long
Packit fc043f
hash_string (const char *str_param)
Packit fc043f
{
Packit fc043f
  unsigned long int hval, g;
Packit fc043f
  const char *str = str_param;
Packit fc043f
Packit fc043f
  hval = 0;
Packit fc043f
  while (*str != '\0')
Packit fc043f
    {
Packit fc043f
      hval <<= 4;
Packit fc043f
      hval += (unsigned long int) *str++;
Packit fc043f
      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
Packit fc043f
      if (g != 0)
Packit fc043f
	{
Packit fc043f
	  hval ^= g >> (HASHWORDBITS - 8);
Packit fc043f
	  hval ^= g;
Packit fc043f
	}
Packit fc043f
    }
Packit fc043f
  return hval;
Packit fc043f
}
Packit fc043f
Packit fc043f

Packit fc043f
/* Generic message catalog and gettext stuff.  */
Packit fc043f
Packit fc043f
/* The magic number of the GNU message catalog format.	*/
Packit fc043f
#define MAGIC	      0x950412de
Packit fc043f
#define MAGIC_SWAPPED 0xde120495
Packit fc043f
Packit fc043f
/* Revision number of the currently used .mo (binary) file format.  */
Packit fc043f
#define MO_REVISION_NUMBER 0
Packit fc043f
Packit fc043f
Packit fc043f
/* Header for binary .mo file format.  */
Packit fc043f
struct mo_file_header
Packit fc043f
{
Packit fc043f
  /* The magic number.	*/
Packit fc043f
  uint32_t magic;
Packit fc043f
  /* The revision number of the file format.  */
Packit fc043f
  uint32_t revision;
Packit fc043f
  /* The number of strings pairs.  */
Packit fc043f
  uint32_t nstrings;
Packit fc043f
  /* Offset of table with start offsets of original strings.  */
Packit fc043f
  uint32_t orig_tab_offset;
Packit fc043f
  /* Offset of table with start offsets of translation strings.  */
Packit fc043f
  uint32_t trans_tab_offset;
Packit fc043f
  /* Size of hashing table.  */
Packit fc043f
  uint32_t hash_tab_size;
Packit fc043f
  /* Offset of first hashing entry.  */
Packit fc043f
  uint32_t hash_tab_offset;
Packit fc043f
};
Packit fc043f
Packit fc043f
Packit fc043f
struct string_desc
Packit fc043f
{
Packit fc043f
  /* Length of addressed string.  */
Packit fc043f
  uint32_t length;
Packit fc043f
  /* Offset of string in file.	*/
Packit fc043f
  uint32_t offset;
Packit fc043f
};
Packit fc043f
Packit fc043f
Packit fc043f
struct overflow_space_s
Packit fc043f
{
Packit fc043f
  struct overflow_space_s *next;
Packit fc043f
  uint32_t idx;
Packit fc043f
  uint32_t length;
Packit fc043f
  char d[1];
Packit fc043f
};
Packit fc043f
Packit fc043f
struct loaded_domain
Packit fc043f
{
Packit fc043f
  char *data;
Packit fc043f
  char *data_native; /* Data mapped to the native version of the
Packit fc043f
                        string.  (Allocated along with DATA). */
Packit fc043f
  int must_swap;
Packit fc043f
  uint16_t nstrings; /* Number of strings.  */
Packit fc043f
  uint16_t *mapped;  /* Array of mapping indicators:
Packit fc043f
                        0   := Not mapped (original utf8).
Packit fc043f
                        1   := Mapped to native encoding in overflow space.
Packit fc043f
                        >=2 := Mapped to native encoding. The value
Packit fc043f
                               gives the length of the mapped string.
Packit fc043f
                               Because the terminating nul is included
Packit fc043f
                               in the length and an empty string is
Packit fc043f
                               not allowed, values are always > 1.  */
Packit fc043f
  struct overflow_space_s *overflow_space;
Packit fc043f
  struct string_desc *orig_tab;
Packit fc043f
  struct string_desc *trans_tab;
Packit fc043f
  uint32_t hash_size;
Packit fc043f
  uint32_t *hash_tab;
Packit fc043f
};
Packit fc043f
Packit fc043f
Packit fc043f
/* The list of domains we we are aware of.  This list is protected by
Packit fc043f
   the criticla section DOMAINLIST_ACCESS_CS.  */
Packit fc043f
static struct domainlist_s *domainlist;
Packit fc043f
Packit fc043f
/* A critical section to guard access to the domainlist.  */
Packit fc043f
static CRITICAL_SECTION domainlist_access_cs;
Packit fc043f
Packit fc043f
/* The name of the current domain.  This is a malloced string.  This
Packit fc043f
   is a gobal variable which is not thread-safe.  */
Packit fc043f
static char *current_domainname;
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/* Constructor for this module.  This can only be used if we are a
Packit fc043f
   DLL.  If used as a static lib we can't control the process set; for
Packit fc043f
   example it might be used with a main module which is not build with
Packit fc043f
   mingw and thus does not know how to call the constructors.  */
Packit fc043f
#ifdef DLL_EXPORT
Packit fc043f
static void module_init (void) _GPG_ERR_CONSTRUCTOR;
Packit fc043f
#endif
Packit fc043f
static void
Packit fc043f
module_init (void)
Packit fc043f
{
Packit fc043f
  static int init_done;
Packit fc043f
Packit fc043f
  if (!init_done)
Packit fc043f
    {
Packit fc043f
      InitializeCriticalSection (&domainlist_access_cs);
Packit fc043f
      init_done = 1;
Packit fc043f
    }
Packit fc043f
}
Packit fc043f
Packit fc043f
#if !defined(DLL_EXPORT) || !defined(_GPG_ERR_HAVE_CONSTRUCTOR)
Packit fc043f
void
Packit fc043f
_gpg_w32__init_gettext_module (void)
Packit fc043f
{
Packit fc043f
  module_init ();
Packit fc043f
}
Packit fc043f
#endif
Packit fc043f
Packit fc043f
Packit fc043f
/* Free the domain data.  */
Packit fc043f
static void
Packit fc043f
free_domain (struct loaded_domain *domain)
Packit fc043f
{
Packit fc043f
  struct overflow_space_s *os, *os2;
Packit fc043f
Packit fc043f
  jnlib_free (domain->data);
Packit fc043f
  jnlib_free (domain->mapped);
Packit fc043f
  for (os = domain->overflow_space; os; os = os2)
Packit fc043f
    {
Packit fc043f
      os2 = os->next;
Packit fc043f
      jnlib_free (os);
Packit fc043f
    }
Packit fc043f
  jnlib_free (domain);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
static struct loaded_domain *
Packit fc043f
load_domain (const char *filename)
Packit fc043f
{
Packit fc043f
  HANDLE fh;
Packit fc043f
  DWORD size;
Packit fc043f
  struct mo_file_header *data = NULL;
Packit fc043f
  struct loaded_domain *domain = NULL;
Packit fc043f
  size_t to_read;
Packit fc043f
  char *read_ptr;
Packit fc043f
Packit fc043f
  fh = CreateFileA (filename, GENERIC_READ, FILE_SHARE_WRITE, NULL,
Packit fc043f
                    OPEN_EXISTING, 0, NULL);
Packit fc043f
  if (fh == INVALID_HANDLE_VALUE)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  size = GetFileSize (fh, NULL);
Packit fc043f
  if (size == INVALID_FILE_SIZE)
Packit fc043f
    {
Packit fc043f
      CloseHandle (fh);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  data = (2*size <= size)? NULL : jnlib_malloc (2*size);
Packit fc043f
  if (!data)
Packit fc043f
    {
Packit fc043f
      CloseHandle (fh);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  to_read = size;
Packit fc043f
  read_ptr = (char *) data;
Packit fc043f
  do
Packit fc043f
    {
Packit fc043f
      BOOL res;
Packit fc043f
      DWORD nb;
Packit fc043f
Packit fc043f
      res = ReadFile (fh, read_ptr, to_read, &nb, NULL);
Packit fc043f
      if (! res || nb < to_read)
Packit fc043f
	{
Packit fc043f
	  CloseHandle (fh);
Packit fc043f
	  jnlib_free (data);
Packit fc043f
	  return NULL;
Packit fc043f
	}
Packit fc043f
      read_ptr += nb;
Packit fc043f
      to_read -= nb;
Packit fc043f
    }
Packit fc043f
  while (to_read > 0);
Packit fc043f
  CloseHandle (fh);
Packit fc043f
Packit fc043f
  /* Using the magic number we can test whether it really is a message
Packit fc043f
     catalog file.  */
Packit fc043f
  if (data->magic != MAGIC && data->magic != MAGIC_SWAPPED)
Packit fc043f
    {
Packit fc043f
      /* The magic number is wrong: not a message catalog file.  */
Packit fc043f
      jnlib_free (data);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  domain = jnlib_calloc (1, sizeof *domain);
Packit fc043f
  if (!domain)
Packit fc043f
    {
Packit fc043f
      jnlib_free (data);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
  domain->data = (char *) data;
Packit fc043f
  domain->data_native = (char *) data + size;
Packit fc043f
  domain->must_swap = data->magic != MAGIC;
Packit fc043f
Packit fc043f
  /* Fill in the information about the available tables.  */
Packit fc043f
  switch (SWAPIT (domain->must_swap, data->revision))
Packit fc043f
    {
Packit fc043f
    case MO_REVISION_NUMBER:
Packit fc043f
      {
Packit fc043f
        uint32_t nstrings;
Packit fc043f
Packit fc043f
        /* Because we use 16 bit values for the mapping array, we
Packit fc043f
           can't support more that 65534 strings (65535 would be okay,
Packit fc043f
           but it is often used as a special value).  A PO file with
Packit fc043f
           that many translations is very unlikely given that GnuPG
Packit fc043f
           with its very large number of strings has only about 1600
Packit fc043f
           strings + variants.  */
Packit fc043f
        nstrings = SWAPIT (domain->must_swap, data->nstrings);
Packit fc043f
        if (nstrings > 65534)
Packit fc043f
          goto bailout;
Packit fc043f
        domain->nstrings = nstrings;
Packit fc043f
        domain->orig_tab = (struct string_desc *)
Packit fc043f
          ((char *) data + SWAPIT (domain->must_swap, data->orig_tab_offset));
Packit fc043f
        domain->trans_tab = (struct string_desc *)
Packit fc043f
          ((char *) data + SWAPIT (domain->must_swap, data->trans_tab_offset));
Packit fc043f
        domain->hash_size = SWAPIT (domain->must_swap, data->hash_tab_size);
Packit fc043f
        domain->hash_tab = (uint32_t *)
Packit fc043f
          ((char *) data + SWAPIT (domain->must_swap, data->hash_tab_offset));
Packit fc043f
      }
Packit fc043f
      break;
Packit fc043f
Packit fc043f
    default: /* This is an invalid revision.	*/
Packit fc043f
      goto bailout;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  /* Allocate an array to keep track of code page mappings.  */
Packit fc043f
  domain->mapped = jnlib_calloc (domain->nstrings, sizeof *domain->mapped);
Packit fc043f
  if (domain->mapped)
Packit fc043f
    return domain; /* Okay.  */
Packit fc043f
Packit fc043f
 bailout:
Packit fc043f
  jnlib_free (data);
Packit fc043f
  jnlib_free (domain);
Packit fc043f
  return NULL;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Return a malloced wide char string from an UTF-8 encoded input
Packit fc043f
   string STRING.  Caller must free this value. On failure returns
Packit fc043f
   NULL.  The result of calling this function with STRING set to NULL
Packit fc043f
   is not defined. */
Packit fc043f
static wchar_t *
Packit fc043f
utf8_to_wchar (const char *string, size_t length, size_t *retlen)
Packit fc043f
{
Packit fc043f
  int n;
Packit fc043f
  wchar_t *result;
Packit fc043f
  size_t nbytes;
Packit fc043f
Packit fc043f
  n = MultiByteToWideChar (CP_UTF8, 0, string, length, NULL, 0);
Packit fc043f
  if (n < 0 || (n+1) <= 0)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  nbytes = (size_t)(n+1) * sizeof(*result);
Packit fc043f
  if (nbytes / sizeof(*result) != (n+1))
Packit fc043f
    {
Packit fc043f
      gpg_err_set_errno (ENOMEM);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
  result = jnlib_malloc (nbytes);
Packit fc043f
  if (!result)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  n = MultiByteToWideChar (CP_UTF8, 0, string, length, result, n);
Packit fc043f
  if (n < 0)
Packit fc043f
    {
Packit fc043f
      jnlib_free (result);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
  *retlen = n;
Packit fc043f
  return result;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Return a malloced string encoded in the native console codepage
Packit fc043f
   from the wide char input string STRING.
Packit fc043f
   Caller must free this value. On failure returns NULL.
Packit fc043f
   The result of calling this function with STRING set to NULL
Packit fc043f
   is not defined. */
Packit fc043f
static char *
Packit fc043f
wchar_to_native (const wchar_t *string, size_t length, size_t *retlen)
Packit fc043f
{
Packit fc043f
  int n;
Packit fc043f
  char *result;
Packit fc043f
  unsigned int cpno = GetConsoleOutputCP ();
Packit fc043f
Packit fc043f
  /* GetConsoleOutputCP returns the 8-Bit codepage that should be used
Packit fc043f
     for console output. If the codepage is not returned we fall back
Packit fc043f
     to the codepage GUI programs should use (CP_ACP). */
Packit fc043f
  if (!cpno)
Packit fc043f
    cpno = GetACP ();
Packit fc043f
Packit fc043f
  n = WideCharToMultiByte (cpno, 0, string, length, NULL, 0, NULL, NULL);
Packit fc043f
  if (n < 0 || (n+1) <= 0)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  result = jnlib_malloc (n+1);
Packit fc043f
  if (!result)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  n = WideCharToMultiByte (cpno, 0, string, length, result, n, NULL, NULL);
Packit fc043f
  if (n < 0)
Packit fc043f
    {
Packit fc043f
      jnlib_free (result);
Packit fc043f
      return NULL;
Packit fc043f
    }
Packit fc043f
  *retlen = n;
Packit fc043f
  return result;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Convert UTF8 to the native codepage.  Caller must free the return value. */
Packit fc043f
static char *
Packit fc043f
utf8_to_native (const char *string, size_t length, size_t *retlen)
Packit fc043f
{
Packit fc043f
  wchar_t *wstring;
Packit fc043f
  char *result;
Packit fc043f
  size_t newlen;
Packit fc043f
Packit fc043f
  wstring = utf8_to_wchar (string, length, &newlen);
Packit fc043f
  if (wstring)
Packit fc043f
    {
Packit fc043f
      result = wchar_to_native (wstring, newlen, &newlen);
Packit fc043f
      jnlib_free (wstring);
Packit fc043f
    }
Packit fc043f
  else
Packit fc043f
    result = NULL;
Packit fc043f
  *retlen = result? newlen : 0;
Packit fc043f
  return result;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
/* Specify that the DOMAINNAME message catalog will be found
Packit fc043f
   in DIRNAME rather than in the system locale data base.  */
Packit fc043f
const char *
Packit fc043f
_gpg_w32_bindtextdomain (const char *domainname, const char *dirname)
Packit fc043f
{
Packit fc043f
  const char *catval_full;
Packit fc043f
  char *catval;
Packit fc043f
  char *fname;
Packit fc043f
  const char *retvalue;
Packit fc043f
Packit fc043f
  if (!dirname)
Packit fc043f
    {
Packit fc043f
      struct domainlist_s *dl;
Packit fc043f
Packit fc043f
      retvalue = NULL;
Packit fc043f
      EnterCriticalSection (&domainlist_access_cs);
Packit fc043f
      {
Packit fc043f
        for (dl = domainlist; dl; dl = dl->next)
Packit fc043f
          if (!strcmp (dl->name, domainname))
Packit fc043f
            {
Packit fc043f
              retvalue = dl->dname;
Packit fc043f
              break;
Packit fc043f
            }
Packit fc043f
      }
Packit fc043f
      LeaveCriticalSection (&domainlist_access_cs);
Packit fc043f
      return retvalue;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  /* DIRNAME is "$INSTALLDIR\share\locale".  */
Packit fc043f
Packit fc043f
  /* First find out the category value.  */
Packit fc043f
  catval = NULL;
Packit fc043f
  catval_full = my_nl_locale_name ("LC_MESSAGES");
Packit fc043f
Packit fc043f
  /* Normally we would have to loop over all returned locales and
Packit fc043f
     search for the right file.  See gettext intl/dcigettext.c for all
Packit fc043f
     the gory details.  Here, we only support the basic category, and
Packit fc043f
     ignore everything else.  */
Packit fc043f
  if (catval_full)
Packit fc043f
    {
Packit fc043f
      char *p;
Packit fc043f
Packit fc043f
      catval = jnlib_malloc (strlen (catval_full) + 1);
Packit fc043f
      if (catval)
Packit fc043f
	{
Packit fc043f
	  strcpy (catval, catval_full);
Packit fc043f
	  p = strchr (catval, '_');
Packit fc043f
	  if (p)
Packit fc043f
	    *p = '\0';
Packit fc043f
	}
Packit fc043f
    }
Packit fc043f
  if (!catval)
Packit fc043f
    return NULL;
Packit fc043f
Packit fc043f
  /* Now build the filename string.  The complete filename is this:
Packit fc043f
     DIRNAME + \ + CATVAL + \LC_MESSAGES\ + DOMAINNAME + .mo  */
Packit fc043f
  {
Packit fc043f
    int len = (strlen (dirname) + 1 + strlen (catval) + 13
Packit fc043f
               + strlen (domainname) + 3 + 1);
Packit fc043f
    char *p;
Packit fc043f
Packit fc043f
    fname = jnlib_malloc (len);
Packit fc043f
    if (!fname)
Packit fc043f
      {
Packit fc043f
	jnlib_free (catval);
Packit fc043f
	return NULL;
Packit fc043f
      }
Packit fc043f
Packit fc043f
    p = fname;
Packit fc043f
    strcpy (p, dirname);
Packit fc043f
    p += strlen (dirname);
Packit fc043f
    *(p++) = '\\';
Packit fc043f
    strcpy (p, catval);
Packit fc043f
    p += strlen (catval);
Packit fc043f
    strcpy (p, "\\LC_MESSAGES\\");
Packit fc043f
    p += 13;
Packit fc043f
    strcpy (p, domainname);
Packit fc043f
    p += strlen (domainname);
Packit fc043f
    strcpy (p, ".mo");
Packit fc043f
  }
Packit fc043f
Packit fc043f
  jnlib_free (catval);
Packit fc043f
Packit fc043f
  /* Store the domain information in the domainlist.  */
Packit fc043f
  {
Packit fc043f
    struct domainlist_s *item, *dl;
Packit fc043f
    char *rel_ptr1 = NULL;
Packit fc043f
    char *rel_ptr2 = NULL;
Packit fc043f
Packit fc043f
    item = jnlib_calloc (1, sizeof *dl + strlen (domainname));
Packit fc043f
    if (!item)
Packit fc043f
      {
Packit fc043f
        jnlib_free (fname);
Packit fc043f
        return NULL;
Packit fc043f
      }
Packit fc043f
    strcpy (item->name, domainname);
Packit fc043f
    item->dname = jnlib_malloc (strlen (dirname) +1);
Packit fc043f
    if(!item->dname)
Packit fc043f
      {
Packit fc043f
        jnlib_free (item);
Packit fc043f
        jnlib_free (fname);
Packit fc043f
        return NULL;
Packit fc043f
      }
Packit fc043f
    strcpy (item->dname, dirname);
Packit fc043f
    retvalue = item->dname;
Packit fc043f
Packit fc043f
    EnterCriticalSection (&domainlist_access_cs);
Packit fc043f
    {
Packit fc043f
      for (dl = domainlist; dl; dl = dl->next)
Packit fc043f
        if (!strcmp (dl->name, domainname))
Packit fc043f
          break;
Packit fc043f
      if (!dl) /* First time called for this domainname. */
Packit fc043f
        {
Packit fc043f
          item->fname = fname;
Packit fc043f
          fname = NULL;
Packit fc043f
          item->next = domainlist;
Packit fc043f
          domainlist = item;
Packit fc043f
          item = NULL;
Packit fc043f
        }
Packit fc043f
      else /* Update only.  */
Packit fc043f
        {
Packit fc043f
          rel_ptr1 = dl->fname;
Packit fc043f
          dl->fname = fname;
Packit fc043f
          fname = NULL;
Packit fc043f
          rel_ptr2 = dl->dname;
Packit fc043f
          dl->dname = item->dname;
Packit fc043f
          item->dname = NULL;
Packit fc043f
        }
Packit fc043f
    }
Packit fc043f
    LeaveCriticalSection (&domainlist_access_cs);
Packit fc043f
Packit fc043f
    jnlib_free (item);
Packit fc043f
    jnlib_free (rel_ptr1);
Packit fc043f
    jnlib_free (rel_ptr2);
Packit fc043f
  }
Packit fc043f
Packit fc043f
  return retvalue;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
Packit fc043f

Packit fc043f
static const char *
Packit fc043f
get_plural (const char *data, size_t datalen, unsigned long nplural)
Packit fc043f
{
Packit fc043f
  const char *p;
Packit fc043f
  int idx;
Packit fc043f
Packit fc043f
  /* We only support the Germanic rule.  */
Packit fc043f
  idx = (nplural == 1? 0 : 1);
Packit fc043f
Packit fc043f
  for (; idx; idx--)
Packit fc043f
    {
Packit fc043f
      p = strchr (data, 0) + 1;
Packit fc043f
      if (p >= data+datalen)
Packit fc043f
        return "ERROR in GETTEXT (bad plural entry)";
Packit fc043f
      datalen -= (p-data);
Packit fc043f
      data = p;
Packit fc043f
    }
Packit fc043f
  return data;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
static const char*
Packit fc043f
get_string (struct loaded_domain *domain, uint32_t idx,
Packit fc043f
            int use_plural, unsigned long nplural)
Packit fc043f
{
Packit fc043f
  struct tls_space_s *tls = get_tls ();
Packit fc043f
  struct overflow_space_s *os;
Packit fc043f
  const char *trans;  /* Pointer to the translated entry.  */
Packit fc043f
  size_t translen;    /* Length of that entry.  */
Packit fc043f
Packit fc043f
  if (idx > 65534)
Packit fc043f
    return "ERROR in GETTEXT (too many strings)";
Packit fc043f
Packit fc043f
  if (tls->gt_use_utf8)
Packit fc043f
    {
Packit fc043f
      trans = (domain->data
Packit fc043f
               + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
Packit fc043f
      translen = SWAPIT(domain->must_swap, domain->trans_tab[idx].length);
Packit fc043f
    }
Packit fc043f
  else if (!domain->mapped[idx])
Packit fc043f
    {
Packit fc043f
      /* Not yet mapped.  Map from utf-8 to native encoding now.  */
Packit fc043f
      const char *p_utf8;
Packit fc043f
      size_t plen_utf8, buflen;
Packit fc043f
      char *buf;
Packit fc043f
Packit fc043f
      p_utf8 = (domain->data
Packit fc043f
                + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
Packit fc043f
      plen_utf8 = SWAPIT(domain->must_swap, domain->trans_tab[idx].length);
Packit fc043f
Packit fc043f
      /* We need to include the nul, so that the utf8->wchar->native
Packit fc043f
         conversion chain works correctly and the nul is stored after
Packit fc043f
         the conversion. */
Packit fc043f
      if (p_utf8[plen_utf8])
Packit fc043f
        {
Packit fc043f
          trans = "ERROR in MO file"; /* Terminating zero is missing.  */
Packit fc043f
          translen = 0;
Packit fc043f
          goto leave;
Packit fc043f
        }
Packit fc043f
      plen_utf8++;
Packit fc043f
Packit fc043f
      buf = utf8_to_native (p_utf8, plen_utf8, &buflen);
Packit fc043f
      if (!buf)
Packit fc043f
        {
Packit fc043f
          trans = "ERROR in GETTEXT MALLOC";
Packit fc043f
          translen = 0;
Packit fc043f
        }
Packit fc043f
      else if (buflen <= plen_utf8 && buflen > 1)
Packit fc043f
        {
Packit fc043f
          /* Copy into the DATA_NATIVE area. */
Packit fc043f
          char *p_tmp;
Packit fc043f
Packit fc043f
          p_tmp = (domain->data_native
Packit fc043f
                   + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
Packit fc043f
          memcpy (p_tmp, buf, buflen);
Packit fc043f
          domain->mapped[idx] = buflen;
Packit fc043f
          trans = p_tmp;
Packit fc043f
          translen = buflen;
Packit fc043f
        }
Packit fc043f
      else
Packit fc043f
        {
Packit fc043f
          /* There is not enough space for the translation (or for
Packit fc043f
             whatever reason an empty string is used): Store it in the
Packit fc043f
             overflow_space and mark that in the mapped array.
Packit fc043f
             Because UTF-8 strings are in general longer than the
Packit fc043f
             Windows native encoding, we expect that this won't happen
Packit fc043f
             too often and thus we use a linked list to manage this
Packit fc043f
             space. */
Packit fc043f
          os = jnlib_malloc (sizeof *os + buflen);
Packit fc043f
          if (os)
Packit fc043f
            {
Packit fc043f
              os->idx = idx;
Packit fc043f
              memcpy (os->d, buf, buflen);
Packit fc043f
              os->length = buflen;
Packit fc043f
              os->next = domain->overflow_space;
Packit fc043f
              domain->overflow_space = os;
Packit fc043f
              domain->mapped[idx] = 1;
Packit fc043f
              trans = os->d;
Packit fc043f
              translen = os->length;
Packit fc043f
            }
Packit fc043f
          else
Packit fc043f
            {
Packit fc043f
              trans = "ERROR in GETTEXT MALLOC";
Packit fc043f
              translen = 0;
Packit fc043f
            }
Packit fc043f
        }
Packit fc043f
      if (translen)
Packit fc043f
        translen--;  /* TRANSLEN shall be the size without the nul.  */
Packit fc043f
      jnlib_free (buf);
Packit fc043f
    }
Packit fc043f
  else if (domain->mapped[idx] == 1)
Packit fc043f
    {
Packit fc043f
      /* The translated string is in the overflow_space. */
Packit fc043f
      for (os=domain->overflow_space; os; os = os->next)
Packit fc043f
        if (os->idx == idx)
Packit fc043f
          break;
Packit fc043f
      if (os)
Packit fc043f
        {
Packit fc043f
          trans = os->d;
Packit fc043f
          translen = os->length;
Packit fc043f
        }
Packit fc043f
      else
Packit fc043f
        {
Packit fc043f
          trans = "ERROR in GETTEXT (overflow space)\n";
Packit fc043f
          translen = 0;
Packit fc043f
        }
Packit fc043f
    }
Packit fc043f
  else
Packit fc043f
    {
Packit fc043f
      trans = (domain->data_native
Packit fc043f
               + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset));
Packit fc043f
      translen = domain->mapped[idx];
Packit fc043f
    }
Packit fc043f
Packit fc043f
 leave:
Packit fc043f
  if (use_plural && translen)
Packit fc043f
    return get_plural (trans, translen, nplural);
Packit fc043f
  else
Packit fc043f
    return trans;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
static const char *
Packit fc043f
do_gettext (const char *domainname,
Packit fc043f
            const char *msgid, const char *msgid2, unsigned long nplural)
Packit fc043f
{
Packit fc043f
  struct domainlist_s *dl;
Packit fc043f
  struct loaded_domain *domain;
Packit fc043f
  int load_failed;
Packit fc043f
  uint32_t top, bottom, nstr;
Packit fc043f
  char *filename;
Packit fc043f
Packit fc043f
  if (!domainname)
Packit fc043f
    domainname = current_domainname? current_domainname : "";
Packit fc043f
Packit fc043f
  /* FIXME: The whole locking stuff is a bit questionable because
Packit fc043f
     gettext does not claim to be thread-safe.  We need to investigate
Packit fc043f
     this further.  */
Packit fc043f
Packit fc043f
  load_failed = 0;
Packit fc043f
  domain = NULL;
Packit fc043f
  filename = NULL;
Packit fc043f
  EnterCriticalSection (&domainlist_access_cs);
Packit fc043f
  {
Packit fc043f
    for (dl = domainlist; dl; dl = dl->next)
Packit fc043f
      if (!strcmp (dl->name, domainname))
Packit fc043f
        {
Packit fc043f
          load_failed = dl->load_failed;
Packit fc043f
          domain = dl->domain;
Packit fc043f
          break;
Packit fc043f
        }
Packit fc043f
    if (dl && !domain && !load_failed && dl->fname)
Packit fc043f
      {
Packit fc043f
        filename = jnlib_malloc (strlen (dl->fname) + 1);
Packit fc043f
        if (filename)
Packit fc043f
          strcpy (filename, dl->fname);
Packit fc043f
      }
Packit fc043f
  }
Packit fc043f
  LeaveCriticalSection (&domainlist_access_cs);
Packit fc043f
  if (!dl)
Packit fc043f
    goto not_found; /* DOMAINNAME not bound.  */
Packit fc043f
  if (filename)
Packit fc043f
    {
Packit fc043f
      /* No attempt so far to load the MO file.  Try now.  */
Packit fc043f
      int updated = 0;
Packit fc043f
Packit fc043f
      domain = load_domain (filename);
Packit fc043f
      jnlib_free (filename);
Packit fc043f
      filename = NULL;
Packit fc043f
      EnterCriticalSection (&domainlist_access_cs);
Packit fc043f
      {
Packit fc043f
        for (dl = domainlist; dl; dl = dl->next)
Packit fc043f
          if (!strcmp (dl->name, domainname))
Packit fc043f
            {
Packit fc043f
              if (domain)
Packit fc043f
                dl->domain = domain;
Packit fc043f
              else
Packit fc043f
                dl->load_failed = 1;
Packit fc043f
              updated = 1;
Packit fc043f
              break;
Packit fc043f
            }
Packit fc043f
      }
Packit fc043f
      LeaveCriticalSection (&domainlist_access_cs);
Packit fc043f
      if (!updated)
Packit fc043f
        {
Packit fc043f
          /* Ooops - lost the domain.  */
Packit fc043f
          free_domain (domain);
Packit fc043f
          domain = NULL;
Packit fc043f
        }
Packit fc043f
    }
Packit fc043f
Packit fc043f
  if (!domain)
Packit fc043f
    goto not_found; /* No MO file.  */
Packit fc043f
Packit fc043f
  /* First try to use the hash table.  */
Packit fc043f
  if (domain->hash_size > 2 && domain->hash_tab)
Packit fc043f
    {
Packit fc043f
      /* Use the hashing table.  */
Packit fc043f
      uint32_t len = strlen (msgid);
Packit fc043f
      uint32_t hash_val = hash_string (msgid);
Packit fc043f
      uint32_t idx = hash_val % domain->hash_size;
Packit fc043f
      uint32_t incr = 1 + (hash_val % (domain->hash_size - 2));
Packit fc043f
Packit fc043f
      while ( (nstr = SWAPIT (domain->must_swap, domain->hash_tab[idx])) )
Packit fc043f
        {
Packit fc043f
          nstr--;
Packit fc043f
          if (nstr < domain->nstrings
Packit fc043f
              && SWAPIT(domain->must_swap,
Packit fc043f
                        domain->orig_tab[nstr].length) >= len
Packit fc043f
              && !strcmp (msgid, (domain->data
Packit fc043f
                                  + SWAPIT(domain->must_swap,
Packit fc043f
                                           domain->orig_tab[nstr].offset))))
Packit fc043f
            {
Packit fc043f
              return get_string (domain, nstr, !!msgid2, nplural);
Packit fc043f
            }
Packit fc043f
Packit fc043f
          if (idx >= domain->hash_size - incr)
Packit fc043f
            idx -= domain->hash_size - incr;
Packit fc043f
          else
Packit fc043f
            idx += incr;
Packit fc043f
	}
Packit fc043f
    }
Packit fc043f
Packit fc043f
  /* Now we try the default method: binary search in the sorted array
Packit fc043f
     of messages.  */
Packit fc043f
  bottom = 0;
Packit fc043f
  top = domain->nstrings;
Packit fc043f
  while (bottom < top)
Packit fc043f
    {
Packit fc043f
      int cmp_val;
Packit fc043f
Packit fc043f
      nstr = (bottom + top) / 2;
Packit fc043f
      cmp_val = strcmp (msgid, (domain->data
Packit fc043f
                                + SWAPIT(domain->must_swap,
Packit fc043f
                                         domain->orig_tab[nstr].offset)));
Packit fc043f
      if (cmp_val < 0)
Packit fc043f
        top = nstr;
Packit fc043f
      else if (cmp_val > 0)
Packit fc043f
        bottom = nstr + 1;
Packit fc043f
      else
Packit fc043f
        {
Packit fc043f
          return get_string (domain, nstr, !!msgid2, nplural);
Packit fc043f
        }
Packit fc043f
    }
Packit fc043f
Packit fc043f
 not_found:
Packit fc043f
  /* We use the standard Germanic rule if plural has been requested.  */
Packit fc043f
  return msgid2? (nplural == 1? msgid : msgid2) : msgid;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
const char *
Packit fc043f
_gpg_w32_textdomain (const char *domainname)
Packit fc043f
{
Packit fc043f
  char *string;
Packit fc043f
Packit fc043f
  if (!domainname)
Packit fc043f
    {
Packit fc043f
      if (!current_domainname)
Packit fc043f
        gpg_err_set_errno (0);
Packit fc043f
    }
Packit fc043f
  else
Packit fc043f
    {
Packit fc043f
      string = malloc (strlen (domainname) + 1);
Packit fc043f
      if (!string)
Packit fc043f
        return NULL;
Packit fc043f
      strcpy (string, domainname);
Packit fc043f
      current_domainname = string;
Packit fc043f
    }
Packit fc043f
  return current_domainname;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* A direct implementation of gettext instead of a macro calling
Packit fc043f
   dngettext.  This is so that the caller does not need to push dummy
Packit fc043f
   values on the stack.  The used domain is the first one registered
Packit fc043f
   with bindtextdomain.  */
Packit fc043f
const char *
Packit fc043f
_gpg_w32_gettext (const char *msgid)
Packit fc043f
{
Packit fc043f
  return do_gettext (NULL, msgid, NULL, 0);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* A direct implementation of dgettext instead of a macro calling
Packit fc043f
   dngettext.  This is so that the caller does not need to push dummy
Packit fc043f
   values on the stack.  */
Packit fc043f
const char *
Packit fc043f
_gpg_w32_dgettext (const char *domainname, const char *msgid)
Packit fc043f
{
Packit fc043f
  return do_gettext (domainname, msgid, NULL, 0);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Our implementation of dngettext.  This is the most genereic
Packit fc043f
   function we have; a macro implements ngettext.  */
Packit fc043f
const char *
Packit fc043f
_gpg_w32_dngettext (const char *domainname, const char *msgid1,
Packit fc043f
			const char *msgid2, unsigned long int n)
Packit fc043f
{
Packit fc043f
  /* We use the simple Germanic plural rule.  */
Packit fc043f
  return do_gettext (domainname, msgid1, msgid2, n);
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* Return the locale name as used by gettext.  The return value will
Packit fc043f
   never be NULL. */
Packit fc043f
const char *
Packit fc043f
_gpg_w32_gettext_localename (void)
Packit fc043f
{
Packit fc043f
  const char *s;
Packit fc043f
Packit fc043f
  s = my_nl_locale_name ("LC_MESSAGES");
Packit fc043f
  return s? s:"";
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
/* With a VALUE of 1 switch the gettext functions into utf8 mode.
Packit fc043f
   That is the strings are returned without translation to the native
Packit fc043f
   charset.  A VALUE of 0 switches back to translated strings.  A VALUE
Packit fc043f
   of -1 returns the current value. */
Packit fc043f
int
Packit fc043f
_gpg_w32_gettext_use_utf8 (int value)
Packit fc043f
{
Packit fc043f
  struct tls_space_s *tls = get_tls ();
Packit fc043f
  int last = tls->gt_use_utf8;
Packit fc043f
  if (value != -1)
Packit fc043f
    tls->gt_use_utf8 = value;
Packit fc043f
  return last;
Packit fc043f
}
Packit fc043f
Packit fc043f
Packit fc043f
#ifdef TEST
Packit fc043f
int
Packit fc043f
main (int argc, char **argv)
Packit fc043f
{
Packit fc043f
  const char atext1[] =
Packit fc043f
    "Warning: You have entered an insecure passphrase.%%0A"
Packit fc043f
    "A passphrase should be at least %u character long.";
Packit fc043f
  const char atext2[] =
Packit fc043f
    "Warning: You have entered an insecure passphrase.%%0A"
Packit fc043f
    "A passphrase should be at least %u characters long.";
Packit fc043f
Packit fc043f
  if (argc)
Packit fc043f
    {
Packit fc043f
      argc--;
Packit fc043f
      argv++;
Packit fc043f
    }
Packit fc043f
Packit fc043f
  _gpg_err_w32_bindtextdomain ("gnupg2", "c:/programme/gnu/gnupg/share/locale");
Packit fc043f
Packit fc043f
  printf ("locale is `%s'\n", _gpg_err_w32_gettext_localename ());
Packit fc043f
  fputs ("text with N=1:\n", stdout);
Packit fc043f
  fputs (_gpg_err_w32_ngettext (atext1, atext2, 1), stdout);
Packit fc043f
  fputs ("\n\ntext with N=2:\n", stdout);
Packit fc043f
  fputs (_gpg_err_w32_ngettext (atext1, atext2, 2), stdout);
Packit fc043f
  fputs ("\nready\n", stdout);
Packit fc043f
Packit fc043f
  return 0;
Packit fc043f
}
Packit fc043f
/*
Packit fc043f
 * Local Variables:
Packit fc043f
 *  compile-command: "i586-mingw32msvc-gcc -DTEST -Wall -g w32-gettext.c"
Packit fc043f
 * End:
Packit fc043f
 */
Packit fc043f
#endif /*TEST*/