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