changeset 785:d96cbba73a8b HEAD

Don't use Buffers with read-only data, just makes it more difficult without gaining anything.
author Timo Sirainen <tss@iki.fi>
date Mon, 16 Dec 2002 05:59:06 +0200
parents 2a6cc4f0c3c6
children c0e7bfb5bab8
files src/lib-charset/charset-iconv.c src/lib-charset/charset-utf8.c src/lib-charset/charset-utf8.h src/lib-mail/message-body-search.c src/lib-mail/message-header-search.c
diffstat 5 files changed, 48 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-charset/charset-iconv.c	Mon Dec 16 05:27:35 2002 +0200
+++ b/src/lib-charset/charset-iconv.c	Mon Dec 16 05:59:06 2002 +0200
@@ -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));
 
--- a/src/lib-charset/charset-utf8.c	Mon Dec 16 05:27:35 2002 +0200
+++ b/src/lib-charset/charset-utf8.c	Mon Dec 16 05:59:06 2002 +0200
@@ -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;
--- a/src/lib-charset/charset-utf8.h	Mon Dec 16 05:27:35 2002 +0200
+++ b/src/lib-charset/charset-utf8.h	Mon Dec 16 05:59:06 2002 +0200
@@ -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
--- a/src/lib-mail/message-body-search.c	Mon Dec 16 05:27:35 2002 +0200
+++ b/src/lib-mail/message-body-search.c	Mon Dec 16 05:59:06 2002 +0200
@@ -201,16 +201,17 @@
 /* returns 1 = found, 0 = not found, -1 = error in input data */
 static int message_search_body_block(PartSearchContext *ctx, Buffer *block)
 {
-	Buffer *inbuf, *outbuf;
+	const unsigned char *inbuf;
+	Buffer *outbuf;
         CharsetResult result;
-	size_t block_pos, inbuf_pos, inbuf_left, ret;
+	size_t block_pos, inbuf_size, inbuf_left, ret;
 
 	outbuf = buffer_create_static(data_stack_pool, DECODE_BLOCK_SIZE);
 	for (block_pos = 0; block_pos < buffer_get_used_size(block); ) {
 		if (buffer_get_used_size(ctx->decode_buf) == 0) {
 			/* we can use the buffer directly without copying */
-			inbuf = block;
-			inbuf_pos = block_pos;
+			inbuf = buffer_get_data(block, &inbuf_size);
+			inbuf += block_pos; inbuf_size -= block_pos;
 			block_pos += buffer_get_used_size(block);
 		} else {
 			/* some characters already in buffer, ie. last
@@ -219,14 +220,14 @@
 						       block, block_pos,
 						       (size_t)-1);
 
-			inbuf = ctx->decode_buf;
-			inbuf_pos = 0;
+			inbuf = buffer_get_data(ctx->decode_buf, &inbuf_size);
 		}
 
 		buffer_set_used_size(outbuf, 0);
+		inbuf_left = inbuf_size;
 		result = charset_to_ucase_utf8(ctx->translation,
-					       inbuf, &inbuf_pos, outbuf);
-		inbuf_left = buffer_get_used_size(inbuf) - inbuf_pos;
+					       inbuf, &inbuf_size, outbuf);
+		inbuf_left -= inbuf_size;
 
 		switch (result) {
 		case CHARSET_RET_OUTPUT_FULL:
@@ -239,8 +240,8 @@
 			break;
 		case CHARSET_RET_INCOMPLETE_INPUT:
 			/* save the partial sequence to buffer */
-			ret = buffer_copy(ctx->decode_buf, 0,
-					  inbuf, inbuf_pos, inbuf_left);
+			ret = buffer_write(ctx->decode_buf, 0,
+					   inbuf + inbuf_size, inbuf_left);
 			i_assert(ret == inbuf_left);
 
 			buffer_set_used_size(ctx->decode_buf, ret);
@@ -347,15 +348,13 @@
 				    const char *charset, int *unknown_charset,
 				    int search_header)
 {
-	Buffer *keybuf;
 	size_t key_len;
 
 	memset(ctx, 0, sizeof(BodySearchContext));
 
 	/* get the key uppercased */
-        keybuf = buffer_create_const_data(data_stack_pool, key, strlen(key));
 	key = charset_to_ucase_utf8_string(charset, unknown_charset,
-					   keybuf, &key_len);
+					   key, strlen(key), &key_len);
 	if (key == NULL)
 		return FALSE;
 
--- a/src/lib-mail/message-header-search.c	Mon Dec 16 05:27:35 2002 +0200
+++ b/src/lib-mail/message-header-search.c	Mon Dec 16 05:59:06 2002 +0200
@@ -36,7 +36,6 @@
 			   int *unknown_charset)
 {
 	HeaderSearchContext *ctx;
-	Buffer *keybuf;
 	size_t key_len;
 	const char *p;
 
@@ -44,9 +43,8 @@
 	ctx->pool = pool;
 
 	/* get the key uppercased */
-	keybuf = buffer_create_const_data(data_stack_pool, key, strlen(key));
 	key = charset_to_ucase_utf8_string(charset, unknown_charset,
-					   keybuf, &key_len);
+					   key, strlen(key), &key_len);
 
 	if (key == NULL) {
 		/* invalid key */
@@ -86,7 +84,6 @@
 static void search_with_charset(const unsigned char *data, size_t size,
 				const char *charset, HeaderSearchContext *ctx)
 {
-	Buffer *buf;
 	const char *utf8_data;
 	size_t utf8_size;
 
@@ -100,9 +97,8 @@
 		charset = ctx->key_charset;
 	}
 
-	buf = buffer_create_const_data(data_stack_pool, data, size);
 	utf8_data = charset_to_ucase_utf8_string(charset, NULL,
-						 buf, &utf8_size);
+						 data, size, &utf8_size);
 
 	if (utf8_data == NULL) {
 		/* unknown character set, or invalid data */