# HG changeset patch # User Timo Sirainen # Date 1039441172 -7200 # Node ID 03832c7f389b38e5148360f6fdf15f6832ab5972 # Parent 553f050c83132c5b07e1fbc7b699e3cdd0930ade Compiles again without iconv() diff -r 553f050c8313 -r 03832c7f389b src/lib-charset/charset-iconv.c --- a/src/lib-charset/charset-iconv.c Sun Dec 08 07:23:07 2002 +0200 +++ b/src/lib-charset/charset-iconv.c Mon Dec 09 15:39:32 2002 +0200 @@ -67,17 +67,6 @@ (void)iconv(t->cd, NULL, NULL, NULL, NULL); } -static void str_ucase_utf8(const unsigned char *src, size_t src_size, - Buffer *dest, size_t destpos) -{ - char *destbuf; - size_t i; - - destbuf = buffer_get_space(dest, destpos, src_size); - for (i = 0; i < src_size; i++) - destbuf[i] = i_toupper(src[i]); /* FIXME: utf8 */ -} - CharsetResult charset_to_ucase_utf8(CharsetTranslation *t, const Buffer *src, size_t *src_pos, Buffer *dest) @@ -95,7 +84,8 @@ size = buffer_get_used_size(src); if (size > destleft) size = destleft; - str_ucase_utf8(buffer_get_data(src, NULL), size, dest, destpos); + _charset_utf8_ucase(buffer_get_data(src, NULL), + size, dest, destpos); if (src_pos != NULL) *src_pos = size; return CHARSET_RET_OK; @@ -124,27 +114,11 @@ if (src_pos != NULL) *src_pos = buffer_get_used_size(src) - srcleft; - str_ucase_utf8((unsigned char *) ic_destbuf - size, size, - dest, destpos); + _charset_utf8_ucase((unsigned char *) ic_destbuf - size, size, + dest, destpos); return ret; } -static const char *alloc_str_ucase_utf8(const Buffer *data, size_t *utf8_size) -{ - 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); - str_ucase_utf8(buf, size, dest, 0); - if (utf8_size != NULL) - *utf8_size = buffer_get_used_size(dest); - buffer_append_c(dest, '\0'); - return buffer_free_without_data(dest); -} - const char * charset_to_ucase_utf8_string(const char *charset, int *unknown_charset, const Buffer *data, size_t *utf8_size) @@ -157,8 +131,11 @@ if (charset == NULL || strcasecmp(charset, "us-ascii") == 0 || strcasecmp(charset, "ascii") == 0 || strcasecmp(charset, "UTF-8") == 0 || - strcasecmp(charset, "UTF8") == 0) - return alloc_str_ucase_utf8(data, utf8_size); + strcasecmp(charset, "UTF8") == 0) { + if (unknown_charset != NULL) + *unknown_charset = FALSE; + return _charset_utf8_ucase_strdup(data, utf8_size); + } cd = iconv_open("UTF-8", charset); if (cd == (iconv_t)-1) { diff -r 553f050c8313 -r 03832c7f389b src/lib-charset/charset-utf8.c --- a/src/lib-charset/charset-utf8.c Sun Dec 08 07:23:07 2002 +0200 +++ b/src/lib-charset/charset-utf8.c Mon Dec 09 15:39:32 2002 +0200 @@ -1,8 +1,39 @@ /* Copyright (C) 2002 Timo Sirainen */ #include "lib.h" +#include "buffer.h" #include "charset-utf8.h" +#include + +void _charset_utf8_ucase(const unsigned char *src, size_t src_size, + Buffer *dest, size_t destpos) +{ + char *destbuf; + size_t i; + + destbuf = buffer_get_space(dest, destpos, src_size); + for (i = 0; i < src_size; i++) + destbuf[i] = i_toupper(src[i]); /* FIXME: utf8 */ +} + +const char *_charset_utf8_ucase_strdup(const Buffer *data, size_t *utf8_size) +{ + 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); + buffer_append_c(dest, '\0'); + return buffer_free_without_data(dest); +} + + #ifndef HAVE_ICONV_H #include @@ -41,40 +72,41 @@ { } -int charset_to_ucase_utf8(CharsetTranslation *t __attr_unused__, - const unsigned char **inbuf, size_t *insize, - unsigned char *outbuf, size_t *outsize) +CharsetResult +charset_to_ucase_utf8(CharsetTranslation *t __attr_unused__, + const Buffer *src, size_t *src_pos, Buffer *dest) { - size_t max_size, i; + size_t size, destpos, destleft; + + destpos = buffer_get_used_size(dest); + destleft = buffer_get_size(dest) - destpos; - max_size = I_MIN(*insize, *outsize); - for (i = 0; i < max_size; i++) - outbuf[i] = i_toupper((*inbuf)[i]); /* FIXME: utf8 */ - - *insize = 0; - *outsize = max_size; - - return TRUE; + /* 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; + return CHARSET_RET_OK; } const char * charset_to_ucase_utf8_string(const char *charset, int *unknown_charset, - const unsigned char *buf, - size_t *size __attr_unused__) + const Buffer *data, size_t *utf8_size) { if (charset == NULL || strcasecmp(charset, "us-ascii") == 0 || strcasecmp(charset, "ascii") == 0 || strcasecmp(charset, "UTF-8") == 0 || strcasecmp(charset, "UTF8") == 0) { - outbuf = t_malloc(*size + 1); - memcpy(outbuf, buf, *size); - outbuf[*size] = '\0'; - return str_ucase(outbuf); /* FIXME: utf8 */ + if (unknown_charset != NULL) + *unknown_charset = FALSE; + return _charset_utf8_ucase_strdup(data, utf8_size); + } else { + if (unknown_charset != NULL) + *unknown_charset = TRUE; + return NULL; } - - if (unknown_charset != NULL) - *unknown_charset = TRUE; - return NULL; } #endif diff -r 553f050c8313 -r 03832c7f389b src/lib-charset/charset-utf8.h --- a/src/lib-charset/charset-utf8.h Sun Dec 08 07:23:07 2002 +0200 +++ b/src/lib-charset/charset-utf8.h Mon Dec 09 15:39:32 2002 +0200 @@ -30,4 +30,8 @@ charset_to_ucase_utf8_string(const char *charset, int *unknown_charset, const Buffer *data, size_t *utf8_size); +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); + #endif