X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=ccl%2Fcclqual.c;h=343d64f168a66de50e3737b5095a6d3e1cb7c508;hp=3fb76c71a58430d530a15323041df9f120a5f8fc;hb=3a14421799597d61196e2bb07bdd83396000cb45;hpb=657fb99115b87a5244e9a33bbe4ca3d9d18849c4 diff --git a/ccl/cclqual.c b/ccl/cclqual.c index 3fb76c7..343d64f 100644 --- a/ccl/cclqual.c +++ b/ccl/cclqual.c @@ -1,12 +1,81 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ /* CCL qualifiers * Europagate, 1995 * * $Log: cclqual.c,v $ - * Revision 1.2 1995-09-27 15:02:44 quinn - * Modified function heads & prototypes. + * Revision 1.10 1998-07-07 15:49:40 adam + * Added braces to avoid warning. + * + * Revision 1.9 1998/02/11 11:53:33 adam + * Changed code so that it compiles as C++. * - * Revision 1.1 1995/04/10 10:28:20 quinn - * Added copy of CCL. + * Revision 1.8 1997/09/29 08:56:38 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. + * + * Revision 1.7 1997/09/01 08:48:12 adam + * New windows NT/95 port using MSV5.0. Only a few changes made + * to avoid warnings. + * + * Revision 1.6 1997/04/30 08:52:07 quinn + * Null + * + * Revision 1.5 1996/10/11 15:00:25 adam + * CCL parser from Europagate Email gateway 1.0. + * + * Revision 1.9 1995/05/16 09:39:27 adam + * LICENSE. + * + * Revision 1.8 1995/05/11 14:03:57 adam + * Changes in the reading of qualifier(s). New function: ccl_qual_fitem. + * New variable ccl_case_sensitive, which controls whether reserved + * words and field names are case sensitive or not. + * + * Revision 1.7 1995/04/17 09:31:46 adam + * Improved handling of qualifiers. Aliases or reserved words. * * Revision 1.6 1995/02/23 08:32:00 adam * Changed header. @@ -34,11 +103,21 @@ #include +/* Definition of CCL_bibset pointer */ struct ccl_qualifiers { struct ccl_qualifier *list; }; -void MDF ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) +/* + * ccl_qual_add: Add qualifier to Bibset. If qualifier already + * exists, then attributes are appendend to old + * definition. + * name: name of qualifier + * no: No of attribute type/value pairs. + * pairs: Attributes. pairs[0] first type, pair[1] first value, + * ... pair[2*no-2] last type, pair[2*no-1] last value. + */ +void ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) { struct ccl_qualifier *q; struct ccl_rpn_attr **attrp; @@ -49,13 +128,13 @@ void MDF ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) break; if (!q) { - struct ccl_qualifier *new_qual = malloc (sizeof(*new_qual)); + struct ccl_qualifier *new_qual = (struct ccl_qualifier *)malloc (sizeof(*new_qual)); assert (new_qual); new_qual->next = b->list; b->list = new_qual; - new_qual->name = malloc (strlen(name)+1); + new_qual->name = (char *)malloc (strlen(name)+1); assert (new_qual->name); strcpy (new_qual->name, name); attrp = &new_qual->attr_list; @@ -70,7 +149,7 @@ void MDF ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) { struct ccl_rpn_attr *attr; - attr = malloc (sizeof(*attr)); + attr = (struct ccl_rpn_attr *)malloc (sizeof(*attr)); assert (attr); attr->type = *pairs++; attr->value = *pairs++; @@ -80,109 +159,73 @@ void MDF ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs) *attrp = NULL; } -CCL_bibset MDF ccl_qual_mk (void) +/* + * ccl_qual_mk: Make new (empty) bibset. + * return: empty bibset. + */ +CCL_bibset ccl_qual_mk (void) { - CCL_bibset b = malloc (sizeof(*b)); + CCL_bibset b = (CCL_bibset)malloc (sizeof(*b)); assert (b); b->list = NULL; return b; } -void MDF ccl_qual_rm (CCL_bibset *b) +/* + * ccl_qual_rm: Delete bibset. + * b: pointer to bibset + */ +void ccl_qual_rm (CCL_bibset *b) { - assert (*b); - *b = NULL; -} + struct ccl_qualifier *q, *q1; -struct ccl_rpn_attr MDF *ccl_qual_search (CCL_bibset b, const char *name, int len) -{ - struct ccl_qualifier *q; + if (!*b) + return; + for (q = (*b)->list; q; q = q1) + { + struct ccl_rpn_attr *attr, *attr1; - assert (b); - for (q = b->list; q; q = q->next) - if (strlen(q->name) == len && !memcmp (name, q->name, len)) - return q->attr_list; - return NULL; + for (attr = q->attr_list; attr; attr = attr1) + { + attr1 = attr->next; + free (attr); + } + q1 = q->next; + free (q); + } + free (*b); + *b = NULL; } -void MDF ccl_qual_file (CCL_bibset bibset, FILE *inf) +/* + * ccl_qual_search: Search for qualifier in bibset. + * b: Bibset + * name: Name of qualifier to search for (need no null-termination) + * len: Length of name. + * return: Attribute info. NULL if not found. + */ +struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp, + const char *name, size_t len) { - char line[256]; - char *cp; - char qual_name[128]; - char qual_des[128]; - int no_scan; + struct ccl_qualifier *q; - 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) + assert (cclp); + if (!cclp->bibset) + return NULL; + for (q = cclp->bibset->list; q; q = q->next) + if (strlen(q->name) == len) { - 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 (cclp->ccl_case_sensitive) { - 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; + if (!memcmp (name, q->name, len)) + return q->attr_list; + } + else + { + if (!ccl_memicmp (name, q->name, len)) + return q->attr_list; } } - } + return NULL; } +