X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fccltoken.c;h=6d201f4cc6242e029ce27e4d391ba883c5b5790b;hp=b784295b1c5989f07b4b3ac286b738e279d0f2a9;hb=d2ed898832ae354c17254ff52c70c92278518efe;hpb=3c1365fc355b4ee90cb841e66cdb9c933f871ed9 diff --git a/src/ccltoken.c b/src/ccltoken.c index b784295..6d201f4 100644 --- a/src/ccltoken.c +++ b/src/ccltoken.c @@ -1,16 +1,18 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2010 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ -/** +/** * \file ccltoken.c * \brief Implements CCL lexical analyzer (scanner) */ +#if HAVE_CONFIG_H +#include +#endif #include #include -#include - +#include #include "cclp.h" /* @@ -79,7 +81,6 @@ struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command) last->next->prev = last; last = last->next; } - last->left_trunc = last->right_trunc = 0; last->ws_prefix_buf = (const char *) cp0; last->ws_prefix_len = cp - cp0; last->next = NULL; @@ -102,7 +103,7 @@ struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command) case '%': case '!': last->kind = CCL_TOK_PROX; - while (isdigit(*cp)) + while (yaz_isdigit(*cp)) { ++ last->len; cp++; @@ -125,63 +126,60 @@ struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command) default: --cp; --last->len; - if (*cp == '?') - { - last->left_trunc = 1; - cp++; - } - if (*cp == '"') + + last->kind = CCL_TOK_TERM; + last->name = (const char *) cp; + while (*cp && !strchr("(),%!><= \t\n\r", *cp)) { - cp++; - last->kind = CCL_TOK_TERM; - last->name = (const char *) cp; - while (*cp && *cp != '"') + if (*cp == '\\' && cp[1]) { cp++; ++ last->len; } - if (*cp) - cp++; - } - else - { - last->kind = CCL_TOK_TERM; - last->name = (const char *) cp; - while (*cp && !strchr("(),%!><=? \t\n\r", *cp)) + else if (*cp == '"') { - ++ last->len; - cp++; + while (*cp) + { + cp++; + ++ last->len; + if (*cp == '\\' && cp[1]) + { + cp++; + ++ last->len; + } + else if (*cp == '"') + break; + } } - aliases = ccl_qual_search_special(cclp->bibset, "and"); - if (!aliases) - aliases = cclp->ccl_token_and; - if (token_cmp(cclp, aliases, last)) - last->kind = CCL_TOK_AND; - - aliases = ccl_qual_search_special(cclp->bibset, "or"); - if (!aliases) - aliases = cclp->ccl_token_or; - if (token_cmp(cclp, aliases, last)) - last->kind = CCL_TOK_OR; - - aliases = ccl_qual_search_special(cclp->bibset, "not"); - if (!aliases) - aliases = cclp->ccl_token_not; - if (token_cmp(cclp, aliases, last)) - last->kind = CCL_TOK_NOT; - - aliases = ccl_qual_search_special(cclp->bibset, "set"); - if (!aliases) - aliases = cclp->ccl_token_set; - - if (token_cmp(cclp, aliases, last)) - last->kind = CCL_TOK_SET; - } - if (*cp == '?') - { - last->right_trunc = 1; + if (!*cp) + break; cp++; + ++ last->len; } + aliases = ccl_qual_search_special(cclp->bibset, "and"); + if (!aliases) + aliases = cclp->ccl_token_and; + if (token_cmp(cclp, aliases, last)) + last->kind = CCL_TOK_AND; + + aliases = ccl_qual_search_special(cclp->bibset, "or"); + if (!aliases) + aliases = cclp->ccl_token_or; + if (token_cmp(cclp, aliases, last)) + last->kind = CCL_TOK_OR; + + aliases = ccl_qual_search_special(cclp->bibset, "not"); + if (!aliases) + aliases = cclp->ccl_token_not; + if (token_cmp(cclp, aliases, last)) + last->kind = CCL_TOK_NOT; + + aliases = ccl_qual_search_special(cclp->bibset, "set"); + if (!aliases) + aliases = cclp->ccl_token_set; + + if (token_cmp(cclp, aliases, last)) + last->kind = CCL_TOK_SET; } } return first; @@ -198,14 +196,13 @@ struct ccl_token *ccl_token_add(struct ccl_token *at) n->next->prev = n; n->kind = CCL_TOK_TERM; - n->left_trunc = n->right_trunc = 0; n->name = 0; n->len = 0; n->ws_prefix_buf = 0; n->ws_prefix_len = 0; return n; } - + /* * ccl_token_del: delete CCL tokens */ @@ -213,7 +210,7 @@ void ccl_token_del(struct ccl_token *list) { struct ccl_token *list1; - while (list) + while (list) { list1 = list->next; xfree(list);