X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=ccl%2Fcclfind.c;h=99cc3b5ee8e0434a8407f7a78dfa218f9c5f0305;hp=3776fe171e1f35c2386af5d52add53b10e78acf9;hb=88ce7f5c3713fbf4992763ae38c9fb79a5ccb551;hpb=88e45d920d4fedb9557e896cf9448f9ab9cfb422 diff --git a/ccl/cclfind.c b/ccl/cclfind.c index 3776fe1..99cc3b5 100644 --- a/ccl/cclfind.c +++ b/ccl/cclfind.c @@ -45,7 +45,19 @@ * Europagate, 1995 * * $Log: cclfind.c,v $ - * Revision 1.9 1997-09-29 08:56:37 adam + * Revision 1.13 1999-12-22 13:13:32 adam + * Search terms may include "operators" without causing error. + * + * Revision 1.12 1999/11/30 13:47:11 adam + * Improved installation. Moved header files to include/yaz. + * + * Revision 1.11 1999/03/31 11:15:37 adam + * Fixed memory leaks in ccl_find_str and ccl_qual_rm. + * + * Revision 1.10 1998/02/11 11:53:33 adam + * Changed code so that it compiles as C++. + * + * Revision 1.9 1997/09/29 08:56:37 adam * Changed CCL parser to be thread safe. New type, CCL_parser, declared * and a create/destructers ccl_parser_create/ccl_parser/destory has * been added. @@ -118,7 +130,7 @@ #include #include -#include +#include /* returns type of current lookahead */ #define KIND (cclp->look_token->kind) @@ -172,7 +184,7 @@ static void strxcat (char *n, const char *src, int len) */ static char *copy_token_name (struct ccl_token *tp) { - char *str = malloc (tp->len + 1); + char *str = (char *)malloc (tp->len + 1); assert (str); memcpy (str, tp->name, tp->len); str[tp->len] = '\0'; @@ -187,7 +199,7 @@ static char *copy_token_name (struct ccl_token *tp) static struct ccl_rpn_node *mk_node (int kind) { struct ccl_rpn_node *p; - p = malloc (sizeof(*p)); + p = (struct ccl_rpn_node *)malloc (sizeof(*p)); assert (p); p->kind = kind; return p; @@ -231,6 +243,15 @@ void ccl_rpn_delete (struct ccl_rpn_node *rpn) static struct ccl_rpn_node *find_spec (CCL_parser cclp, struct ccl_rpn_attr **qa); + +static int is_term_ok (int look, int *list) +{ + for (;*list >= 0; list++) + if (look == *list) + return 1; + return 0; +} + static struct ccl_rpn_node *search_terms (CCL_parser cclp, struct ccl_rpn_attr **qa); @@ -244,7 +265,7 @@ static void add_attr (struct ccl_rpn_node *p, int type, int value) { struct ccl_rpn_attr *n; - n = malloc (sizeof(*n)); + n = (struct ccl_rpn_attr *)malloc (sizeof(*n)); assert (n); n->type = type; n->value = value; @@ -258,8 +279,9 @@ static void add_attr (struct ccl_rpn_node *p, int type, int value) * qa: Qualifier attributes already applied. * return: pointer to node(s); NULL on error. */ -static struct ccl_rpn_node *search_term (CCL_parser cclp, - struct ccl_rpn_attr **qa) +static struct ccl_rpn_node *search_term_x (CCL_parser cclp, + struct ccl_rpn_attr **qa, + int *term_list) { struct ccl_rpn_node *p; struct ccl_token *lookahead = cclp->look_token; @@ -274,7 +296,7 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, int truncation_value = -1; int completeness_value = -1; - if (KIND != CCL_TOK_TERM) + if (!is_term_ok(KIND, term_list)) { cclp->error_code = CCL_ERR_TERM_EXPECTED; return NULL; @@ -288,7 +310,7 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, { /* no qualifier(s) applied. Use 'term' if it is defined */ - qa = malloc (2*sizeof(*qa)); + qa = (struct ccl_rpn_attr **)malloc (2*sizeof(*qa)); assert (qa); qa[0] = ccl_qual_search (cclp, "term", 4); qa[1] = NULL; @@ -336,14 +358,14 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, /* go through each TERM token. If no truncation attribute is yet met, then look for left/right truncation markers (?) and set left_trunc/right_trunc/mid_trunc accordingly */ - for (no = 0; lookahead->kind == CCL_TOK_TERM; no++) + for (no = 0; is_term_ok(lookahead->kind, term_list); no++) { for (i = 0; ilen; i++) if (truncation_value == -1 && lookahead->name[i] == '?') { if (no == 0 && i == 0 && lookahead->len >= 1) left_trunc = 1; - else if (lookahead->next->kind != CCL_TOK_TERM && + else if (!is_term_ok(lookahead->next->kind, term_list) && i == lookahead->len-1 && i >= 1) right_trunc = 1; else @@ -366,7 +388,7 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, } /* make the RPN token */ - p->u.t.term = malloc (len); + p->u.t.term = (char *)malloc (len); assert (p->u.t.term); p->u.t.term[0] = '\0'; for (i = 0; ilook_token != la; i++) { @@ -507,6 +536,7 @@ static struct ccl_rpn_node *qualifiers (CCL_parser cclp, struct ccl_token *la, free (ap); return p; } + /* ordered relation ... */ rel = 0; if (cclp->look_token->len == 1) { @@ -625,8 +655,11 @@ static struct ccl_rpn_node *qualifiers (CCL_parser cclp, struct ccl_token *la, static struct ccl_rpn_node *search_terms (CCL_parser cclp, struct ccl_rpn_attr **qa) { + static int list[] = { + CCL_TOK_TERM, CCL_TOK_COMMA,CCL_TOK_EQ, + CCL_TOK_REL, CCL_TOK_MINUS, -1}; struct ccl_rpn_node *p1, *p2, *pn; - p1 = search_term (cclp, qa); + p1 = search_term_x (cclp, qa, list); if (!p1) return NULL; while (1) @@ -634,7 +667,7 @@ static struct ccl_rpn_node *search_terms (CCL_parser cclp, if (KIND == CCL_TOK_PROX) { ADVANCE; - p2 = search_term (cclp, qa); + p2 = search_term_x (cclp, qa, list); if (!p2) { ccl_rpn_delete (p1); @@ -645,9 +678,9 @@ static struct ccl_rpn_node *search_terms (CCL_parser cclp, pn->u.p[1] = p2; p1 = pn; } - else if (KIND == CCL_TOK_TERM) + else if (is_term_ok(KIND, list)) { - p2 = search_term (cclp, qa); + p2 = search_term_x (cclp, qa, list); if (!p2) { ccl_rpn_delete (p1); @@ -853,5 +886,6 @@ struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str, if (*error) *pos = cclp->error_pos - str; ccl_parser_destroy (cclp); + ccl_token_del (list); return p; }