const char *textcat_config;
const char *textcat_datadir;
void *textcat_handle;
- bool textcat_failed;
+ const char *textcat_failed;
};
pool_t fts_languages_pool;
#endif
#ifdef HAVE_FTS_EXTTEXTCAT
-static int fts_language_textcat_init(struct fts_language_list *list)
+static int fts_language_textcat_init(struct fts_language_list *list,
+ const char **error_r)
{
const char *config_path;
const char *data_dir;
if (list->textcat_handle != NULL)
return 0;
- if (list->textcat_failed)
+ if (list->textcat_failed != NULL) {
+ *error_r = list->textcat_failed;
return -1;
+ }
config_path = list->textcat_config != NULL ? list->textcat_config :
TEXTCAT_DATADIR"/fpdb.conf";
TEXTCAT_DATADIR"/";
list->textcat_handle = special_textcat_Init(config_path, data_dir);
if (list->textcat_handle == NULL) {
- i_error("special_textcat_Init(%s, %s) failed",
+ *error_r = list->textcat_failed = p_strdup_printf(list->pool,
+ "special_textcat_Init(%s, %s) failed",
config_path, data_dir);
- list->textcat_failed = TRUE;
return -1;
}
/* The textcat minimum document size could be set here. It
fts_language_detect_textcat(struct fts_language_list *list ATTR_UNUSED,
const unsigned char *text ATTR_UNUSED,
size_t size ATTR_UNUSED,
- const struct fts_language **lang_r ATTR_UNUSED)
+ const struct fts_language **lang_r ATTR_UNUSED,
+ const char **error_r ATTR_UNUSED)
{
#ifdef HAVE_FTS_EXTTEXTCAT
candidate_t *candp; /* textcat candidate result array pointer */
int cnt;
bool match = FALSE;
- if (fts_language_textcat_init(list) < 0)
+ if (fts_language_textcat_init(list, error_r) < 0)
return FTS_LANGUAGE_RESULT_ERROR;
candp = textcat_GetClassifyFullOutput(list->textcat_handle);
fts_language_detect(struct fts_language_list *list,
const unsigned char *text ATTR_UNUSED,
size_t size ATTR_UNUSED,
- const struct fts_language **lang_r)
+ const struct fts_language **lang_r,
+ const char **error_r)
{
i_assert(array_count(&list->languages) > 0);
*lang_r = *langp;
return FTS_LANGUAGE_RESULT_OK;
}
- return fts_language_detect_textcat(list, text, size, lang_r);
+ return fts_language_detect_textcat(list, text, size, lang_r, error_r);
}
test_begin("fts language detect Finnish");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, finnish, sizeof(finnish)-1, &lang_r)
+ test_assert(fts_language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "fi") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect English");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, english, sizeof(english)-1, &lang_r)
+ test_assert(fts_language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "en") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect French");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, french, sizeof(french)-1, &lang_r)
+ test_assert(fts_language_detect(lp, french, sizeof(french)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "fr") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect German");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, german, sizeof(german)-1, &lang_r)
+ test_assert(fts_language_detect(lp, german, sizeof(german)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "de") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect Swedish");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, swedish, sizeof(swedish)-1, &lang_r)
+ test_assert(fts_language_detect(lp, swedish, sizeof(swedish)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "sv") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect Bokmal as Norwegian");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, bokmal, sizeof(bokmal)-1, &lang_r)
+ test_assert(fts_language_detect(lp, bokmal, sizeof(bokmal)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "no") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect Nynorsk as Norwegian");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, nynorsk, sizeof(nynorsk)-1, &lang_r)
+ test_assert(fts_language_detect(lp, nynorsk, sizeof(nynorsk)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "no") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect Finnish as English");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, finnish, sizeof(finnish)-1, &lang_r)
+ test_assert(fts_language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_OK);
test_assert(strcmp(lang_r->name, "en") == 0);
fts_language_list_deinit(&lp);
test_begin("fts language detect not available");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, english, sizeof(english)-1, &lang_r)
+ test_assert(fts_language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
== FTS_LANGUAGE_RESULT_UNKNOWN);
fts_language_list_deinit(&lp);
test_end();
test_begin("fts language detect unknown");
test_assert(fts_language_list_init(settings, &lp, &error) == 0);
test_assert(fts_language_list_add_names(lp, names, &unknown) == TRUE);
- test_assert(fts_language_detect(lp, klingon, sizeof(klingon), &lang_r)
+ test_assert(fts_language_detect(lp, klingon, sizeof(klingon), &lang_r, &error)
== FTS_LANGUAGE_RESULT_UNKNOWN);
fts_language_list_deinit(&lp);
test_end();