X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fccltoken.c;h=a572ce2a86c481d2f2a76e3c16f112d297e62076;hp=edf5d3483eac940f6117c3a93d68c51e93bdde54;hb=6b3366d135740d9ab37bdcd3f00b115fedf30a9d;hpb=fe507b6b15788a3a8e58063d9dae52532a5229a5 diff --git a/src/ccltoken.c b/src/ccltoken.c index edf5d34..a572ce2 100644 --- a/src/ccltoken.c +++ b/src/ccltoken.c @@ -1,96 +1,18 @@ -/* - * Copyright (c) 1995, the EUROPAGATE consortium (see below). - * - * The EUROPAGATE consortium members are: - * - * University College Dublin - * Danmarks Teknologiske Videnscenter - * An Chomhairle Leabharlanna - * Consejo Superior de Investigaciones Cientificas - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation, in whole or in part, for any purpose, is hereby granted, - * provided that: - * - * 1. This copyright and permission notice appear in all copies of the - * software and its documentation. Notices of copyright or attribution - * which appear at the beginning of any file must remain unchanged. - * - * 2. The names of EUROPAGATE or the project partners may not be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * 3. Users of this software (implementors and gateway operators) agree to - * inform the EUROPAGATE consortium of their use of the software. This - * information will be used to evaluate the EUROPAGATE project and the - * software, and to plan further developments. The consortium may use - * the information in later publications. - * - * 4. Users of this software agree to make their best efforts, when - * documenting their use of the software, to acknowledge the EUROPAGATE - * consortium, and the role played by the software in their work. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE - * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF - * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA - * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND - * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE - * USE OR PERFORMANCE OF THIS SOFTWARE. - * +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data + * See the file LICENSE for details. */ -/** +/** * \file ccltoken.c * \brief Implements CCL lexical analyzer (scanner) */ -/* CCL - lexical analysis - * Europagate, 1995 - * - * $Id: ccltoken.c,v 1.14 2007-05-06 20:12:20 adam Exp $ - * - * Old Europagate Log: - * - * Revision 1.10 1995/07/11 12:28:31 adam - * New function: ccl_token_simple (split into simple tokens) and - * ccl_token_del (delete tokens). - * - * Revision 1.9 1995/05/16 09:39:28 adam - * LICENSE. - * - * Revision 1.8 1995/05/11 14:03:57 adam - * Changes in the reading of qualifier(s). New function: ccl_qual_fitem. - * New variable ccl_case_sensitive, which controls whether reserved - * words and field names are case sensitive or not. - * - * Revision 1.7 1995/04/19 12:11:24 adam - * Minor change. - * - * Revision 1.6 1995/04/17 09:31:48 adam - * Improved handling of qualifiers. Aliases or reserved words. - * - * Revision 1.5 1995/02/23 08:32:00 adam - * Changed header. - * - * Revision 1.3 1995/02/15 17:42:16 adam - * Minor changes of the api of this module. FILE* argument added - * to ccl_pr_tree. - * - * Revision 1.2 1995/02/14 19:55:13 adam - * Header files ccl.h/cclp.h are gone! They have been merged an - * moved to ../include/ccl.h. - * Node kind(s) in ccl_rpn_node have changed names. - * - * Revision 1.1 1995/02/13 12:35:21 adam - * First version of CCL. Qualifiers aren't handled yet. - * - */ +#if HAVE_CONFIG_H +#include +#endif #include #include -#include - +#include #include "cclp.h" /* @@ -181,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++; @@ -201,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; @@ -270,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 */ @@ -278,7 +210,7 @@ void ccl_token_del(struct ccl_token *list) { struct ccl_token *list1; - while (list) + while (list) { list1 = list->next; xfree(list); @@ -357,6 +289,7 @@ int ccl_parser_get_error(CCL_parser cclp, int *pos) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab