fts-tokenizer.c revision c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen/* Copyright (c) 2014-2015 Dovecot authors, see the included COPYING file */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo SirainenARRAY(struct fts_tokenizer) fts_tokenizer_classes;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid fts_tokenizer_register(const struct fts_tokenizer *tok_class)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (!array_is_created(&fts_tokenizer_classes))
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen i_array_init(&fts_tokenizer_classes, FTS_TOKENIZER_CLASSES_NR);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen array_append(&fts_tokenizer_classes, tok_class, 1);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid fts_tokenizer_unregister(const struct fts_tokenizer *tok_class)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen unsigned int idx;
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen idx = array_foreach_idx(&fts_tokenizer_classes, tp);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenconst struct fts_tokenizer *fts_tokenizer_find(const char *name)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenint fts_tokenizer_create(const struct fts_tokenizer *tok_class,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen const char *const *settings,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen const char **error_r)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen i_assert(settings == NULL || str_array_length(settings) % 2 == 0);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (tok_class->v->create(settings, &tok, error_r) < 0) {
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen tok->parent_input = buffer_create_dynamic(default_pool, 128);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid fts_tokenizer_ref(struct fts_tokenizer *tok)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenvoid fts_tokenizer_unref(struct fts_tokenizer **_tok)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenstatic const char *
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainenfts_tokenizer_next_self(struct fts_tokenizer *tok,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen (data == tok->prev_data && size == tok->prev_size));
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* whole new data */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* continuing previous data */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen token = tok->v->next(tok, data + tok->prev_skip,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* we need a new data block */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen token = fts_tokenizer_next_self(tok, data, size);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen if (token == NULL || tok->parent == NULL || tok->skip_parents)
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen buffer_append(tok->parent_input, token, strlen(token));
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* fall through */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen token = fts_tokenizer_next(tok->parent, tok->parent_input->data,
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* fall through */
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen token = fts_tokenizer_next(tok->parent, NULL, 0);
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen /* we're finished sending this token to parent tokenizer.
c865b0e9c65fd77f7b2ab6f8616d3def5501ecb3Timo Sirainen see if our own tokenizer has more tokens available */