Rewrite to use gconv instead of iconv for glibc.
authordrepper <drepper>
Sun, 22 Aug 1999 22:32:06 +0000 (22:32 +0000)
committerdrepper <drepper>
Sun, 22 Aug 1999 22:32:06 +0000 (22:32 +0000)
intl/gettextP.h
intl/loadmsgcat.c

index bea4404..1b4dcb3 100644 (file)
 #ifndef _GETTEXTP_H
 #define _GETTEXTP_H
 
-#if defined HAVE_ICONV || defined _LIBC
-# include <iconv.h>
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+#  include <iconv.h>
+# endif
 #endif
 
 #include "loadinfo.h"
@@ -71,8 +75,12 @@ struct loaded_domain
   struct string_desc *trans_tab;
   nls_uint32 hash_size;
   nls_uint32 *hash_tab;
-#if defined HAVE_ICONV || defined _LIBC
+#ifdef _LIBC
+  __gconv_t conv;
+#else
+# if HAVE_ICONV
   iconv_t conv;
+# endif
 #endif
   char **conv_tab;
 };
index 23d7388..ba818ce 100644 (file)
@@ -223,8 +223,12 @@ _nl_load_domain (domain_file)
      entry does not exist or if this does not contain the `charset='
      information, we will assume the charset matches the one the
      current locale and we don't have to perform any conversion.  */
-#if HAVE_ICONV || defined _LIBC
+#ifdef _LIBC
+  domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
   domain->conv = (iconv_t) -1;
+# endif
 #endif
   nullentry = _nl_find_msg (domain_file, "");
   if (nullentry != NULL)
@@ -235,6 +239,7 @@ _nl_load_domain (domain_file)
        {
          size_t len;
          char *charset;
+         const char *outcharset;
 
          charsetstr += strlen ("charset=");
          len = strcspn (charsetstr, " \t\n");
@@ -247,8 +252,22 @@ _nl_load_domain (domain_file)
          charset[len] = '\0';
 #endif
 
-#if HAVE_ICONV || defined _LIBC
-         domain->conv = iconv_open ((*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string, charset);
+         /* The output charset should normally be determined by the
+            locale.  But sometimes the locale is not used or not correctly
+            set up so we provide a possibility to override this.  */
+         outcharset = getenv ("OUTPUT_CHARSET");
+         if (outcharset == NULL || outcharset[0] == '\0')
+           outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
+
+#ifdef _LIBC
+         if (__gconv_open (outcharset, charset, &domain->conv,
+                           GCONV_AVOID_NOCONV)
+             != __GCONV_OK)
+           domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
+         domain->conv = iconv_open (outcharset, charset);
+# endif
 #endif
        }
     }