about summary refs log tree commit diff
path: root/iconv/gconv_open.c
diff options
context:
space:
mode:
Diffstat (limited to 'iconv/gconv_open.c')
-rw-r--r--iconv/gconv_open.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c
index dfcd7b772f..94a54f8008 100644
--- a/iconv/gconv_open.c
+++ b/iconv/gconv_open.c
@@ -20,6 +20,7 @@
 
 #include <errno.h>
 #include <locale.h>
+#include "../locale/localeinfo.h"
 #include <stdlib.h>
 #include <string.h>
 
@@ -149,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)
     {