changeset 3737:0600eb591972

Update to Gettext 0.11.
author Jim Meyering <jim@meyering.net>
date Sat, 16 Feb 2002 14:10:17 +0000
parents 2eb751ae32d1
children 04f1a8dc624d
files lib/config.charset lib/localcharset.c
diffstat 2 files changed, 88 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	#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
--- 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 <langinfo.h>
 # else
@@ -50,10 +55,19 @@
 #   include <locale.h>
 #  endif
 # endif
-#else /* WIN32 */
+#elif defined WIN32
 # define WIN32_LEAN_AND_MEAN
 # include <windows.h>
 #endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#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 @@
   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 @@
 		  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 @@
       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 @@
   const char *codeset;
   const char *aliases;
 
-#ifndef WIN32
+#if !(defined WIN32 || defined OS2)
 
 # if HAVE_LANGINFO_CODESET
 
@@ -242,7 +263,7 @@
 
 # endif
 
-#else /* WIN32 */
+#elif defined WIN32
 
   static char buf[2 + 10 + 1];
 
@@ -250,6 +271,59 @@
   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)