[dovecot-cvs] dovecot/src/lib-charset charset-iconv.c,1.9,1.10 charset-utf8.c,1.3,1.4 charset-utf8.h,1.4,1.5

cras at procontrol.fi cras at procontrol.fi
Mon Dec 16 05:59:08 EET 2002


Update of /home/cvs/dovecot/src/lib-charset
In directory danu:/tmp/cvs-serv23623/lib-charset

Modified Files:
	charset-iconv.c charset-utf8.c charset-utf8.h 
Log Message:
Don't use Buffers with read-only data, just makes it more difficult without
gaining anything.



Index: charset-iconv.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-charset/charset-iconv.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- charset-iconv.c	9 Dec 2002 13:39:32 -0000	1.9
+++ charset-iconv.c	16 Dec 2002 03:59:06 -0000	1.10
@@ -69,7 +69,7 @@
 
 CharsetResult
 charset_to_ucase_utf8(CharsetTranslation *t,
-		      const Buffer *src, size_t *src_pos, Buffer *dest)
+		      const unsigned char *src, size_t *src_size, Buffer *dest)
 {
 	ICONV_CONST char *ic_srcbuf;
 	char *ic_destbuf;
@@ -81,18 +81,15 @@
 
 	if (t->cd == NULL) {
 		/* no translation needed - just copy it to outbuf uppercased */
-		size = buffer_get_used_size(src);
-		if (size > destleft)
-			size = destleft;
-		_charset_utf8_ucase(buffer_get_data(src, NULL),
-				    size, dest, destpos);
-		if (src_pos != NULL)
-			*src_pos = size;
+		if (*src_size > destleft)
+			*src_size = destleft;
+		_charset_utf8_ucase(src, *src_size, dest, destpos);
 		return CHARSET_RET_OK;
 	}
 
 	size = destleft;
-	ic_srcbuf = (ICONV_CONST char *) buffer_get_data(src, &srcleft);
+	srcleft = *src_size;
+	ic_srcbuf = (ICONV_CONST char *) src;
 	ic_destbuf = buffer_append_space(dest, destleft);
 
 	if (iconv(t->cd, &ic_srcbuf, &srcleft,
@@ -111,9 +108,7 @@
 	/* give back the memory we didn't use */
 	buffer_set_used_size(dest, buffer_get_used_size(dest) - destleft);
 
-	if (src_pos != NULL)
-		*src_pos = buffer_get_used_size(src) - srcleft;
-
+	*src_size -= srcleft;
 	_charset_utf8_ucase((unsigned char *) ic_destbuf - size, size,
 			    dest, destpos);
 	return ret;
@@ -121,7 +116,8 @@
 
 const char *
 charset_to_ucase_utf8_string(const char *charset, int *unknown_charset,
-			     const Buffer *data, size_t *utf8_size)
+			     const unsigned char *data, size_t size,
+			     size_t *utf8_size_r)
 {
 	iconv_t cd;
 	ICONV_CONST char *inbuf;
@@ -134,7 +130,7 @@
 	    strcasecmp(charset, "UTF8") == 0) {
 		if (unknown_charset != NULL)
 			*unknown_charset = FALSE;
-		return _charset_utf8_ucase_strdup(data, utf8_size);
+		return _charset_utf8_ucase_strdup(data, size, utf8_size_r);
 	}
 
 	cd = iconv_open("UTF-8", charset);
@@ -147,7 +143,8 @@
 	if (unknown_charset != NULL)
 		*unknown_charset = FALSE;
 
-	inbuf = (ICONV_CONST char *) buffer_get_data(data, &inleft);;
+	inbuf = (ICONV_CONST char *) data;
+	inleft = size;
 
 	outsize = outleft = inleft * 2;
 	outbuf = outpos = t_buffer_get(outsize + 1);
@@ -168,8 +165,8 @@
 		outpos = outbuf + pos;
 	}
 
-	if (utf8_size != NULL)
-		*utf8_size = (size_t) (outpos - outbuf);
+	if (utf8_size_r != NULL)
+		*utf8_size_r = (size_t) (outpos - outbuf);
 	*outpos++ = '\0';
 	t_buffer_alloc((size_t) (outpos - outbuf));
 

Index: charset-utf8.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-charset/charset-utf8.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- charset-utf8.c	9 Dec 2002 13:39:32 -0000	1.3
+++ charset-utf8.c	16 Dec 2002 03:59:06 -0000	1.4
@@ -17,18 +17,15 @@
 		destbuf[i] = i_toupper(src[i]); /* FIXME: utf8 */
 }
 
-const char *_charset_utf8_ucase_strdup(const Buffer *data, size_t *utf8_size)
+const char *_charset_utf8_ucase_strdup(const unsigned char *data, size_t size,
+				       size_t *utf8_size_r)
 {
-	const char *buf;
-	size_t size;
 	Buffer *dest;
 
-	buf = buffer_get_data(data, &size);
-
 	dest = buffer_create_dynamic(data_stack_pool, size, (size_t)-1);
-	_charset_utf8_ucase(buf, size, dest, 0);
-	if (utf8_size != NULL)
-		*utf8_size = buffer_get_used_size(dest);
+	_charset_utf8_ucase(data, size, dest, 0);
+	if (utf8_size_r != NULL)
+		*utf8_size_r = buffer_get_used_size(dest);
 	buffer_append_c(dest, '\0');
 	return buffer_free_without_data(dest);
 }
@@ -74,26 +71,24 @@
 
 CharsetResult
 charset_to_ucase_utf8(CharsetTranslation *t __attr_unused__,
-		      const Buffer *src, size_t *src_pos, Buffer *dest)
+		      const unsigned char *src, size_t *src_size, Buffer *dest)
 {
-	size_t size, destpos, destleft;
+	size_t destpos, destleft;
 
 	destpos = buffer_get_used_size(dest);
 	destleft = buffer_get_size(dest) - destpos;
 
 	/* no translation needed - just copy it to outbuf uppercased */
-	size = buffer_get_used_size(src);
-	if (size > destleft)
-		size = destleft;
-	_charset_utf8_ucase(buffer_get_data(src, NULL), size, dest, destpos);
-	if (src_pos != NULL)
-		*src_pos = size;
+	if (*src_size > destleft)
+		*src_size = destleft;
+	_charset_utf8_ucase(src, *src_size, dest, destpos);
 	return CHARSET_RET_OK;
 }
 
 const char *
 charset_to_ucase_utf8_string(const char *charset, int *unknown_charset,
-			     const Buffer *data, size_t *utf8_size)
+			     const unsigned char *data, size_t size,
+			     size_t *utf8_size_r)
 {
 	if (charset == NULL || strcasecmp(charset, "us-ascii") == 0 ||
 	    strcasecmp(charset, "ascii") == 0 ||
@@ -101,7 +96,7 @@
 	    strcasecmp(charset, "UTF8") == 0) {
 		if (unknown_charset != NULL)
 			*unknown_charset = FALSE;
-		return _charset_utf8_ucase_strdup(data, utf8_size);
+		return _charset_utf8_ucase_strdup(data, size, utf8_size_r);
 	} else {
 		if (unknown_charset != NULL)
 			*unknown_charset = TRUE;

Index: charset-utf8.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-charset/charset-utf8.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- charset-utf8.h	9 Dec 2002 13:39:32 -0000	1.4
+++ charset-utf8.h	16 Dec 2002 03:59:06 -0000	1.5
@@ -18,20 +18,22 @@
 
 void charset_to_utf8_reset(CharsetTranslation *t);
 
-/* Translate src to UTF-8. If src_pos is non-NULL, it's updated to first
-   non-translated character in src. */
+/* Translate src to UTF-8. If src_size is updated to contain the number of
+   characters actually translated from src. */
 CharsetResult
 charset_to_ucase_utf8(CharsetTranslation *t,
-		      const Buffer *src, size_t *src_pos, Buffer *dest);
+		      const unsigned char *src, size_t *src_size, Buffer *dest);
 
 /* Simple wrapper for above functions. If utf8_size is non-NULL, it's set
    to same as strlen(returned data). */
 const char *
 charset_to_ucase_utf8_string(const char *charset, int *unknown_charset,
-			     const Buffer *data, size_t *utf8_size);
+			     const unsigned char *data, size_t size,
+			     size_t *utf8_size_r);
 
 void _charset_utf8_ucase(const unsigned char *src, size_t src_size,
 			 Buffer *dest, size_t destpos);
-const char *_charset_utf8_ucase_strdup(const Buffer *data, size_t *utf8_size);
+const char *_charset_utf8_ucase_strdup(const unsigned char *data, size_t size,
+				       size_t *utf8_size_r);
 
 #endif




More information about the dovecot-cvs mailing list