dovecot-2.2: lib-fts: Added fts_language_register() to register ...

dovecot at dovecot.org dovecot at dovecot.org
Tue Nov 17 09:56:45 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/92aa48461150
changeset: 19379:92aa48461150
user:      Teemu Huovila <teemu.huovila at dovecot.fi>
date:      Tue Nov 17 11:50:16 2015 +0200
description:
lib-fts: Added fts_language_register() to register more languages in plugins.

diffstat:

 src/lib-fts/fts-language.c      |  50 +++++++++++++++++++++++++++++++++++-----
 src/lib-fts/fts-language.h      |  10 ++++++++
 src/lib-fts/test-fts-language.c |  27 +++++++++++++++++++++-
 3 files changed, 79 insertions(+), 8 deletions(-)

diffs (150 lines):

diff -r ea447bc283e1 -r 92aa48461150 src/lib-fts/fts-language.c
--- a/src/lib-fts/fts-language.c	Tue Nov 17 11:46:49 2015 +0200
+++ b/src/lib-fts/fts-language.c	Tue Nov 17 11:50:16 2015 +0200
@@ -2,9 +2,9 @@
 
 #include "lib.h"
 #include "array.h"
+#include "llist.h"
 #include "fts-language.h"
-#include "strfuncs.h"
-#include "llist.h"
+
 
 #ifdef HAVE_LIBEXTTEXTCAT_TEXTCAT_H
 #  include <libexttextcat/textcat.h>
@@ -29,8 +29,11 @@
 	bool textcat_failed;
 };
 
+pool_t fts_languages_pool;
+ARRAY_TYPE(fts_language) fts_languages;
+
 /*  ISO 639-1 alpha 2 codes for languages */
-const struct fts_language fts_languages[] = {
+const struct fts_language fts_languages_builtin [] = {
 	{ "da" }, /* Danish */
 	{ "de" }, /* German */
 	{ "en" }, /* English */
@@ -50,13 +53,46 @@
 	"data"
 };
 
+void fts_languages_init(void)
+{
+	unsigned int i;
+	const struct fts_language *lp;
+
+	fts_languages_pool = pool_alloconly_create("fts_language",
+	                                           sizeof(fts_languages_builtin));
+	p_array_init(&fts_languages, fts_languages_pool,
+	             N_ELEMENTS(fts_languages_builtin));
+	for (i = 0; i < N_ELEMENTS(fts_languages_builtin); i++){
+		lp = &fts_languages_builtin[i];
+		array_append(&fts_languages, &lp, 1);
+	}
+}
+
+void fts_languages_deinit(void)
+{
+	if (fts_languages_pool != NULL)
+		pool_unref(&fts_languages_pool);
+}
+
+void fts_language_register(const char *name)
+{
+	struct fts_language *lang;
+
+	if (fts_language_find(name) != NULL)
+		return;
+
+	lang = p_new(fts_languages_pool, struct fts_language, 1);
+	lang->name = p_strdup(fts_languages_pool, name);
+	array_append(&fts_languages, (const struct fts_language **)&lang, 1);
+}
+
 const struct fts_language *fts_language_find(const char *name)
 {
-	unsigned int i;
+	const struct fts_language *const *langp = NULL;
 
-	for (i = 0; i < N_ELEMENTS(fts_languages); i++) {
-		if (strcmp(fts_languages[i].name, name) == 0)
-			return &fts_languages[i];
+	array_foreach(&fts_languages, langp) {
+		if (strcmp((*langp)->name, name) == 0)
+			return *langp;
 	}
 	return NULL;
 }
diff -r ea447bc283e1 -r 92aa48461150 src/lib-fts/fts-language.h
--- a/src/lib-fts/fts-language.h	Tue Nov 17 11:46:49 2015 +0200
+++ b/src/lib-fts/fts-language.h	Tue Nov 17 11:50:16 2015 +0200
@@ -24,10 +24,20 @@
    language-specific filters. */
 extern const struct fts_language fts_language_data;
 
+/*
+  Language module API.
+*/
+void fts_languages_init(void);
+void fts_languages_deinit(void);
+/* Add a language to the list of supported languages. */
+void fts_language_register(const char *name);
 /* Find a specified language by name. This finds from the internal list of
    supported languages. */
 const struct fts_language *fts_language_find(const char *name);
 
+/*
+  Language list API
+*/
 int fts_language_list_init(const char *const *settings,
 			   struct fts_language_list **list_r,
 			   const char **error_r);
diff -r ea447bc283e1 -r 92aa48461150 src/lib-fts/test-fts-language.c
--- a/src/lib-fts/test-fts-language.c	Tue Nov 17 11:46:49 2015 +0200
+++ b/src/lib-fts/test-fts-language.c	Tue Nov 17 11:50:16 2015 +0200
@@ -278,9 +278,29 @@
 	fts_language_list_deinit(&lp);
 	test_end();
 }
+static void test_fts_language_find_builtin(void)
+{
+	const struct fts_language *lp;
+	test_begin("fts language find built-in");
+	lp = fts_language_find("en");
+	test_assert(lp != NULL);
+	test_assert(strcmp(lp->name, "en") == 0);
+	test_end();
+}
+static void test_fts_language_register(void)
+{
+	const struct fts_language *lp;
+	test_begin("fts language register");
+	fts_language_register("jp");
+	lp = fts_language_find("jp");
+	test_assert(lp != NULL);
+	test_assert(strcmp(lp->name, "jp") == 0);
+	test_end();
+}
 
 int main(void)
 {
+	int ret;
 	static void (*test_functions[])(void) = {
 		test_fts_language_detect_finnish,
 		test_fts_language_detect_english,
@@ -292,7 +312,12 @@
 		test_fts_language_detect_finnish_as_english,
 		test_fts_language_detect_na,
 		test_fts_language_detect_unknown,
+		test_fts_language_find_builtin,
+		test_fts_language_register,
 		NULL
 	};
-	return test_run(test_functions);
+	fts_languages_init();
+	ret = test_run(test_functions);
+	fts_languages_deinit();
+	return ret;
 }


More information about the dovecot-cvs mailing list