diff src/lib-charset/charset-iconv.c @ 6122:d86581f4a0c6 HEAD

charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
author Timo Sirainen <tss@iki.fi>
date Fri, 20 Jul 2007 16:22:59 +0300
parents 325667778ae3
children b9c1336fd4e4
line wrap: on
line diff
--- a/src/lib-charset/charset-iconv.c	Fri Jul 20 16:21:23 2007 +0300
+++ b/src/lib-charset/charset-iconv.c	Fri Jul 20 16:22:59 2007 +0300
@@ -57,9 +57,9 @@
 		(void)iconv(t->cd, NULL, NULL, NULL, NULL);
 }
 
-enum charset_result
-charset_to_utf8(struct charset_translation *t,
-		const unsigned char *src, size_t *src_size, buffer_t *dest)
+static enum charset_result
+charset_to_utf8_try(struct charset_translation *t,
+		    const unsigned char *src, size_t *src_size, buffer_t *dest)
 {
 	ICONV_CONST char *ic_srcbuf;
 	char *ic_destbuf;
@@ -67,18 +67,20 @@
         enum charset_result ret;
 
 	destpos = dest->used;
-	destleft = buffer_get_size(dest) - destpos;
-
 	if (t->cd == (iconv_t)-1) {
 		/* no translation needed - just copy it to outbuf uppercased */
-		if (*src_size > destleft)
-			*src_size = destleft;
 		if (t->ucase)
 			charset_utf8_ucase_write(dest, destpos, src, *src_size);
 		else
-			buffer_write(dest, destpos, src, *src_size);
+			buffer_append(dest, src, *src_size);
 		return CHARSET_RET_OK;
 	}
+	destleft = buffer_get_size(dest) - destpos;
+	if (destleft < *src_size) {
+		/* The buffer is most likely too small to hold the output,
+		   so increase it at least to the input size. */
+		destleft = *src_size;
+	}
 
 	size = destleft;
 	srcleft = *src_size;
@@ -106,23 +108,20 @@
 		charset_utf8_ucase_write(dest, destpos,
 					 (unsigned char *)ic_destbuf - size,
 					 size);
-	} else {
-		buffer_write(dest, destpos, ic_destbuf - size, size);
 	}
 	return ret;
 }
 
 enum charset_result
-charset_to_utf8_full(struct charset_translation *t,
-		     const unsigned char *src, size_t *src_size,
-		     buffer_t *dest)
+charset_to_utf8(struct charset_translation *t,
+		const unsigned char *src, size_t *src_size, buffer_t *dest)
 {
 	enum charset_result ret;
 	size_t pos, used, size;
 
 	for (pos = 0;;) {
 		size = *src_size - pos;
-		ret = charset_to_utf8(t, src + pos, &size, dest);
+		ret = charset_to_utf8_try(t, src + pos, &size, dest);
 		pos += size;
 
 		if (ret != CHARSET_RET_OUTPUT_FULL) {