X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=ccl%2Fcclfind.c;h=e6b38c5fee466cd86e1c89add01ce5771bdc10f4;hb=8467171ebdb5f018740de8d82149c8ccc53d2815;hp=76556a1d502695467bec27905e962b7c8668a72b;hpb=6b74708f98852f738fecb8a737a9640edf3d427e;p=egate.git diff --git a/ccl/cclfind.c b/ccl/cclfind.c index 76556a1..e6b38c5 100644 --- a/ccl/cclfind.c +++ b/ccl/cclfind.c @@ -2,7 +2,24 @@ * Europagate, 1995 * * $Log: cclfind.c,v $ - * Revision 1.5 1995/02/14 14:12:41 adam + * Revision 1.11 1995/02/23 08:31:59 adam + * Changed header. + * + * Revision 1.9 1995/02/16 13:20:06 adam + * Spell fix. + * + * Revision 1.8 1995/02/14 19:59:42 adam + * Removed a syntax error. + * + * Revision 1.7 1995/02/14 19:55:10 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.6 1995/02/14 16:20:55 adam + * Qualifiers are read from a file now. + * + * Revision 1.5 1995/02/14 14:12:41 adam * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990). * * Revision 1.4 1995/02/14 13:16:29 adam @@ -24,7 +41,7 @@ #include #include -#include "cclp.h" +#include static struct ccl_token *look_token; static int ccl_error; @@ -45,6 +62,17 @@ static struct ccl_rpn_attr *qual_val (struct ccl_rpn_attr *list, int type) return NULL; } +static int qual_val_type (struct ccl_rpn_attr *list, int type, int value) +{ + while (list) + { + if (list->type == type && list->value == value) + return 1; + list = list->next; + } + return 0; +} + static void strxcat (char *n, const char *src, int len) { while (*n) @@ -79,13 +107,13 @@ void ccl_rpn_delete (struct ccl_rpn_node *rpn) return; switch (rpn->kind) { - case AND: - case OR: - case NOT: + case CCL_RPN_AND: + case CCL_RPN_OR: + case CCL_RPN_NOT: ccl_rpn_delete (rpn->u.p[0]); ccl_rpn_delete (rpn->u.p[1]); break; - case TERM: + case CCL_RPN_TERM: free (rpn->u.t.term); for (attr = rpn->u.t.attr_list; attr; attr = attr1) { @@ -93,10 +121,10 @@ void ccl_rpn_delete (struct ccl_rpn_node *rpn) free (attr); } break; - case SET: + case CCL_RPN_SET: free (rpn->u.setname); break; - case PROX: + case CCL_RPN_PROX: ccl_rpn_delete (rpn->u.p[0]); ccl_rpn_delete (rpn->u.p[1]); break; @@ -122,6 +150,7 @@ static void add_attr (struct ccl_rpn_node *p, int type, int value) static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) { struct ccl_rpn_node *p; + struct ccl_rpn_attr *attr; struct ccl_token *lookahead = look_token; int len = 0; int no, i; @@ -150,7 +179,7 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) len += 1+lookahead->len; lookahead = lookahead->next; } - p = mk_node (TERM); + p = mk_node (CCL_RPN_TERM); p->u.t.term = malloc (len); assert (p->u.t.term); p->u.t.attr_list = NULL; @@ -170,12 +199,11 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) if (i) strcat (p->u.t.term, " "); strxcat (p->u.t.term, src_str, src_len); - ADVANCE; + ADVANCE; } if (qa) { int i; - struct ccl_rpn_attr *attr; for (i=0; qa[i]; i++) { struct ccl_rpn_attr *attr; @@ -184,21 +212,58 @@ static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa) if (attr->value > 0) add_attr (p, attr->type, attr->value); } - if ((attr = qual_val (qa[0], CCL_BIB1_STR)) && - attr->value == CCL_BIB1_STR_WP) - { - if (no == 1) - add_attr (p, CCL_BIB1_STR, 2); - else - add_attr (p, CCL_BIB1_STR, 1); - } + attr = qa[0]; + } + else + attr = ccl_qual_search (bibset, "term", 4); + if (attr && qual_val_type (attr, CCL_BIB1_STR, CCL_BIB1_STR_WP)) + { + if (no == 1) + add_attr (p, CCL_BIB1_STR, 2); + else + add_attr (p, CCL_BIB1_STR, 1); } if (left_trunc && right_trunc) + { + if (attr && !qual_val_type (attr, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH)) + { + ccl_error = CCL_ERR_TRUNC_NOT_BOTH; + if (qa) + free (qa); + ccl_rpn_delete (p); + return NULL; + } add_attr (p, CCL_BIB1_TRU, 3); + } else if (right_trunc) + { + if (attr && !qual_val_type (attr, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT)) + { + ccl_error = CCL_ERR_TRUNC_NOT_RIGHT; + if (qa) + free (qa); + ccl_rpn_delete (p); + return NULL; + } add_attr (p, CCL_BIB1_TRU, 1); + } else if (left_trunc) + { + if (attr && !qual_val_type (attr, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT)) + { + ccl_error = CCL_ERR_TRUNC_NOT_LEFT; + if (qa) + free (qa); + ccl_rpn_delete (p); + return NULL; + } add_attr (p, CCL_BIB1_TRU, 2); + } + else + { + if (attr && qual_val_type (attr, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_NONE)) + add_attr (p, CCL_BIB1_TRU, 100); + } return p; } @@ -213,7 +278,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la, if (qa) { - ccl_error = CCL_ERR_DOBBLE_QUAL; + ccl_error = CCL_ERR_DOUBLE_QUAL; return NULL; } for (lookahead = look_token; lookahead != la; lookahead=lookahead->next) @@ -234,7 +299,8 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la, ADVANCE; } ap[i] = NULL; - if (! (attr = qual_val (ap[0], CCL_BIB1_REL)) || attr->value == 3) + if (! (attr = qual_val (ap[0], CCL_BIB1_REL)) || + attr->value != CCL_BIB1_REL_ORDER) { /* unordered relation */ struct ccl_rpn_node *p; @@ -305,7 +371,7 @@ static struct ccl_rpn_node *qualifiers (struct ccl_token *la, struct ccl_rpn_node *p2; p2 = search_term (ap); - p = mk_node (AND); + p = mk_node (CCL_RPN_AND); p->u.p[0] = p1; add_attr (p1, CCL_BIB1_REL, 4); p->u.p[1] = p2; @@ -358,7 +424,7 @@ static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa) ccl_rpn_delete (p1); return NULL; } - pn = mk_node (PROX); + pn = mk_node (CCL_RPN_PROX); pn->u.p[0] = p1; pn->u.p[1] = p2; p1 = pn; @@ -371,7 +437,7 @@ static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa) ccl_rpn_delete (p1); return NULL; } - pn = mk_node (PROX); + pn = mk_node (CCL_RPN_PROX); pn->u.p[0] = p1; pn->u.p[1] = p2; p1 = pn; @@ -411,7 +477,7 @@ static struct ccl_rpn_node *search_elements (struct ccl_rpn_attr **qa) ccl_error = CCL_ERR_SETNAME_EXPECTED; return NULL; } - p1 = mk_node (SET); + p1 = mk_node (CCL_RPN_SET); p1->u.setname = copy_token_name (look_token); ADVANCE; return p1; @@ -442,7 +508,7 @@ static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa) ccl_rpn_delete (p1); return NULL; } - pn = mk_node (AND); + pn = mk_node (CCL_RPN_AND); pn->u.p[0] = p1; pn->u.p[1] = p2; p1 = pn; @@ -455,7 +521,7 @@ static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa) ccl_rpn_delete (p1); return NULL; } - pn = mk_node (OR); + pn = mk_node (CCL_RPN_OR); pn->u.p[0] = p1; pn->u.p[1] = p2; p1 = pn; @@ -468,7 +534,7 @@ static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa) ccl_rpn_delete (p1); return NULL; } - pn = mk_node (NOT); + pn = mk_node (CCL_RPN_NOT); pn->u.p[0] = p1; pn->u.p[1] = p2; p1 = pn;