Mercurial > dovecot > core-2.2
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 */