Fixed error with uninitialized variable.
[gedcom-parse.git] / utf8 / utf8-convert.c
index 097f199a35a6c4448d03dfe7892899f4ad13bcb3..264cb9aa015a9cfe54bfa7c0f8aa1e4abda2b03c 100644 (file)
@@ -1,15 +1,26 @@
 /* Encoding utility from UTF-8 to another charset and vice versa
    Copyright (C) 2001, 2002 Peter Verthez
 
-   Permission granted to do anything with this file that you want, as long
-   as the above copyright is retained in all copies.
-   THERE IS NO WARRANTY - USE AT YOUR OWN RISK
+   The UTF8 tools library is free software; you can redistribute it
+   and/or modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The Gedcom parser library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the Gedcom parser library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.
 */
 
 /* $Id$ */
 /* $Name$ */
 
-#include "utf8.h"
+#include "utf8tools.h"
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
@@ -37,7 +48,7 @@ struct convert {
   char*   unknown;
 };
 
-void reset_conv_buffer(conv_buffer_t buf)
+static void reset_conv_buffer(conv_buffer_t buf)
 {
   memset(buf->buffer, 0, buf->size);
 }
@@ -70,7 +81,7 @@ void free_conv_buffer(conv_buffer_t buf)
   }
 }
 
-char* grow_conv_buffer(conv_buffer_t buf, char* curr_pos)
+static char* grow_conv_buffer(conv_buffer_t buf, char* curr_pos)
 {
   size_t outlen, new_size;
   char*  new_buffer;
@@ -187,19 +198,21 @@ void cleanup_utf8_conversion(convert_t conv)
   }
 }
 
-char* convert_from_utf8(convert_t conv, const char* input, int* conv_fails)
+char* convert_from_utf8(convert_t conv, const char* input, int* conv_fails,
+                       size_t* output_len)
 {
-  size_t insize = strlen(input);
+  size_t insize;
   size_t outsize;
   ICONV_CONST char* inptr  = (ICONV_CONST char*) input;
   char   *outptr;
   size_t nconv;
   struct conv_buffer* outbuf;
 
-  if (!conv || !conv->outbuf) {
-    if (conv_fails != NULL) *conv_fails = insize;
+  if (!conv || !conv->outbuf || !input) {
+    if (conv_fails != NULL) *conv_fails = (input ? strlen(input) : 0);
     return NULL;
   }
+  insize = strlen(input);
   /* make sure we start from an empty state */
   iconv(conv->from_utf8, NULL, NULL, NULL, NULL);
   if (conv_fails != NULL) *conv_fails = 0;
@@ -246,19 +259,19 @@ char* convert_from_utf8(convert_t conv, const char* input, int* conv_fails)
     }
     nconv = iconv(conv->from_utf8, &inptr, &insize, &outptr, &outsize);
   }
+  if (output_len) *output_len = outptr - outbuf->buffer;
   return outbuf->buffer;
 }
 
-char* convert_to_utf8(convert_t conv, const char* input)
+char* convert_to_utf8(convert_t conv, const char* input, size_t input_len)
 {
-  size_t insize  = strlen(input);
   size_t outsize;
   ICONV_CONST char *inptr  = (ICONV_CONST char*) input;
   char   *outptr;
   size_t nconv;
   struct conv_buffer* outbuf;
 
-  if (!conv || !conv->outbuf)
+  if (!conv || !conv->outbuf || !input)
     return NULL;
   /* make sure we start from an empty state */
   iconv(conv->to_utf8, NULL, NULL, NULL, NULL);
@@ -267,7 +280,7 @@ char* convert_to_utf8(convert_t conv, const char* input)
   outptr  = outbuf->buffer;
   outsize = outbuf->size;
   reset_conv_buffer(conv->outbuf);
-  nconv = iconv(conv->to_utf8, &inptr, &insize, &outptr, &outsize);
+  nconv = iconv(conv->to_utf8, &inptr, &input_len, &outptr, &outsize);
   while (nconv == (size_t)-1) {
     if (errno == E2BIG) {
       /* grow the output buffer */
@@ -286,7 +299,7 @@ char* convert_to_utf8(convert_t conv, const char* input)
       /* EBADF is an error which should be captured by the first if above */
       return NULL;
     }
-    nconv = iconv(conv->to_utf8, &inptr, &insize, &outptr, &outsize);
+    nconv = iconv(conv->to_utf8, &inptr, &input_len, &outptr, &outsize);
   }
   return outbuf->buffer;  
 }
@@ -305,6 +318,13 @@ char* convert_to_utf8_incremental(convert_t conv,
   if (!conv || !conv->outbuf)
     return NULL;
   
+  if (!input) {
+    iconv(conv->to_utf8, NULL, NULL, NULL, NULL);
+    reset_conv_buffer(inbuf);
+    conv->insize = 0;
+    return NULL;
+  }
+  
   /* set up input buffer (concatenate to what was left previous time) */
   /* can't use strcpy, because possible null bytes from unicode */
   while (conv->insize + input_len > inbuf->size)