-/*
- * 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.
- *
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
+ * See the file LICENSE for details.
*/
-/**
+/**
* \file cclqual.c
* \brief Implements CCL qualifier utilities
*/
-/* CCL qualifiers
- * Europagate, 1995
- *
- * $Id: cclqual.c,v 1.9 2007-04-30 19:55:40 adam Exp $
- *
- * Old Europagate Log:
- *
- * 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.
- *
- * 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.
- *
- */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdio.h>
#include <stdlib.h>
int i;
for (i = 0; p->values[i]; i++)
xfree((char *) p->values[i]);
- xfree(p->values);
+ xfree((char **)p->values);
}
}
else
void ccl_qual_add_special(CCL_bibset bibset, const char *n, const char *cp)
{
size_t no = 2;
- char **vlist = xmalloc(no * sizeof(*vlist));
+ char **vlist = (char **) xmalloc(no * sizeof(*vlist));
yaz_tok_cfg_t yt = yaz_tok_cfg_create();
int t;
- int i = 0;
-
+ size_t i = 0;
+
yaz_tok_parse_t tp = yaz_tok_parse_buf(yt, cp);
-
+
yaz_tok_cfg_destroy(yt);
-
+
t = yaz_tok_move(tp);
while (t == YAZ_TOK_STRING)
{
if (i >= no-1)
- vlist = xrealloc(vlist, (no = no * 2) * sizeof(*vlist));
+ vlist = (char **) xrealloc(vlist, (no = no * 2) * sizeof(*vlist));
vlist[i++] = xstrdup(yaz_tok_parse_string(tp));
- t = yaz_tok_move(tp);
+ t = yaz_tok_move(tp);
}
vlist[i] = 0;
ccl_qual_add_special_ar(bibset, n, (const char **) vlist);
-
+
yaz_tok_parse_destroy(tp);
}
/** \brief adds specifies qualifier aliases
-
+
\param b bibset
\param n qualifier name
\param names list of qualifier aliases
q->attr_list = 0;
q->next = b->list;
b->list = q;
-
+
for (i = 0; names[i]; i++)
;
q->no_sub = i;
}
/** \brief adds specifies attributes for qualifier
-
+
\param b bibset
\param name qualifier name
\param no number of attribute type+value pairs
{
q = (struct ccl_qualifier *)xmalloc(sizeof(*q));
ccl_assert(q);
-
+
q->next = b->list;
b->list = q;
-
+
q->name = xstrdup(name);
q->attr_list = 0;
{
CCL_bibset b = (CCL_bibset)xmalloc(sizeof(*b));
ccl_assert(b);
- b->list = NULL;
+ b->list = NULL;
b->special = NULL;
return b;
}
/** \brief destroys Bibset
\param b pointer to Bibset
-
+
*b will be set to NULL.
*/
void ccl_qual_rm(CCL_bibset *b)
int i;
for (i = 0; sp->values[i]; i++)
xfree((char*) sp->values[i]);
- xfree(sp->values);
+ xfree((char **)sp->values);
}
xfree(sp);
}
*b = NULL;
}
-ccl_qualifier_t ccl_qual_search(CCL_parser cclp, const char *name,
+CCL_bibset ccl_qual_dup(CCL_bibset b)
+{
+ CCL_bibset n = ccl_qual_mk();
+ struct ccl_qualifier *q, **qp;
+ struct ccl_qualifier_special *s, **sp;
+
+ qp = &n->list;
+ for (q = b->list; q; q = q->next)
+ {
+ struct ccl_rpn_attr *attr, **attrp;
+ *qp = xmalloc(sizeof(**qp));
+ (*qp)->next = 0;
+ (*qp)->attr_list = 0;
+ (*qp)->name = xstrdup(q->name);
+
+ attrp = &(*qp)->attr_list;
+ for (attr = q->attr_list; attr; attr = attr->next)
+ {
+ *attrp = xmalloc(sizeof(**attrp));
+ (*attrp)->next = 0;
+ (*attrp)->set = attr->set ? xstrdup(attr->set) : 0;
+ (*attrp)->type = attr->type;
+ (*attrp)->kind = attr->kind;
+ if (attr->kind == CCL_RPN_ATTR_NUMERIC)
+ (*attrp)->value.numeric = attr->value.numeric;
+ else if (attr->kind == CCL_RPN_ATTR_STRING)
+ (*attrp)->value.str = xstrdup(attr->value.str);
+
+ attrp = &(*attrp)->next;
+ }
+ (*qp)->no_sub = q->no_sub;
+ if (!q->sub)
+ (*qp)->sub = 0;
+ else
+ {
+ /* fix up the sub qualifiers.. */
+ int i;
+ (*qp)->sub = xmalloc(sizeof(*q->sub) * (q->no_sub + 1));
+ for (i = 0; i < q->no_sub; i++)
+ {
+ struct ccl_qualifier *q1, *q2;
+
+ /* sweep though original and match up the corresponding ent */
+ q2 = n->list;
+ for (q1 = b->list; q1 && q2; q1 = q1->next, q2 = q2->next)
+ if (q1 == q->sub[i])
+ break;
+ (*qp)->sub[i] = q2;
+ }
+ }
+ qp = &(*qp)->next;
+ }
+ sp = &n->special;
+ for (s = b->special; s; s = s->next)
+ {
+ int i;
+
+ for (i = 0; s->values[i]; i++)
+ ;
+ *sp = xmalloc(sizeof(**sp));
+ (*sp)->next = 0;
+ (*sp)->name = xstrdup(s->name);
+ (*sp)->values = xmalloc(sizeof(*(*sp)->values) * (i+1));
+ for (i = 0; s->values[i]; i++)
+ (*sp)->values[i] = xstrdup(s->values[i]);
+ (*sp)->values[i] = 0;
+ sp = &(*sp)->next;
+ }
+ return n;
+}
+
+ccl_qualifier_t ccl_qual_search(CCL_parser cclp, const char *name,
size_t name_len, int seq)
{
struct ccl_qualifier *q = 0;
return q->attr_list;
}
+struct ccl_rpn_attr *ccl_parser_qual_search(CCL_parser cclp, const char *name,
+ size_t name_len)
+{
+ ccl_qualifier_t q = ccl_qual_search(cclp, name, name_len, 0);
+ if (q)
+ return q->attr_list;
+ return 0;
+}
+
const char *ccl_qual_get_name(ccl_qualifier_t q)
{
return q->name;
return 0;
}
-int ccl_qual_match_stop(CCL_bibset bibset, ccl_qualifier_t *qa,
- const char *src_str, size_t src_len)
+int ccl_search_stop(CCL_bibset bibset, const char *qname,
+ const char *src_str, size_t src_len)
{
- if (qa[0])
+ const char **slist = 0;
+ if (qname)
{
- char qname[80];
- const char **slist;
- yaz_snprintf(qname, sizeof(qname)-1, "stop.%s",
- ccl_qual_get_name(qa[0]));
- slist = ccl_qual_search_special(bibset, qname);
- if (!slist)
- slist = ccl_qual_search_special(bibset, "stop.*");
- if (slist)
- {
- int i;
- for (i = 0; slist[i]; i++)
- if (src_len == strlen(slist[i])
- && ccl_memicmp(slist[i], src_str, src_len) == 0)
- return 1;
- }
+ char qname_buf[80];
+ yaz_snprintf(qname_buf, sizeof(qname_buf)-1, "stop.%s",
+ qname);
+ slist = ccl_qual_search_special(bibset, qname_buf);
+ }
+ if (!slist)
+ slist = ccl_qual_search_special(bibset, "stop.*");
+ if (slist)
+ {
+ int i;
+ for (i = 0; slist[i]; i++)
+ if (src_len == strlen(slist[i])
+ && ccl_memicmp(slist[i], src_str, src_len) == 0)
+ return 1;
}
return 0;
}
-
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab