Replace __gconv_alias_db, __gconv_modules_db, and __gconv_cache with
[kopensolaris-gnu/glibc.git] / iconv / gconv_open.c
index 0bf343d..94a54f8 100644 (file)
@@ -19,6 +19,8 @@
    02111-1307 USA.  */
 
 #include <errno.h>
+#include <locale.h>
+#include "../locale/localeinfo.h"
 #include <stdlib.h>
 #include <string.h>
 
@@ -64,7 +66,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
          tok = __strtok_r (tok, ",", &ptr);
          while (tok != NULL)
            {
-             if (__strcasecmp (tok, "TRANSLIT") == 0)
+             if (__strcasecmp_l (tok, "TRANSLIT", &_nl_C_locobj) == 0)
                {
                  /* It's the builtin transliteration handling.  We only
                     support it for working on the internal encoding.  */
@@ -97,7 +99,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
                        lastp->next = newp;
                    }
                }
-             else if (__strcasecmp (tok, "IGNORE") == 0)
+             else if (__strcasecmp_l (tok, "IGNORE", &_nl_C_locobj) == 0)
                /* Set the flag to ignore all errors.  */
                conv_flags |= __GCONV_IGNORE_ERRORS;
              else
@@ -110,7 +112,8 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
 
                  for (runp = trans; runp != NULL; runp = runp->next)
                    if (runp->name != NULL
-                       && __strcasecmp (tok, runp->name) == 0)
+                       && __strcasecmp_l (tok, runp->name,
+                                          &_nl_C_locobj) == 0)
                      break;
                    else
                      lastp = runp;
@@ -147,6 +150,25 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
       fromset = memcpy (newfromset, fromset, ignore - fromset);
     }
 
+  /* If the string is empty define this to mean the charset of the
+     currently selected locale.  */
+  if (strcmp (toset, "//") == 0)
+    {
+      const char *codeset = _NL_CURRENT (LC_CTYPE, CODESET);
+      size_t len = strlen (codeset);
+      char *dest;
+      toset = dest = (char *) alloca (len + 3);
+      memcpy (__mempcpy (dest, codeset, len), "//", 3);
+    }
+  if (strcmp (fromset, "//") == 0)
+    {
+      const char *codeset = _NL_CURRENT (LC_CTYPE, CODESET);
+      size_t len = strlen (codeset);
+      char *dest;
+      fromset = dest = (char *) alloca (len + 3);
+      memcpy (__mempcpy (dest, codeset, len), "//", 3);
+    }
+
   res = __gconv_find_transform (toset, fromset, &steps, &nsteps, flags);
   if (res == __GCONV_OK)
     {
@@ -205,8 +227,8 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
                 modules for this step.  */
              for (runp = trans; runp != NULL; runp = runp->next)
                for (n = 0; n < runp->ncsnames; ++n)
-                 if (__strcasecmp (steps[cnt].__from_name,
-                                   runp->csnames[n]) == 0)
+                 if (__strcasecmp_l (steps[cnt].__from_name,
+                                     runp->csnames[n], &_nl_C_locobj) == 0)
                    {
                      void *data = NULL;