]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fts: Move ICU transliterator creation to fts-icu.h
authorTeemu Huovila <teemu.huovila@dovecot.fi>
Wed, 25 Nov 2015 13:09:52 +0000 (15:09 +0200)
committerTeemu Huovila <teemu.huovila@dovecot.fi>
Wed, 25 Nov 2015 13:09:52 +0000 (15:09 +0200)
This allows others to use transliterators without so much code duplication.
The transliterator still has to be destroyed by the user, with utrans_close().

src/lib-fts/fts-filter-normalizer-icu.c
src/lib-fts/fts-icu.c
src/lib-fts/fts-icu.h

index a6251adcf8d990724c620a24ee7a2affa24a91f5..f9fb1ddbbe7774e32c2d6ef1146d013c1a7dd8ef 100644 (file)
@@ -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);
index a39bc59e3f5c7a7d0da6eb7acfad6222522937a1..8367e26554e623b3b4063721f2fb5c3a68aacf32 100644 (file)
@@ -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;
+}
index 5e5e285e35d1578c8890e92d912a6aa255480555..09fbcb551e77675efccfd9e6fa6944b874e91661 100644 (file)
@@ -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