Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6132:d01522d276f6 HEAD
charset_to_utf8_begin() API change.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 20 Jul 2007 17:37:05 +0300 |
parents | 5f56b2eb32b3 |
children | fd9f6b4d846e |
files | src/lib-charset/charset-iconv.c src/lib-charset/charset-utf8.c src/lib-charset/charset-utf8.h src/lib-mail/message-decoder.c src/lib-mail/message-header-decode.c src/lib-mail/message-search.c |
diffstat | 6 files changed, 49 insertions(+), 57 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-charset/charset-iconv.c Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-charset/charset-iconv.c Fri Jul 20 17:37:05 2007 +0300 @@ -12,33 +12,28 @@ struct charset_translation { iconv_t cd; - unsigned int ucase:1; + enum charset_flags flags; }; -struct charset_translation * -charset_to_utf8_begin(const char *charset, bool ucase, bool *unknown_charset_r) +int charset_to_utf8_begin(const char *charset, enum charset_flags flags, + struct charset_translation **t_r) { struct charset_translation *t; iconv_t cd; - if (unknown_charset_r != NULL) - *unknown_charset_r = FALSE; - if (charset_is_utf8(charset)) cd = (iconv_t)-1; else { cd = iconv_open("UTF-8", charset); - if (cd == (iconv_t)-1) { - if (unknown_charset_r != NULL) - *unknown_charset_r = TRUE; - return NULL; - } + if (cd == (iconv_t)-1) + return -1; } t = i_new(struct charset_translation, 1); t->cd = cd; - t->ucase = ucase; - return t; + t->flags = flags; + *t_r = t; + return 0; } void charset_to_utf8_end(struct charset_translation **_t) @@ -66,12 +61,13 @@ ICONV_CONST char *ic_srcbuf; char tmpbuf[8192], *ic_destbuf; size_t srcleft, destleft; + bool dtcase = (t->flags & CHARSET_FLAG_DECOMP_TITLECASE) != 0; bool ret = TRUE; if (t->cd == (iconv_t)-1) { /* no translation needed - just copy it to outbuf uppercased */ *result = CHARSET_RET_OK; - if (!t->ucase) { + if (!dtcase) { buffer_append(dest, src, *src_size); return TRUE; } @@ -80,7 +76,7 @@ *result = CHARSET_RET_INVALID_INPUT; return TRUE; } - if (!t->ucase) { + if (!dtcase) { destleft = buffer_get_size(dest) - dest->used; if (destleft < *src_size) { /* The buffer is most likely too small to hold the @@ -112,7 +108,7 @@ } *src_size -= srcleft; - if (!t->ucase) { + if (!dtcase) { /* give back the memory we didn't use */ buffer_set_used_size(dest, dest->used - destleft); } else {
--- a/src/lib-charset/charset-utf8.c Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-charset/charset-utf8.c Fri Jul 20 17:37:05 2007 +0300 @@ -2,6 +2,7 @@ #include "lib.h" #include "buffer.h" +#include "unichar.h" #include "charset-utf8.h" #include <ctype.h> @@ -16,33 +17,28 @@ #ifndef HAVE_ICONV -#include <ctype.h> +struct charset_translation { + enum charset_flags flags; +}; -struct charset_translation { - int dummy; +static struct charset_translation raw_translation = { 0 }; +static struct charset_translation tc_translation = { + CHARSET_FLAG_DECOMP_TITLECASE }; -static struct charset_translation ascii_translation, utf8_translation; -static struct charset_translation ascii_translation_uc, utf8_translation_uc; - -struct charset_translation * -charset_to_utf8_begin(const char *charset, bool ucase, bool *unknown_charset_r) +int charset_to_utf8_begin(const char *charset, enum charset_flags flags, + struct charset_translation **t_r) { - if (unknown_charset_r != NULL) - *unknown_charset_r = FALSE; - - if (strcasecmp(charset, "us-ascii") == 0 || - strcasecmp(charset, "ascii") == 0) - return ucase ? &ascii_translation_uc : &ascii_translation; - - if (strcasecmp(charset, "UTF-8") == 0 || - strcasecmp(charset, "UTF8") == 0) - return ucase ? &utf8_translation_uc : &utf8_translation; + if (charset_is_utf8(charset)) { + if ((flags & CHARSET_FLAG_DECOMP_TITLECASE) != 0) + *t_r = &tc_translation; + else + *t_r = &raw_translation; + return 0; + } /* no support for charsets that need translation */ - if (unknown_charset_r != NULL) - *unknown_charset_r = TRUE; - return NULL; + return -1; } void charset_to_utf8_end(struct charset_translation **t __attr_unused__) @@ -57,12 +53,12 @@ charset_to_utf8(struct charset_translation *t, const unsigned char *src, size_t *src_size, buffer_t *dest) { - if (t != &utf8_translation_uc && t != &ascii_translation_uc) { + if ((t->flags & CHARSET_FLAG_DECOMP_TITLECASE) == 0) buffer_append(dest, src, *src_size); - return CHARSET_RET_OK; + else { + if (uni_utf8_to_decomposed_titlecase(src, *src_size, dest) < 0) + return CHARSET_RET_INVALID_INPUT; } - if (uni_utf8_to_decomposed_titlecase(src, *src_size, dest) < 0) - return CHARSET_RET_INVALID_INPUT; return CHARSET_RET_OK; }
--- a/src/lib-charset/charset-utf8.h Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-charset/charset-utf8.h Fri Jul 20 17:37:05 2007 +0300 @@ -1,18 +1,23 @@ #ifndef __CHARSET_UTF8_H #define __CHARSET_UTF8_H +struct charset_translation; + +enum charset_flags { + /* Translate the output to decomposed titlecase */ + CHARSET_FLAG_DECOMP_TITLECASE = 0x01 +}; + enum charset_result { CHARSET_RET_OK = 1, CHARSET_RET_INCOMPLETE_INPUT = -1, CHARSET_RET_INVALID_INPUT = -2 }; -/* Begin translation to UTF-8. If ucase=TRUE, returns data uppercased. */ -struct charset_translation * -charset_to_utf8_begin(const char *charset, bool ucase, bool *unknown_charset_r); - +/* Begin translation to UTF-8. Returns -1 if charset is unknown. */ +int charset_to_utf8_begin(const char *charset, enum charset_flags flags, + struct charset_translation **t_r); void charset_to_utf8_end(struct charset_translation **t); - void charset_to_utf8_reset(struct charset_translation *t); /* Returns TRUE if charset is UTF-8 or ASCII */
--- a/src/lib-mail/message-decoder.c Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-mail/message-decoder.c Fri Jul 20 17:37:05 2007 +0300 @@ -212,15 +212,13 @@ unsigned char new_buf[MAX_ENCODING_BUF_SIZE+1]; const unsigned char *data = NULL; size_t pos, size = 0, skip = 0; - bool unknown_charset; int ret; if (ctx->charset_trans == NULL && !ctx->charset_utf8) { - ctx->charset_trans = - charset_to_utf8_begin(ctx->content_charset != NULL ? - ctx->content_charset : "UTF-8", - ctx->ucase, - &unknown_charset); + if (charset_to_utf8_begin(ctx->content_charset != NULL ? + ctx->content_charset : "UTF-8", + ctx->ucase, &ctx->charset_trans) < 0) + ctx->charset_trans = NULL; } if (ctx->encoding_size != 0) {
--- a/src/lib-mail/message-header-decode.c Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-mail/message-header-decode.c Fri Jul 20 17:37:05 2007 +0300 @@ -129,7 +129,6 @@ { struct decode_utf8_context *ctx = context; struct charset_translation *t; - bool unknown_charset; /* one call with charset=NULL means nothing changed */ if (!ctx->called && charset == NULL) @@ -148,8 +147,7 @@ return TRUE; } - t = charset_to_utf8_begin(charset, ctx->ucase, &unknown_charset); - if (unknown_charset) { + if (charset_to_utf8_begin(charset, ctx->ucase, &t) < 0) { /* let's just ignore this part */ return TRUE; }
--- a/src/lib-mail/message-search.c Fri Jul 20 17:27:02 2007 +0300 +++ b/src/lib-mail/message-search.c Fri Jul 20 17:37:05 2007 +0300 @@ -35,8 +35,7 @@ string_t *key_utf8; size_t key_len; - t = charset_to_utf8_begin(charset, TRUE, NULL); - if (t == NULL) + if (charset_to_utf8_begin(charset, TRUE, &t) < 0) return 0; t_push();