]> Savannah Git Hosting - gnulib.git/commitdiff
(iconv_alloc): Call iconv with 2xNULL arguments, also to flush the state
authorBruno Haible <bruno@clisp.org>
Tue, 5 Sep 2006 11:51:57 +0000 (11:51 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 5 Sep 2006 11:51:57 +0000 (11:51 +0000)
storage.

lib/iconvme.c

index 5bf359f4f4365829ec44d5fb55e73289e4f50c75..f359e11a846142e4d501abd31981014f5a448a7d 100644 (file)
@@ -193,6 +193,48 @@ again:
        }
     }
 
+again2:
+  err = iconv (cd, NULL, NULL, &outp, &outbytes_remaining);
+
+  if (err == (size_t) -1)
+    {
+      switch (errno)
+       {
+       case E2BIG:
+         {
+           size_t used = outp - dest;
+           size_t newsize = outbuf_size * 2;
+           char *newdest;
+
+           if (newsize <= outbuf_size)
+             {
+               errno = ENOMEM;
+               have_error = 1;
+               goto out;
+             }
+           newdest = (char *) realloc (dest, newsize);
+           if (newdest == NULL)
+             {
+               errno = ENOMEM;
+               have_error = 1;
+               goto out;
+             }
+           dest = newdest;
+           outbuf_size = newsize;
+
+           outp = dest + used;
+           outbytes_remaining = outbuf_size - used - 1;        /* -1 for NUL */
+
+           goto again2;
+         }
+         break;
+
+       default:
+         have_error = 1;
+         break;
+       }
+    }
+
   *outp = '\0';
 
 out: