# HG changeset patch # User Timo Sirainen # Date 1197121995 -7200 # Node ID 08e4d7efcd6a2401327230a9c2e1651d456f8519 # Parent 1f70c72e4312f63c6ec5c0e5b32836e84266f4b0 uni_utf8_get_valid_data() API changed. diff -r 1f70c72e4312 -r 08e4d7efcd6a src/lib-mail/message-decoder.c --- a/src/lib-mail/message-decoder.c Sat Dec 08 15:45:17 2007 +0200 +++ b/src/lib-mail/message-decoder.c Sat Dec 08 15:53:15 2007 +0200 @@ -316,21 +316,29 @@ } if (ctx->charset_utf8) { + buffer_set_used_size(ctx->buf2, 0); if (ctx->dtcase) { - buffer_set_used_size(ctx->buf2, 0); (void)uni_utf8_to_decomposed_titlecase(data, size, ctx->buf2); output->data = ctx->buf2->data; output->size = ctx->buf2->used; + } else if (uni_utf8_get_valid_data(data, size, ctx->buf2)) { + output->data = data; + output->size = size; } else { - output->data = - uni_utf8_get_valid_data(data, size, ctx->buf2, - &output->size); + output->data = ctx->buf2->data; + output->size = ctx->buf2->used; } } else if (ctx->charset_trans == NULL) { /* unknown charset */ - output->data = uni_utf8_get_valid_data(data, size, ctx->buf2, - &output->size); + buffer_set_used_size(ctx->buf2, 0); + if (uni_utf8_get_valid_data(data, size, ctx->buf2)) { + output->data = data; + output->size = size; + } else { + output->data = ctx->buf2->data; + output->size = ctx->buf2->used; + } } else { buffer_set_used_size(ctx->buf2, 0); if (ctx->translation_size != 0) diff -r 1f70c72e4312 -r 08e4d7efcd6a src/lib/unichar.c --- a/src/lib/unichar.c Sat Dec 08 15:45:17 2007 +0200 +++ b/src/lib/unichar.c Sat Dec 08 15:53:15 2007 +0200 @@ -302,9 +302,8 @@ return len; } -const unsigned char * -uni_utf8_get_valid_data(const unsigned char *input, size_t size, - buffer_t *tmpbuf, size_t *output_size_r) +bool uni_utf8_get_valid_data(const unsigned char *input, size_t size, + buffer_t *buf) { size_t i, len; @@ -319,17 +318,14 @@ i += len; } } - /* we can use it as-is */ - *output_size_r = size; - return input; + return TRUE; broken: /* broken utf-8 input - skip the broken characters */ - buffer_set_used_size(tmpbuf, 0); - buffer_append(tmpbuf, input, i++); + buffer_append(buf, input, i++); while (i < size) { if (input[i] < 0x80) { - buffer_append_c(tmpbuf, input[i++]); + buffer_append_c(buf, input[i++]); continue; } @@ -338,9 +334,8 @@ i++; continue; } - buffer_append(tmpbuf, input + i, len); + buffer_append(buf, input + i, len); i += len; } - *output_size_r = tmpbuf->used; - return tmpbuf->data; + return FALSE; } diff -r 1f70c72e4312 -r 08e4d7efcd6a src/lib/unichar.h --- a/src/lib/unichar.h Sat Dec 08 15:45:17 2007 +0200 +++ b/src/lib/unichar.h Sat Dec 08 15:53:15 2007 +0200 @@ -40,11 +40,10 @@ int uni_utf8_to_decomposed_titlecase(const void *input, size_t max_len, buffer_t *output); -/* If input contains only valid UTF-8 input, return it directly. If input - contains invalid UTF-8 input, write only valid UTF-8 characters to the - given buffer and return it. */ -const unsigned char * -uni_utf8_get_valid_data(const unsigned char *input, size_t size, - buffer_t *tmpbuf, size_t *output_size_r); +/* If input contains only valid UTF-8 characters, return TRUE. If input + contains invalid UTF-8 characters, write only the valid ones to buf and + return FALSE. */ +bool uni_utf8_get_valid_data(const unsigned char *input, size_t size, + buffer_t *buf); #endif