X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fccltoken.c;h=5211fe888267bbaa317186932d7db4b40dac2dbb;hp=6c742265c11fb688b7f3621eecc79ffdbeef86f9;hb=835fe1fa5d34428ba2803cd4a2b1a9b9aec48ab0;hpb=e1f778342e0563a5cf8e5ca34d5be264afa1340e diff --git a/src/ccltoken.c b/src/ccltoken.c index 6c74226..5211fe8 100644 --- a/src/ccltoken.c +++ b/src/ccltoken.c @@ -126,53 +126,60 @@ struct ccl_token *ccl_parser_tokenize(CCL_parser cclp, const char *command) default: --cp; --last->len; - 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++; - } - 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; + while (*cp) + { + cp++; + ++ last->len; + if (*cp == '\\' && cp[1]) + { + cp++; + ++ last->len; + } + else if (*cp == '"') + break; + } + } + 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;