dovecot-2.2: lib-fts: Move ICU transliterator creation to fts-icu.h
dovecot at dovecot.org
dovecot at dovecot.org
Wed Nov 25 13:10:13 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/129e61ef9de4
changeset: 19418:129e61ef9de4
user: Teemu Huovila <teemu.huovila at dovecot.fi>
date: Wed Nov 25 15:09:52 2015 +0200
description:
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().
diffstat:
src/lib-fts/fts-filter-normalizer-icu.c | 41 +++-----------------------------
src/lib-fts/fts-icu.c | 33 ++++++++++++++++++++++++++
src/lib-fts/fts-icu.h | 3 ++
3 files changed, 40 insertions(+), 37 deletions(-)
diffs (129 lines):
diff -r 6dafc8b24681 -r 129e61ef9de4 src/lib-fts/fts-filter-normalizer-icu.c
--- 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);
diff -r 6dafc8b24681 -r 129e61ef9de4 src/lib-fts/fts-icu.c
--- 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;
+}
diff -r 6dafc8b24681 -r 129e61ef9de4 src/lib-fts/fts-icu.h
--- 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
More information about the dovecot-cvs
mailing list