return 0;
}
-static int make_utf8(const UChar *src, char **dst, const char **error_r)
+static int make_utf8(const UChar *src, const char **_dst, const char **error_r)
{
+ char *dst;
char *retp = NULL;
int32_t dsize = 0;
int32_t dsize_actual = 0;
i_assert(NULL == retp);
dsize++; /* room for '\0' byte */
- *dst = t_malloc(dsize);
+ dst = t_malloc(dsize);
err = U_ZERO_ERROR;
- retp = u_strToUTF8WithSub(*dst, dsize, &dsize_actual, src, usrc_len,
+ retp = u_strToUTF8WithSub(dst, dsize, &dsize_actual, src, usrc_len,
UNICODE_REPLACEMENT_CHAR, &sub_num, &err);
if (U_FAILURE(err))
i_panic("Lib ICU u_strToUTF8WithSub() failed: %s",
" Substitutions (%d) were made.", sub_num);
return -1;
}
- i_assert(retp == *dst);
+ i_assert(retp == dst);
+ *_dst = dst;
return 0;
}
return 0;
}
-/* Returns 0 on success and -1 on error. */
-/* TODO: delay errors until _deinit() and return some other values? */
-static const char *
-fts_filter_normalizer_icu_filter(struct fts_filter *filter, const char *token)
+static int
+fts_filter_normalizer_icu_filter(struct fts_filter *filter, const char **token)
{
UErrorCode err = U_ZERO_ERROR;
UChar *utext = NULL;
int32_t utext_cap = 0;
int32_t utext_len = -1;
int32_t utext_limit;
- char *normalized = NULL;
struct fts_filter_normalizer *np =
(struct fts_filter_normalizer *)filter;
/* TODO: fix error handling */
if (np->error != NULL)
- return NULL;
+ goto err_exit;
- if (make_uchar(token, &utext, &utext_cap) < 0) {
+ if (make_uchar(*token, &utext, &utext_cap) < 0) {
fts_filter_normalizer_icu_error(&np->error, "Conversion to UChar failed");
- return NULL;
+ goto err_exit;
}
/*
TODO: Some problems here. How much longer can the result
size utrans_transUChars indicated */
utext_len++; /* room for '\0' bytes(2) */
utext_cap = utext_len;
- if (make_uchar(token, &utext, &utext_cap) < 0)
- return NULL;
+ if (make_uchar(*token, &utext, &utext_cap) < 0) {
+ goto err_exit;
+ }
i_assert(utext_cap == utext_len);
utext_limit = u_strlen(utext);
utext_len = -1;
if (U_FAILURE(err)) {
icu_error(&np->error, err, "utrans_transUChars()");
- return NULL;
+ goto err_exit;
}
- if (make_utf8(utext, &normalized, &np->error) < 0)
- return NULL;
+ if (make_utf8(utext, token, &np->error) < 0) {
+ goto err_exit;
+ }
- return normalized;
+ return 1;
+ err_exit:
+ *token = NULL;
+ return -1;
}
#else
return -1;
}
-static const char *
+static int
fts_filter_normalizer_icu_filter(struct fts_filter *filter ATTR_UNUSED,
const char *token ATTR_UNUSED)
{
"drive", NULL, NULL, NULL, "reason",
NULL, NULL, NULL, "sing"};
const char **ip, **op;
- const char *filtered;
+ const char *token;
test_begin("fts filter stopwords, English");
filter_class = fts_filter_find(STOPWORDS_FILTER_NAME);
ip = input;
op = output;
while (*ip != NULL) {
- filtered = fts_filter_filter(filter, *ip);
- if (filtered == NULL)
+ token = *ip;
+ ret = fts_filter_filter(filter, &token);
+ test_assert(ret >= 0);
+ if (ret == 0)
test_assert(*op == NULL);
else {
test_assert(*op != NULL);
- test_assert(strcmp(*ip, filtered) == 0);
+ test_assert(strcmp(*ip, token) == 0);
}
op++;
ip++;
{"kuka", "kenet", "keneen", "testi", "eiv\xC3\xA4t", NULL};
const char *output2[] = {NULL, NULL, NULL, "testi", NULL};
const char **ip, **op;
- const char *filtered;
+ const char *token;
test_begin("fts filter stopwords, Finnish");
filter_class = fts_filter_find(STOPWORDS_FILTER_NAME);
ip = input;
op = output;
while (*ip != NULL) {
- filtered = fts_filter_filter(filter, *ip);
- if (filtered == NULL)
+ token = *ip;
+ ret = fts_filter_filter(filter, &token);
+ test_assert(ret >= 0);
+ if (ret == 0)
test_assert(*op == NULL);
else {
test_assert(*op != NULL);
- test_assert(strcmp(*ip, filtered) == 0);
+ test_assert(strcmp(*ip, token) == 0);
}
op++;
ip++;
ip = input2;
op = output2;
while (*ip != NULL) {
- filtered = fts_filter_filter(filter, *ip);
- if (filtered == NULL)
+ token = *ip;
+ ret = fts_filter_filter(filter, &token);
+ if (ret == 0)
test_assert(*op == NULL);
else {
test_assert(*op != NULL);
- test_assert(strcmp(*ip, filtered) == 0);
+ test_assert(strcmp(*ip, token) == 0);
}
op++;
ip++;
"quelconque", NULL,
"l\xE2\x80\x99""av\xC3\xA8nement",};
const char **ip, **op;
- const char *filtered;
+ const char *token;
test_begin("fts filter stopwords, French");
filter_class = fts_filter_find(STOPWORDS_FILTER_NAME);
ip = input;
op = output;
while (*ip != NULL) {
- filtered = fts_filter_filter(filter, *ip);
- if (filtered == NULL)
+ token = *ip;
+ ret = fts_filter_filter(filter, &token);
+ test_assert(ret >= 0);
+ if (ret == 0)
test_assert(*op == NULL);
else {
test_assert(*op != NULL);
- test_assert(strcmp(*ip, filtered) == 0);
+ test_assert(strcmp(*ip, token) == 0);
}
op++;
ip++;
struct fts_filter *stemmer;
const char *error;
struct fts_language language = { .name = "EN" };
- const char *base = NULL;
+ const char *token = NULL;
const char * const tokens[] = {
"dries" ,"friendlies", "All", "human", "beings", "are",
"born", "free", "and", "equal", "in", "dignity", "and",
test_assert(ret == 0);
bpp = bases;
for (tpp=tokens; *tpp != NULL; tpp++) {
- base = fts_filter_filter(stemmer, *tpp);
- test_assert(base != NULL);
- test_assert(null_strcmp(base, *bpp) == 0);
+ token = *tpp;
+ ret = fts_filter_filter(stemmer, &token);
+ test_assert(token != NULL);
+ test_assert(null_strcmp(token, *bpp) == 0);
bpp++;
}
fts_filter_unref(&stemmer);
struct fts_filter *stemmer;
const char *error;
struct fts_language language = { .name = "fRench" };
- const char *base = NULL;
+ const char *token = NULL;
const char * const tokens[] = {
"Tous", "les", "\xC3\xAAtres", "humains", "naissent",
"libres", "et", "\xC3\xA9gaux", "en", "dignit\xC3\xA9",
test_assert(ret == 0);
bpp = bases;
for (tpp=tokens; *tpp != NULL; tpp++) {
- base = fts_filter_filter(stemmer, *tpp);
- test_assert(base != NULL);
- test_assert(null_strcmp(base, *bpp) == 0);
+ token = *tpp;
+ ret = fts_filter_filter(stemmer, &token);
+ test_assert(token != NULL);
+ test_assert(null_strcmp(token, *bpp) == 0);
bpp++;
}
fts_filter_unref(&stemmer);
struct fts_filter *filter;
const char *error;
struct fts_language language = { .name = "eN" };
- const char *base = NULL;
+ const char *token = NULL;
const char * const tokens[] = {
"dries" ,"friendlies", "All", "human", "beings", "are",
"born", "free", "and", "equal", "in", "dignity", "and",
bpp = bases;
for (tpp=tokens; *tpp != NULL; tpp++) {
- base = fts_filter_filter(stemmer, *tpp);
- if (base == NULL)
+ token = *tpp;
+ ret = fts_filter_filter(stemmer, &token);
+ if (ret == 0)
test_assert(*bpp == NULL);
else {
test_assert(*bpp != NULL);
- test_assert(null_strcmp(*bpp, base) == 0);
+ test_assert(null_strcmp(*bpp, token) == 0);
}
bpp++;
}
const char * const settings[] =
{"id", "Any-Lower; NFKD; [: Nonspacing Mark :] Remove; NFC", NULL};
const char *error = NULL;
- const char *normalized = NULL;
+ const char *token = NULL;
unsigned int i;
test_begin("fts filter normalizer Swedish short text");
test_assert(ret == 0);
for (i = 0; i < N_ELEMENTS(input); i++) {
if (input[i] != NULL) {
- test_assert_idx((normalized = fts_filter_filter(norm, input[i])) != NULL, i);
- test_assert_idx(null_strcmp(normalized, expected_output[i]) == 0, i);
+ token = input[i];
+ test_assert_idx(fts_filter_filter(norm, &token) == 1, i);
+ test_assert_idx(null_strcmp(token, expected_output[i]) == 0, i);
}
}
fts_filter_unref(&norm);
"vem kan segla forutan vind?\naaooaa"
};
const char *error = NULL;
- const char *normalized = NULL;
+ const char *token = NULL;
unsigned int i;
test_begin("fts filter normalizer Swedish short text using default ID");
test_assert(ret == 0);
for (i = 0; i < N_ELEMENTS(input); i++) {
if (input[i] != NULL) {
- test_assert_idx((normalized = fts_filter_filter(norm, input[i])) != NULL, i);
- test_assert_idx(null_strcmp(normalized, expected_output[i]) == 0, i);
+ token = input[i];
+ test_assert_idx(fts_filter_filter(norm, &token) == 1, i);
+ test_assert_idx(null_strcmp(token, expected_output[i]) == 0, i);
}
}
fts_filter_unref(&norm);
{"id", "Any-Lower; NFKD; [: Nonspacing Mark :] Remove", NULL};
char buf[4096] = {0};
const char *error = NULL;
- const char *normalized = NULL;
+ const char *tokens;
int ret;
unsigned char sha512_digest[SHA512_RESULTLEN];
struct sha512_ctx ctx;
test_assert(input != NULL);
sha512_init(&ctx);
while (NULL != fgets(buf, sizeof(buf), input)) {
-
- if ((normalized = fts_filter_filter(norm, buf)) == NULL){
+ tokens = buf;
+ if (fts_filter_filter(norm, &tokens) != 1){
break;
}
- sha512_loop(&ctx, normalized, strlen(normalized));
+ sha512_loop(&ctx, tokens, strlen(tokens));
}
fclose(input);
sha512_result(&ctx, sha512_digest);
//{"id", "Any-Lower; NFKD; [: Nonspacing Mark :] Remove; NFC", NULL};
{"id", "Lower", NULL};
struct fts_language language = { .name = "En" };
- const char *base = NULL;
+ const char *token = NULL;
const char * const tokens[] = {
"dries" ,"friendlies", "All", "human", "beings", "are",
"born", "free", "and", "equal", "in", "dignity", "and",
bpp = bases;
for (tpp = tokens; *tpp != NULL; tpp++) {
- base = fts_filter_filter(stemmer, *tpp);
- if (base == NULL)
+ token = *tpp;
+ ret = fts_filter_filter(stemmer, &token);
+ if (ret == 0)
test_assert(*bpp == NULL);
else {
test_assert(*bpp != NULL);
- test_assert(strcasecmp(*bpp, base) == 0);
+ test_assert(strcasecmp(*bpp, token) == 0);
}
bpp++;
}