changeset 7255:02d37bd4003c

(iconv_alloc): Call iconv with 2xNULL arguments, also to flush the state storage.
author Bruno Haible <bruno@clisp.org>
date Tue, 05 Sep 2006 11:51:57 +0000
parents 10f2be3ea106
children 58ebe5a656c7
files lib/iconvme.c
diffstat 1 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lib/iconvme.c
+++ b/lib/iconvme.c
@@ -193,6 +193,48 @@
 	}
     }
 
+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: