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