From: Teemu Huovila Date: Wed, 25 Nov 2015 13:09:52 +0000 (+0200) Subject: lib-fts: Move ICU transliterator creation to fts-icu.h X-Git-Tag: 2.2.20.rc1~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c1ce38a29ecdc17480aacb5bac184f42ac05786;p=thirdparty%2Fdovecot%2Fcore.git lib-fts: Move ICU transliterator creation to fts-icu.h This allows others to use transliterators without so much code duplication. The transliterator still has to be destroyed by the user, with utrans_close(). --- diff --git a/src/lib-fts/fts-filter-normalizer-icu.c b/src/lib-fts/fts-filter-normalizer-icu.c index a6251adcf8..f9fb1ddbbe 100644 --- a/src/lib-fts/fts-filter-normalizer-icu.c +++ b/src/lib-fts/fts-filter-normalizer-icu.c @@ -14,8 +14,6 @@ struct fts_filter_normalizer_icu { struct fts_filter filter; pool_t pool; const char *transliterator_id; - const UChar *transliterator_id_utf16; - unsigned int transliterator_id_utf16_len; UTransliterator *transliterator; buffer_t *utf16_token, *trans_token; @@ -63,42 +61,10 @@ fts_filter_normalizer_icu_create(const struct fts_language *lang ATTR_UNUSED, np->utf16_token = buffer_create_dynamic(pp, 128); np->trans_token = buffer_create_dynamic(pp, 128); np->utf8_token = buffer_create_dynamic(pp, 128); - fts_icu_utf8_to_utf16(np->utf16_token, id); - np->transliterator_id_utf16 = - p_memdup(pp, np->utf16_token->data, np->utf16_token->used); - np->transliterator_id_utf16_len = np->utf16_token->used / sizeof(UChar); *filter_r = &np->filter; return 0; } -static int -fts_filter_normalizer_icu_create_trans(struct fts_filter_normalizer_icu *np, - const char **error_r) -{ - UErrorCode err = U_ZERO_ERROR; - UParseError perr; - - memset(&perr, 0, sizeof(perr)); - - np->transliterator = utrans_openU(np->transliterator_id_utf16, - np->transliterator_id_utf16_len, - UTRANS_FORWARD, NULL, 0, &perr, &err); - if (U_FAILURE(err)) { - string_t *str = t_str_new(128); - - str_printfa(str, "Failed to open transliterator for id '%s': %s", - np->transliterator_id, u_errorName(err)); - if (perr.line >= 1) { - /* we have only one line in our ID */ - str_printfa(str, " (parse error on offset %u)", - perr.offset); - } - *error_r = str_c(str); - return -1; - } - return 0; -} - static int fts_filter_normalizer_icu_filter(struct fts_filter *filter, const char **token, const char **error_r) @@ -106,10 +72,11 @@ fts_filter_normalizer_icu_filter(struct fts_filter *filter, const char **token, struct fts_filter_normalizer_icu *np = (struct fts_filter_normalizer_icu *)filter; - if (np->transliterator == NULL) { - if (fts_filter_normalizer_icu_create_trans(np, error_r) < 0) + if (np->transliterator == NULL) + if (fts_icu_transliterator_create(np->transliterator_id, + &np->transliterator, + error_r) < 0) return -1; - } fts_icu_utf8_to_utf16(np->utf16_token, *token); buffer_append_zero(np->utf16_token, 2); diff --git a/src/lib-fts/fts-icu.c b/src/lib-fts/fts-icu.c index a39bc59e3f..8367e26554 100644 --- a/src/lib-fts/fts-icu.c +++ b/src/lib-fts/fts-icu.c @@ -1,7 +1,9 @@ /* Copyright (c) 2014-2015 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "mempool.h" #include "buffer.h" +#include "str.h" #include "unichar.h" #include "fts-icu.h" @@ -164,3 +166,34 @@ void fts_icu_deinit(void) } u_cleanup(); } + +int fts_icu_transliterator_create(const char *id, + UTransliterator **transliterator_r, + const char **error_r) +{ + UErrorCode err = U_ZERO_ERROR; + UParseError perr; + buffer_t *id_utf16_buf = buffer_create_dynamic(pool_datastack_create(), 2 * strlen(id)); + UChar *id_utf16; + memset(&perr, 0, sizeof(perr)); + + fts_icu_utf8_to_utf16(id_utf16_buf, id); + id_utf16 = (UChar *)str_c(id_utf16_buf); + *transliterator_r = utrans_openU(id_utf16, + id_utf16_buf->used / sizeof(UChar), + UTRANS_FORWARD, NULL, 0, &perr, &err); + if (U_FAILURE(err)) { + string_t *str = t_str_new(128); + + str_printfa(str, "Failed to open transliterator for id '%s': %s", + id, u_errorName(err)); + if (perr.line >= 1) { + /* we have only one line in our ID */ + str_printfa(str, " (parse error on offset %u)", + perr.offset); + } + *error_r = str_c(str); + return -1; + } + return 0; +} diff --git a/src/lib-fts/fts-icu.h b/src/lib-fts/fts-icu.h index 5e5e285e35..09fbcb551e 100644 --- a/src/lib-fts/fts-icu.h +++ b/src/lib-fts/fts-icu.h @@ -19,4 +19,7 @@ void fts_icu_lcase(string_t *dest_utf8, const char *src_utf8); /* Free all the memory used by ICU functions. */ void fts_icu_deinit(void); +int fts_icu_transliterator_create(const char *id, + UTransliterator **transliterator_r, + const char **error_r) ; #endif