]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-language: language_list_init() - Simplify configuration
authorMarkus Valentin <markus.valentin@open-xchange.com>
Wed, 15 Nov 2023 07:48:46 +0000 (08:48 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:10 +0000 (12:34 +0200)
This removes the string-table based settings for language_list_init()
and introduces struct language_settings.

src/lib-language/language.c
src/lib-language/language.h
src/lib-language/test-language.c
src/plugins/fts/fts-user.c

index c12800372125b419e261283c1d2227895613acb7..e51aae93ba5417e57b11f714811499df960644cf 100644 (file)
@@ -127,42 +127,18 @@ const struct language *language_find(const char *name)
        return NULL;
 }
 
-int language_list_init(const char *const *settings,
-                      struct language_list **list_r,
-                      const char **error_r)
+struct language_list *language_list_init(const struct language_settings *settings)
 {
        struct language_list *lp;
        pool_t pool;
-       unsigned int i;
-       const char *conf = NULL, *data = NULL;
-
-       for (i = 0; settings[i] != NULL; i += 2) {
-               const char *key = settings[i], *value = settings[i+1];
-
-               if (strcmp(key, "fts_language_config") == 0)
-                       conf = value;
-               else if (strcmp(key, "fts_language_data") == 0)
-                       data = value;
-               else {
-                       *error_r = t_strdup_printf("Unknown setting: %s", key);
-                       return -1;
-               }
-       }
 
        pool = pool_alloconly_create("language_list", 128);
        lp = p_new(pool, struct language_list, 1);
        lp->pool = pool;
-       if (conf != NULL)
-               lp->textcat_config = p_strdup(pool, conf);
-       else
-               lp->textcat_config = NULL;
-       if (data != NULL)
-               lp->textcat_datadir = p_strdup(pool, data);
-       else
-               lp->textcat_datadir = NULL;
+       lp->textcat_config = p_strdup_empty(pool, settings->textcat_config_path);
+       lp->textcat_datadir = p_strdup_empty(pool, settings->textcat_data_path);
        p_array_init(&lp->languages, pool, 32);
-       *list_r = lp;
-       return 0;
+       return lp;
 }
 
 void language_list_deinit(struct language_list **list)
index 15aeeb0674c3bbcee4ec0ca1338535cbae0ce6a3..1efcc1266aecca149dc826cb3e6c2313e1ea93bc 100644 (file)
@@ -14,6 +14,11 @@ enum language_detect_result {
        LANGUAGE_DETECT_RESULT_ERROR
 };
 
+struct language_settings {
+       const char *textcat_config_path;
+       const char *textcat_data_path;
+};
+
 struct language {
        /* Two-letter language name lowercased, e.g. "en" */
        const char *name;
@@ -38,9 +43,7 @@ const struct language *language_find(const char *name);
 /*
   Language list API
 */
-int language_list_init(const char *const *settings,
-                      struct language_list **list_r,
-                      const char **error_r);
+struct language_list *language_list_init(const struct language_settings *settings);
 void language_list_deinit(struct language_list **list);
 
 /* Add a language to the list of wanted languages. */
index bff6cdfc29ecaab6225e9024240a36a8871bd349..c343cc11dc9948d307063ba7472e3af5a73d3ece 100644 (file)
@@ -6,9 +6,10 @@
 /* TODO: These checks will not work without proper libtextcat configuration.
    As such, they are not really unit test to be coupled with the build. */
 
-const char *const settings[] =
-       {"fts_language_config", TEXTCAT_DATADIR"/fpdb.conf",
-        "fts_language_data", TEXTCAT_DATADIR"/", NULL};
+const struct language_settings settings = {
+       .textcat_config_path = TEXTCAT_DATADIR"/fpdb.conf",
+       .textcat_data_path = TEXTCAT_DATADIR"/",
+};
 
 /* Detect Finnish. fi--utf8 */
 static void test_language_detect_finnish(void)
@@ -26,7 +27,7 @@ static void test_language_detect_finnish(void)
        const char names[] = "de, fi, en";
        const char *unknown, *error;
        test_begin("language detect Finnish");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -53,7 +54,7 @@ static void test_language_detect_english(void)
        const char names[] = "fi, de, fr, en";
        const char *unknown, *error;
        test_begin("language detect English");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -88,7 +89,7 @@ static void test_language_detect_french(void)
        const char names[] = "de, fi, fr, en";
        const char *unknown, *error;
        test_begin("language detect French");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, french, sizeof(french)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -125,7 +126,7 @@ static void test_language_detect_german(void)
        const char names[] = "fi, de, fr, en";
        const char *unknown, *error;
        test_begin("language detect German");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, german, sizeof(german)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -151,7 +152,7 @@ static void test_language_detect_swedish(void)
        const char names[] = "fi, de, sv, fr, en";
        const char *unknown, *error;
        test_begin("language detect Swedish");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, swedish, sizeof(swedish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -175,7 +176,7 @@ static void test_language_detect_bokmal(void)
        const char names[] = "fi, de, sv, no, fr, en";
        const char *unknown, *error;
        test_begin("language detect Bokmal as Norwegian");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, bokmal, sizeof(bokmal)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -199,7 +200,7 @@ static void test_language_detect_nynorsk(void)
        const char names[] = "fi, de, sv, no, fr, en";
        const char *unknown, *error;
        test_begin("language detect Nynorsk as Norwegian");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, nynorsk, sizeof(nynorsk)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -224,7 +225,7 @@ static void test_language_detect_finnish_as_english(void)
        const char names[] = "en";
        const char *unknown, *error;
        test_begin("language detect Finnish as English");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
@@ -251,7 +252,7 @@ static void test_language_detect_na(void)
        const char names[] = "fi, de, fr";
        const char *unknown, *error;
        test_begin("language detect not available");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_UNKNOWN);
@@ -271,7 +272,7 @@ static void test_language_detect_unknown(void)
        const char names[] = "fi, de, fr";
        const char *unknown, *error;
        test_begin("language detect unknown");
-       test_assert(language_list_init(settings, &lp, &error) == 0);
+       lp = language_list_init(&settings);
        test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
        test_assert(language_detect(lp, klingon, sizeof(klingon), &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_UNKNOWN);
index a160efed0e07092df524b9c23cff15c0e84d01f2..8aac625fdad27194ea4786ba79817145c05b58e0 100644 (file)
@@ -63,7 +63,6 @@ fts_user_init_languages(struct mail_user *user, struct fts_user *fuser,
                        const char **error_r)
 {
        const char *languages, *unknown;
-       const char *lang_config[3] = {NULL, NULL, NULL};
 
        languages = mail_user_plugin_getenv(user, "fts_languages");
        if (languages == NULL) {
@@ -71,11 +70,10 @@ fts_user_init_languages(struct mail_user *user, struct fts_user *fuser,
                return -1;
        }
 
-       lang_config[1] = mail_user_plugin_getenv(user, "fts_language_config");
-       if (lang_config[1] != NULL)
-               lang_config[0] = "fts_language_config";
-       if (language_list_init(lang_config, &fuser->lang_list, error_r) < 0)
-               return -1;
+       struct language_settings lang_settings = {
+               .textcat_config_path = mail_user_plugin_getenv(user, "fts_language_config")
+       };
+       fuser->lang_list = language_list_init(&lang_settings);
 
        if (!language_list_add_names(fuser->lang_list, languages, &unknown)) {
                *error_r = t_strdup_printf(