X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fccltoken.c;h=86bf18f19aee7fde8a8e6526c219ef33df344e2d;hp=79d6efc8d5f4840525ad210f1bff227de48943d3;hb=5242cb5a8634bfa38b9333ff7f903e718ac6e292;hpb=88d3bedf772316f87e1996f655ccf8d1e2589755 diff --git a/src/ccltoken.c b/src/ccltoken.c index 79d6efc..86bf18f 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-2012 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" /* @@ -101,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++; @@ -121,29 +123,39 @@ struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command) else last->kind = CCL_TOK_REL; break; - case '\"': + default: + --cp; + --last->len; + last->kind = CCL_TOK_TERM; last->name = (const char *) cp; - last->len = 0; - while (*cp && *cp != '\"') + while (*cp && !strchr("(),%!><= \t\n\r", *cp)) { - cp++; - ++ last->len; - } - if (*cp == '\"') - cp++; - break; - default: - if (!strchr("(),%!><= \t\n\r", cp[-1])) - { - while (*cp && !strchr("(),%!><= \t\n\r", *cp)) + if (*cp == '\\' && cp[1]) { cp++; ++ last->len; } + else if (*cp == '"') + { + while (*cp) + { + cp++; + ++ last->len; + if (*cp == '\\' && cp[1]) + { + cp++; + ++ last->len; + } + else if (*cp == '"') + break; + } + } + if (!*cp) + break; + cp++; + ++ last->len; } - last->kind = CCL_TOK_TERM; - aliases = ccl_qual_search_special(cclp->bibset, "and"); if (!aliases) aliases = cclp->ccl_token_and; @@ -190,7 +202,7 @@ struct ccl_token *ccl_token_add(struct ccl_token *at) n->ws_prefix_len = 0; return n; } - + /* * ccl_token_del: delete CCL tokens */ @@ -198,7 +210,7 @@ void ccl_token_del(struct ccl_token *list) { struct ccl_token *list1; - while (list) + while (list) { list1 = list->next; xfree(list);