X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=ccl%2Fcclqual.c;h=9180f9f763ba1f3465d4dd319f141655dc86ed63;hb=6f97971ea2f3d82a406e011a4aaf797368c553be;hp=4dff9cbce0ee4b64274c9101562480f4291fcd4b;hpb=98a49f6636e01e87e867688f4fb8a3b696a847ff;p=egate.git diff --git a/ccl/cclqual.c b/ccl/cclqual.c index 4dff9cb..9180f9f 100644 --- a/ccl/cclqual.c +++ b/ccl/cclqual.c @@ -2,7 +2,21 @@ * Europagate, 1995 * * $Log: cclqual.c,v $ - * Revision 1.1 1995/02/13 15:15:07 adam + * Revision 1.6 1995/02/23 08:32:00 adam + * Changed header. + * + * Revision 1.4 1995/02/14 19:55:12 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.3 1995/02/14 16:20:56 adam + * Qualifiers are read from a file now. + * + * Revision 1.2 1995/02/14 10:25:56 adam + * The constructions 'qualifier rel term ...' implemented. + * + * Revision 1.1 1995/02/13 15:15:07 adam * Added handling of qualifiers. Not finished yet. * */ @@ -12,38 +26,52 @@ #include #include -#include "cclp.h" +#include struct ccl_qualifiers { struct ccl_qualifier *list; }; -void ccl_qual_add (CCL_bibset b, - const char *name, int nuse, int *use, int relation, - int position, int structure, int truncation, - int completeness) +void ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) { - struct ccl_qualifier *new_qual; + struct ccl_qualifier *q; + struct ccl_rpn_attr **attrp; assert (b); - new_qual = malloc (sizeof(*new_qual)); - assert (new_qual); - - new_qual->next = b->list; - b->list = new_qual; + for (q = b->list; q; q = q->next) + if (!strcmp (name, q->name)) + break; + if (!q) + { + struct ccl_qualifier *new_qual = malloc (sizeof(*new_qual)); + assert (new_qual); + + new_qual->next = b->list; + b->list = new_qual; + + new_qual->name = malloc (strlen(name)+1); + assert (new_qual->name); + strcpy (new_qual->name, name); + attrp = &new_qual->attr_list; + } + else + { + attrp = &q->attr_list; + while (*attrp) + attrp = &(*attrp)->next; + } + while (--no >= 0) + { + struct ccl_rpn_attr *attr; - new_qual->name = malloc (strlen(name)+1); - assert (new_qual->name); - strcpy (new_qual->name, name); - new_qual->nuse = nuse; - new_qual->use = malloc (sizeof(int)*nuse); - assert (new_qual->use); - memcpy (new_qual->use, use, sizeof(int)*nuse); - new_qual->relation = relation; - new_qual->position = position; - new_qual->structure = structure; - new_qual->truncation = truncation; - new_qual->completeness = completeness; + attr = malloc (sizeof(*attr)); + assert (attr); + attr->type = *pairs++; + attr->value = *pairs++; + *attrp = attr; + attrp = &attr->next; + } + *attrp = NULL; } CCL_bibset ccl_qual_mk (void) @@ -60,13 +88,95 @@ void ccl_qual_rm (CCL_bibset *b) *b = NULL; } -struct ccl_qualifier *ccl_qual_search (CCL_bibset b, const char *name) +struct ccl_rpn_attr *ccl_qual_search (CCL_bibset b, const char *name, int len) { struct ccl_qualifier *q; assert (b); for (q = b->list; q; q = q->next) - if (strcmp (name, q->name)) - return q; + if (strlen(q->name) == len && !memcmp (name, q->name, len)) + return q->attr_list; return NULL; } + +void ccl_qual_file (CCL_bibset bibset, FILE *inf) +{ + char line[256]; + char *cp; + char qual_name[128]; + char qual_des[128]; + int no_scan; + + while (fgets (line, 255, inf)) + { + cp = line; + if (*cp == '#') + continue; + if (sscanf (cp, "%s%n", qual_name, &no_scan) != 1) + continue; + cp += no_scan; + while (1) + { + int pair[2]; + char *qual_type; + char *qual_value; + char *split; + + if (sscanf (cp, "%s%n", qual_des, &no_scan) != 1) + break; + + if (!(split = strchr (qual_des, '='))) + break; + cp += no_scan; + + *split++ = '\0'; + qual_type = qual_des; + qual_value = split; + while (1) + { + if ((split = strchr (qual_value, ','))) + *split++ = '\0'; + pair[1] = atoi (qual_value); + switch (qual_type[0]) + { + case 'u': + pair[0] = CCL_BIB1_USE; + break; + case 'r': + pair[0] = CCL_BIB1_REL; + if (!strcmp (qual_value, "o")) + pair[1] = CCL_BIB1_REL_ORDER; + break; + case 'p': + pair[0] = CCL_BIB1_POS; + break; + case 's': + pair[0] = CCL_BIB1_STR; + if (!strcmp (qual_value, "pw")) + pair[1] = CCL_BIB1_STR_WP; + break; + case 't': + pair[0] = CCL_BIB1_TRU; + if (!strcmp (qual_value, "l")) + pair[1] = CCL_BIB1_TRU_CAN_LEFT; + else if (!strcmp (qual_value, "r")) + pair[1] = CCL_BIB1_TRU_CAN_RIGHT; + else if (!strcmp (qual_value, "b")) + pair[1] = CCL_BIB1_TRU_CAN_BOTH; + else if (!strcmp (qual_value, "n")) + pair[1] = CCL_BIB1_TRU_CAN_NONE; + break; + case 'c': + pair[0] = CCL_BIB1_COM; + break; + default: + pair[0] = atoi (qual_type); + } + ccl_qual_add (bibset, qual_name, 1, pair); + if (!split) + break; + qual_value = split; + } + } + } +}