X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=ccl%2Fcclfind.c;h=59a9065d3c79fda20a07a026a9222449f5d49cde;hb=3d18b35078096b9fd1feb8e2d6fd7e9e48755ad5;hp=4e0bdb49a48614ef455b14e71e475d215e7401e4;hpb=448e7f2a48f6485a8d452c75420524fb37453bc1;p=yaz-moved-to-github.git diff --git a/ccl/cclfind.c b/ccl/cclfind.c index 4e0bdb4..59a9065 100644 --- a/ccl/cclfind.c +++ b/ccl/cclfind.c @@ -45,7 +45,23 @@ * Europagate, 1995 * * $Log: cclfind.c,v $ - * Revision 1.19 2000-11-16 09:58:02 adam + * Revision 1.24 2001-03-22 21:23:30 adam + * Directive s=pw sets structure to phrase if term includes blank(s). + * + * Revision 1.23 2001/03/20 11:22:58 adam + * CCL Truncation character may be defined. + * + * Revision 1.22 2001/03/07 13:24:40 adam + * Member and_not in Z_Operator is kept for backwards compatibility. + * Added support for definition of CCL operators in field spec file. + * + * Revision 1.21 2001/02/21 13:46:53 adam + * C++ fixes. + * + * Revision 1.20 2000/11/16 13:03:12 adam + * Function ccl_rpn_query sets attributeSet to Bib-1. + * + * Revision 1.19 2000/11/16 09:58:02 adam * Implemented local AttributeSet setting for CCL field maps. * * Revision 1.18 2000/10/17 19:50:28 adam @@ -297,7 +313,7 @@ static void add_attr (struct ccl_rpn_node *p, const char *set, ccl_assert (n); if (set) { - n->set = malloc (strlen(set)+1); + n->set = (char*) malloc (strlen(set)+1); strcpy (n->set, set); } else @@ -324,6 +340,12 @@ static struct ccl_rpn_node *search_term_x (CCL_parser cclp, int and_list = 0; int or_list = 0; char *attset; + const char *truncation_aliases; + + truncation_aliases = + ccl_qual_search_special(cclp->bibset, "truncation"); + if (!truncation_aliases) + truncation_aliases = "?"; if (!qa) { @@ -342,6 +364,7 @@ static struct ccl_rpn_node *search_term_x (CCL_parser cclp, { struct ccl_rpn_node *p; size_t no, i; + int no_spaces = 0; int left_trunc = 0; int right_trunc = 0; int mid_trunc = 0; @@ -351,7 +374,7 @@ static struct ccl_rpn_node *search_term_x (CCL_parser cclp, int truncation_value = -1; int completeness_value = -1; int len = 0; - int max = 200; + size_t max = 200; if (and_list || or_list) max = 1; @@ -361,7 +384,9 @@ static struct ccl_rpn_node *search_term_x (CCL_parser cclp, for (no = 0; no < max && is_term_ok(lookahead->kind, term_list); no++) { for (i = 0; ilen; i++) - if (truncation_value == -1 && lookahead->name[i] == '?') + if (lookahead->name[i] == ' ') + no_spaces++; + else if (strchr(truncation_aliases, lookahead->name[i])) { if (no == 0 && i == 0 && lookahead->len >= 1) left_trunc = 1; @@ -449,7 +474,7 @@ static struct ccl_rpn_node *search_term_x (CCL_parser cclp, qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_WP, &attset)) { /* no structure attribute met. Apply either structure attribute WORD or PHRASE depending on number of CCL tokens */ - if (no == 1) + if (no == 1 && no_spaces == 0) add_attr (p, attset, CCL_BIB1_STR, 2); else add_attr (p, attset, CCL_BIB1_STR, 1); @@ -899,6 +924,8 @@ struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list) { struct ccl_rpn_node *p; + + cclp->look_token = list; p = find_spec (cclp, NULL); if (p && KIND != CCL_TOK_EOL)