From 68801dc104935a92aaf4e094181f9c3116f1693d Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sat, 16 Feb 2002 14:10:17 +0000 Subject: [PATCH] Update to Gettext 0.11. --- lib/config.charset | 6 ++-- lib/localcharset.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/lib/config.charset b/lib/config.charset index f4f2611c5..b91e0591b 100755 --- a/lib/config.charset +++ b/lib/config.charset @@ -1,7 +1,7 @@ #! /bin/sh # Output a system dependent table of character encoding aliases. # -# Copyright (C) 2000-2001 Free Software Foundation, Inc. +# Copyright (C) 2000-2002 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published @@ -235,10 +235,12 @@ case "$os" in #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; - freebsd*) + freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do diff --git a/lib/localcharset.c b/lib/localcharset.c index 61f8f3e85..bc5587bf6 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -1,6 +1,6 @@ /* Determine a canonical name for the current locale's character encoding. - Copyright (C) 2000-2001 Free Software Foundation, Inc. + Copyright (C) 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -42,7 +42,12 @@ # define WIN32 #endif -#ifndef WIN32 +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else @@ -50,10 +55,19 @@ # include # endif # endif -#else /* WIN32 */ +#elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include #endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' @@ -63,6 +77,11 @@ # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif +#ifdef HAVE_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize @@ -86,7 +105,7 @@ get_charset_aliases () cp = charset_aliases; if (cp == NULL) { -#ifndef WIN32 +#if !defined WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; @@ -138,19 +157,19 @@ get_charset_aliases () continue; } ungetc (c, fp); - if (fscanf(fp, "%50s %50s", buf1, buf2) < 2) + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); if (res_size == 0) { res_size = l1 + 1 + l2 + 1; - res_ptr = malloc (res_size + 1); + res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; - res_ptr = realloc (res_ptr, res_size + 1); + res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { @@ -174,14 +193,16 @@ get_charset_aliases () if (file_name != NULL) free (file_name); -#else /* WIN32 */ +#else /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ +# if defined WIN32 cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0"; +# endif #endif charset_aliases = cp; @@ -205,7 +226,7 @@ locale_charset () const char *codeset; const char *aliases; -#ifndef WIN32 +#if !(defined WIN32 || defined OS2) # if HAVE_LANGINFO_CODESET @@ -242,7 +263,7 @@ locale_charset () # endif -#else /* WIN32 */ +#elif defined WIN32 static char buf[2 + 10 + 1]; @@ -250,6 +271,59 @@ locale_charset () sprintf (buf, "CP%u", GetACP ()); codeset = buf; +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + #endif if (codeset == NULL) -- 2.11.0