i_free(tok);
}
-static void
+static bool
fts_tokenizer_address_current_token(struct email_address_fts_tokenizer *tok,
const char **token_r)
{
fts_tokenizer_delete_trailing_invalid_char(data, &len);
*token_r = len == 0 ? "" :
t_strndup(data, len);
+ return len > 0;
}
static bool
if (tok->state == EMAIL_ADDRESS_PARSER_STATE_COMPLETE) {
*skip_r = pos;
- fts_tokenizer_address_current_token(tok, token_r);
- return 1;
+ if (fts_tokenizer_address_current_token(tok, token_r))
+ return 1;
}
/* end of data, output lingering tokens. first the parents data, then
return 1;
if (tok->state == EMAIL_ADDRESS_PARSER_STATE_DOMAIN) {
- fts_tokenizer_address_current_token(tok, token_r);
- return 1;
+ if (fts_tokenizer_address_current_token(tok, token_r))
+ return 1;
}
tok->state = EMAIL_ADDRESS_PARSER_STATE_NONE;
}
break;
case EMAIL_ADDRESS_PARSER_STATE_COMPLETE:
*skip_r = pos;
- if (!fts_tokenizer_address_parent_data(tok, token_r))
- fts_tokenizer_address_current_token(tok, token_r);
- return 1;
+ if (fts_tokenizer_address_parent_data(tok, token_r))
+ return 1;
+ if (fts_tokenizer_address_current_token(tok, token_r))
+ return 1;
+ break;
default:
i_unreached();
}
test_end();
}
+static void test_fts_tokenizer_address_maxlen(void)
+{
+ const char *const settings[] = {"maxlen", "5", NULL};
+ const char *input = "...\357\277\275@a";
+ struct fts_tokenizer *tok;
+ const char *token, *error;
+
+ test_begin("fts tokenizer address maxlen");
+ test_assert(fts_tokenizer_create(fts_tokenizer_email_address, NULL, settings, &tok, &error) == 0);
+
+ while (fts_tokenizer_next(tok, (const unsigned char *)input,
+ strlen(input), &token, &error) > 0) ;
+ while (fts_tokenizer_final(tok, &token, &error) > 0) ;
+ fts_tokenizer_unref(&tok);
+ test_end();
+}
+
int main(void)
{
static void (*test_functions[])(void) = {
test_fts_tokenizer_address_only,
test_fts_tokenizer_address_parent_simple,
test_fts_tokenizer_address_parent_tr29,
+ test_fts_tokenizer_address_maxlen,
test_fts_tokenizer_address_search,
test_fts_tokenizer_delete_trailing_partial_char,
NULL