Mercurial > dovecot > core-2.2
changeset 19418:129e61ef9de4
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().
author | Teemu Huovila <teemu.huovila@dovecot.fi> |
---|---|
date | Wed, 25 Nov 2015 15:09:52 +0200 |
parents | 6dafc8b24681 |
children | 66a04329b5e9 |
files | src/lib-fts/fts-filter-normalizer-icu.c src/lib-fts/fts-icu.c src/lib-fts/fts-icu.h |
diffstat | 3 files changed, 40 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-fts/fts-filter-normalizer-icu.c Wed Nov 25 15:09:52 2015 +0200 +++ b/src/lib-fts/fts-filter-normalizer-icu.c Wed Nov 25 15:09:52 2015 +0200 @@ -14,8 +14,6 @@ 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,53 +61,22 @@ 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) { 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);
--- a/src/lib-fts/fts-icu.c Wed Nov 25 15:09:52 2015 +0200 +++ b/src/lib-fts/fts-icu.c Wed Nov 25 15:09:52 2015 +0200 @@ -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 @@ } 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; +}
--- a/src/lib-fts/fts-icu.h Wed Nov 25 15:09:52 2015 +0200 +++ b/src/lib-fts/fts-icu.h Wed Nov 25 15:09:52 2015 +0200 @@ -19,4 +19,7 @@ /* 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