Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 29 Nov 2001 05:00:56 +0000 (05:00 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 29 Nov 2001 05:00:56 +0000 (05:00 +0000)
* iconv/gconv_open.c (__gconv_open): Empty codeset name now means using
the current locale's codeset.
* iconv/iconv_open.c (iconv_open): Don't strip out everything for
empty input string.
* iconv/iconv_prog.c: Pass empty strings as default value for to-
and from-charset.  Don't determine locale's charset here.

if libio is used [PR libc/2575].

ChangeLog
iconv/gconv_open.c
iconv/iconv_open.c
iconv/iconv_prog.c

index 4194944..3fffb74 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,18 @@
 2001-11-28  Ulrich Drepper  <drepper@redhat.com>
 
+       * iconv/gconv_open.c (__gconv_open): Empty codeset name now means using
+       the current locale's codeset.
+       * iconv/iconv_open.c (iconv_open): Don't strip out everything for
+       empty input string.
+       * iconv/iconv_prog.c: Pass empty strings as default value for to-
+       and from-charset.  Don't determine locale's charset here.
+
        * libio/genops.c (_IO_flush_all_lockp): New function.  The same code
        as the old _IO_flush_all but lock only if parameter is nonzero.
        (_IO_flush_all): Call _IO_flush_all_lockp with 1 as parameter.
        * libio/libioP.h: Add prototype for _IO_flush_all_lockp.
        * sysdeps/generic/abort.c (fflush): Define to _IO_flush_all_lockp(0)
-       if libio is used.
+       if libio is used [PR libc/2575].
 
 2001-11-28  Jakub Jelinek  <jakub@redhat.com>
 
index dfcd7b7..94a54f8 100644 (file)
@@ -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)
     {
index ac44af8..e0f6135 100644 (file)
@@ -40,14 +40,15 @@ iconv_open (const char *tocode, const char *fromcode)
   /* Normalize the name.  We remove all characters beside alpha-numeric,
      '_', '-', '/', and '.'.  */
   tocode_len = strlen (tocode);
-  tocode_conv = alloca (tocode_len + 3);
+  tocode_conv = (char *) alloca (tocode_len + 3);
   strip (tocode_conv, tocode);
-  tocode = tocode_conv[2] == '\0' ? upstr (tocode_conv, tocode) : tocode_conv;
+  tocode = (tocode_conv[2] == '\0' && tocode[0] != '\0'
+           ? upstr (tocode_conv, tocode) : tocode_conv);
 
   fromcode_len = strlen (fromcode);
-  fromcode_conv = alloca (fromcode_len + 3);
+  fromcode_conv = (char *) alloca (fromcode_len + 3);
   strip (fromcode_conv, fromcode);
-  fromcode = (fromcode_conv[2] == '\0'
+  fromcode = (fromcode_conv[2] == '\0' && fromcode[0] != '\0'
              ? upstr (fromcode_conv, fromcode) : fromcode_conv);
 
   res = __gconv_open (tocode, fromcode, &cd, 0);
index e71f8d7..07296f0 100644 (file)
@@ -25,7 +25,6 @@
 #include <error.h>
 #include <fcntl.h>
 #include <iconv.h>
-#include <langinfo.h>
 #include <locale.h>
 #include <search.h>
 #include <stdio.h>
@@ -92,9 +91,11 @@ static struct argp argp =
   options, parse_opt, args_doc, doc, NULL, more_help
 };
 
-/* Code sets to convert from and to respectively.  */
-static const char *from_code;
-static const char *to_code;
+/* Code sets to convert from and to respectively.  An empty string as the
+   default causes the 'iconv_open' function to look up the charset of the
+   currently selected locale and use it.  */
+static const char *from_code = "";
+static const char *to_code = "";
 
 /* File to write output to.  If NULL write to stdout.  */
 static const char *output_file;
@@ -141,20 +142,6 @@ main (int argc, char *argv[])
       print_known_names ();
       exit (EXIT_SUCCESS);
     }
-  if (from_code == NULL)
-    {
-      /* The Unix standard says that in this case the charset of the current
-        locale is used.  */
-      from_code = nl_langinfo (CODESET);
-      assert (from_code != NULL);
-    }
-  if (to_code == NULL)
-    {
-      /* The Unix standard says that in this case the charset of the current
-        locale is used.  */
-      to_code = nl_langinfo (CODESET);
-      assert (to_code != NULL);
-    }
 
   /* If we have to ignore errors make sure we use the appropriate name for
      the to-character-set.  */