2 * Copyright (c) 1995, the EUROPAGATE consortium (see below).
4 * The EUROPAGATE consortium members are:
6 * University College Dublin
7 * Danmarks Teknologiske Videnscenter
8 * An Chomhairle Leabharlanna
9 * Consejo Superior de Investigaciones Cientificas
11 * Permission to use, copy, modify, distribute, and sell this software and
12 * its documentation, in whole or in part, for any purpose, is hereby granted,
15 * 1. This copyright and permission notice appear in all copies of the
16 * software and its documentation. Notices of copyright or attribution
17 * which appear at the beginning of any file must remain unchanged.
19 * 2. The names of EUROPAGATE or the project partners may not be used to
20 * endorse or promote products derived from this software without specific
21 * prior written permission.
23 * 3. Users of this software (implementors and gateway operators) agree to
24 * inform the EUROPAGATE consortium of their use of the software. This
25 * information will be used to evaluate the EUROPAGATE project and the
26 * software, and to plan further developments. The consortium may use
27 * the information in later publications.
29 * 4. Users of this software agree to make their best efforts, when
30 * documenting their use of the software, to acknowledge the EUROPAGATE
31 * consortium, and the role played by the software in their work.
33 * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
34 * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
35 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
36 * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
37 * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
38 * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
39 * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
40 * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
41 * USE OR PERFORMANCE OF THIS SOFTWARE.
46 * \brief Implements CCL qualifier utilities
51 * $Id: cclqual.c,v 1.7 2007-04-26 22:11:32 adam Exp $
55 * Revision 1.9 1995/05/16 09:39:27 adam
58 * Revision 1.8 1995/05/11 14:03:57 adam
59 * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
60 * New variable ccl_case_sensitive, which controls whether reserved
61 * words and field names are case sensitive or not.
63 * Revision 1.7 1995/04/17 09:31:46 adam
64 * Improved handling of qualifiers. Aliases or reserved words.
66 * Revision 1.6 1995/02/23 08:32:00 adam
69 * Revision 1.4 1995/02/14 19:55:12 adam
70 * Header files ccl.h/cclp.h are gone! They have been merged an
71 * moved to ../include/ccl.h.
72 * Node kind(s) in ccl_rpn_node have changed names.
74 * Revision 1.3 1995/02/14 16:20:56 adam
75 * Qualifiers are read from a file now.
77 * Revision 1.2 1995/02/14 10:25:56 adam
78 * The constructions 'qualifier rel term ...' implemented.
80 * Revision 1.1 1995/02/13 15:15:07 adam
81 * Added handling of qualifiers. Not finished yet.
92 struct ccl_qualifier {
95 struct ccl_qualifier **sub;
96 struct ccl_rpn_attr *attr_list;
97 struct ccl_qualifier *next;
101 /** Definition of CCL_bibset pointer */
102 struct ccl_qualifiers {
103 struct ccl_qualifier *list;
104 struct ccl_qualifier_special *special;
108 /** CCL Qualifier special */
109 struct ccl_qualifier_special {
112 struct ccl_qualifier_special *next;
116 static struct ccl_qualifier *ccl_qual_lookup(CCL_bibset b,
117 const char *n, size_t len)
119 struct ccl_qualifier *q;
120 for (q = b->list; q; q = q->next)
121 if (len == strlen(q->name) && !memcmp(q->name, n, len))
126 /** \brief specifies special qualifier
128 \param n name of special (without leading @)
129 \param v value of special
131 void ccl_qual_add_special(CCL_bibset bibset, const char *n, const char *v)
133 struct ccl_qualifier_special *p;
136 for (p = bibset->special; p && strcmp(p->name, n); p = p->next)
142 p = (struct ccl_qualifier_special *) xmalloc(sizeof(*p));
143 p->name = xstrdup(n);
145 p->next = bibset->special;
148 while (strchr(" \t", *v))
150 for (pe = v + strlen(v); pe != v; --pe)
151 if (!strchr(" \n\r\t", pe[-1]))
153 p->value = (char*) xmalloc(pe - v + 1);
155 memcpy(p->value, v, pe - v);
156 p->value[pe - v] = '\0';
159 static int next_token(const char **cpp, const char **dst)
162 const char *cp = *cpp;
163 while (*cp && strchr(" \r\n\t\f", *cp))
168 while (*cp && !strchr(" \r\n\t\f", *cp))
177 /** \brief adds specifies qualifier aliases
180 \param n qualifier name
181 \param names list of qualifier aliases
183 void ccl_qual_add_combi(CCL_bibset b, const char *n, const char *names)
185 const char *cp, *cp1;
187 struct ccl_qualifier *q;
188 for (q = b->list; q && strcmp(q->name, n); q = q->next)
192 q = (struct ccl_qualifier *) xmalloc(sizeof(*q));
193 q->name = xstrdup(n);
199 for (i = 0; next_token(&cp, 0); i++)
202 q->sub = (struct ccl_qualifier **) xmalloc(sizeof(*q->sub) *
205 for (i = 0; (len = next_token(&cp, &cp1)); i++)
207 q->sub[i] = ccl_qual_lookup(b, cp1, len);
211 /** \brief adds specifies attributes for qualifier
214 \param name qualifier name
215 \param no number of attribute type+value pairs
216 \param type_ar attributes type of size no
217 \param value_ar attribute value of size no
218 \param svalue_ar attribute string values ([i] only used if != NULL)
219 \param attsets attribute sets of size no
222 void ccl_qual_add_set(CCL_bibset b, const char *name, int no,
223 int *type_ar, int *value_ar, char **svalue_ar,
226 struct ccl_qualifier *q;
227 struct ccl_rpn_attr **attrp;
230 for (q = b->list; q; q = q->next)
231 if (!strcmp(name, q->name))
235 q = (struct ccl_qualifier *)xmalloc(sizeof(*q));
241 q->name = xstrdup(name);
247 attrp = &q->attr_list;
249 attrp = &(*attrp)->next;
252 struct ccl_rpn_attr *attr;
254 attr = (struct ccl_rpn_attr *)xmalloc(sizeof(*attr));
256 attr->set = *attsets++;
257 attr->type = *type_ar++;
260 attr->kind = CCL_RPN_ATTR_STRING;
261 attr->value.str = *svalue_ar;
265 attr->kind = CCL_RPN_ATTR_NUMERIC;
266 attr->value.numeric = *value_ar;
276 /** \brief creates Bibset
279 CCL_bibset ccl_qual_mk(void)
281 CCL_bibset b = (CCL_bibset)xmalloc(sizeof(*b));
288 /** \brief destroys Bibset
289 \param b pointer to Bibset
291 *b will be set to NULL.
293 void ccl_qual_rm(CCL_bibset *b)
295 struct ccl_qualifier *q, *q1;
296 struct ccl_qualifier_special *sp, *sp1;
300 for (q = (*b)->list; q; q = q1)
302 struct ccl_rpn_attr *attr, *attr1;
304 for (attr = q->attr_list; attr; attr = attr1)
309 if (attr->kind == CCL_RPN_ATTR_STRING)
310 xfree(attr->value.str);
319 for (sp = (*b)->special; sp; sp = sp1)
330 /** \brief searches for qualifier attributes
331 \param cclp CCL parser
332 \param name qualifier name to for search (length given by len)
333 \param len length of name
334 \param seq attribute index (0=first, 1=second, ..)
335 \returns attribute or NULL if none is found
337 struct ccl_rpn_attr *ccl_qual_search(CCL_parser cclp, const char *name,
340 struct ccl_qualifier *q;
342 int case_sensitive = cclp->ccl_case_sensitive;
348 aliases = ccl_qual_search_special(cclp->bibset, "case");
350 case_sensitive = atoi(aliases);
352 for (q = cclp->bibset->list; q; q = q->next)
353 if (strlen(q->name) == len)
357 if (!memcmp(name, q->name, len))
362 if (!ccl_memicmp(name, q->name, len))
368 if (q->attr_list && seq == 0)
370 if (seq < q->no_sub && q->sub[seq])
372 return q->sub[seq]->attr_list;
378 const char *ccl_qual_search_special(CCL_bibset b, const char *name)
380 struct ccl_qualifier_special *q;
383 for (q = b->special; q && strcmp(q->name, name); q = q->next)
392 * indent-tabs-mode: nil
394 * vim: shiftwidth=4 tabstop=8 expandtab