Mercurial > dovecot > core-2.2
changeset 19379:92aa48461150
lib-fts: Added fts_language_register() to register more languages in plugins.
author | Teemu Huovila <teemu.huovila@dovecot.fi> |
---|---|
date | Tue, 17 Nov 2015 11:50:16 +0200 |
parents | ea447bc283e1 |
children | 6bf404e276c6 |
files | src/lib-fts/fts-language.c src/lib-fts/fts-language.h src/lib-fts/test-fts-language.c |
diffstat | 3 files changed, 79 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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" }; -const struct fts_language *fts_language_find(const char *name) +void fts_languages_init(void) { unsigned int i; + const struct fts_language *lp; - for (i = 0; i < N_ELEMENTS(fts_languages); i++) { - if (strcmp(fts_languages[i].name, name) == 0) - return &fts_languages[i]; + 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) +{ + const struct fts_language *const *langp = NULL; + + array_foreach(&fts_languages, langp) { + if (strcmp((*langp)->name, name) == 0) + return *langp; } return NULL; }
--- 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);
--- 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; }