X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ccl%2Fcclfind.c;h=a4d0ba1b06386c57163a2cf16617b6763b6cc86e;hb=7650dadee1e1a910677c8d305aa70dbbf38e79e6;hp=b20b3cdb8b69c25d25e31ae0b46b1792faa3a106;hpb=044d170f0a963555486df54653cd2fdc5815928b;p=yaz-moved-to-github.git diff --git a/ccl/cclfind.c b/ccl/cclfind.c index b20b3cd..a4d0ba1 100644 --- a/ccl/cclfind.c +++ b/ccl/cclfind.c @@ -45,7 +45,24 @@ * Europagate, 1995 * * $Log: cclfind.c,v $ - * Revision 1.10 1998-02-11 11:53:33 adam + * Revision 1.15 2000-02-24 23:49:13 adam + * Fixed memory allocation problem. + * + * Revision 1.14 2000/01/31 13:15:21 adam + * Removed uses of assert(3). Cleanup of ODR. CCL parser update so + * that some characters are not surrounded by spaces in resulting term. + * ILL-code updates. + * + * 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 @@ -118,10 +135,9 @@ #include #include -#include #include -#include +#include /* returns type of current lookahead */ #define KIND (cclp->look_token->kind) @@ -176,7 +192,7 @@ static void strxcat (char *n, const char *src, int len) static char *copy_token_name (struct ccl_token *tp) { char *str = (char *)malloc (tp->len + 1); - assert (str); + ccl_assert (str); memcpy (str, tp->name, tp->len); str[tp->len] = '\0'; return str; @@ -191,7 +207,7 @@ static struct ccl_rpn_node *mk_node (int kind) { struct ccl_rpn_node *p; p = (struct ccl_rpn_node *)malloc (sizeof(*p)); - assert (p); + ccl_assert (p); p->kind = kind; return p; } @@ -234,6 +250,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); @@ -248,7 +273,7 @@ static void add_attr (struct ccl_rpn_node *p, int type, int value) struct ccl_rpn_attr *n; n = (struct ccl_rpn_attr *)malloc (sizeof(*n)); - assert (n); + ccl_assert (n); n->type = type; n->value = value; n->next = p->u.t.attr_list; @@ -261,9 +286,11 @@ 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_attr *qa_tmp[2]; struct ccl_rpn_node *p; struct ccl_token *lookahead = cclp->look_token; int len = 0; @@ -277,7 +304,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; @@ -291,8 +318,8 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, { /* no qualifier(s) applied. Use 'term' if it is defined */ - qa = (struct ccl_rpn_attr **)malloc (2*sizeof(*qa)); - assert (qa); + qa = qa_tmp; + ccl_assert (qa); qa[0] = ccl_qual_search (cclp, "term", 4); qa[1] = NULL; } @@ -339,14 +366,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 @@ -370,7 +397,7 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, /* make the RPN token */ p->u.t.term = (char *)malloc (len); - assert (p->u.t.term); + ccl_assert (p->u.t.term); p->u.t.term[0] = '\0'; for (i = 0; iu.t.term, " "); + if (src_len) + { + int len = strlen(p->u.t.term); + if (len && + !strchr("-+", *src_str) && + !strchr("-+", p->u.t.term[len-1])) + { + strcat (p->u.t.term, " "); + } + } strxcat (p->u.t.term, src_str, src_len); ADVANCE; } @@ -394,7 +429,6 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH)) { cclp->error_code = CCL_ERR_TRUNC_NOT_BOTH; - free (qa); ccl_rpn_delete (p); return NULL; } @@ -405,7 +439,6 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT)) { cclp->error_code = CCL_ERR_TRUNC_NOT_RIGHT; - free (qa); ccl_rpn_delete (p); return NULL; } @@ -416,7 +449,6 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT)) { cclp->error_code = CCL_ERR_TRUNC_NOT_LEFT; - free (qa); ccl_rpn_delete (p); return NULL; } @@ -430,6 +462,13 @@ static struct ccl_rpn_node *search_term (CCL_parser cclp, return p; } +static struct ccl_rpn_node *search_term (CCL_parser cclp, + struct ccl_rpn_attr **qa) +{ + static int list[] = {CCL_TOK_TERM, CCL_TOK_COMMA, -1}; + return search_term_x(cclp, qa, list); +} + /* * qualifiers: Parse CCL qualifiers and search terms. * cclp: CCL Parser @@ -458,7 +497,7 @@ static struct ccl_rpn_node *qualifiers (CCL_parser cclp, struct ccl_token *la, for (i=0; qa[i]; i++) no++; ap = (struct ccl_rpn_attr **)malloc ((no+1) * sizeof(*ap)); - assert (ap); + ccl_assert (ap); for (i = 0; cclp->look_token != la; i++) { ap[i] = ccl_qual_search (cclp, cclp->look_token->name, @@ -510,6 +549,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) { @@ -628,8 +668,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) @@ -637,7 +680,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); @@ -648,9 +691,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); @@ -856,5 +899,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; }