From: Adam Dickmeiss Date: Mon, 8 Jan 2007 13:20:58 +0000 (+0000) Subject: Added missing source. X-Git-Tag: YAZ.2.1.46~10 X-Git-Url: http://sru.miketaylor.org.uk/?a=commitdiff_plain;h=bc1bdc891836da144db8108bc062d30dbb922f8b;p=yaz-moved-to-github.git Added missing source. --- diff --git a/src/cclxmlconfig.c b/src/cclxmlconfig.c new file mode 100644 index 0000000..321073b --- /dev/null +++ b/src/cclxmlconfig.c @@ -0,0 +1,210 @@ +/* + * Copyright (C) 1995-2007, Index Data ApS + * All rights reserved. + * + * $Id: cclxmlconfig.c,v 1.1 2007-01-08 13:20:58 adam Exp $ + */ + +/** \file cclxmlconfig.c + \brief XML configuration for CCL +*/ + +#include +#include +#include + +#include + +#if YAZ_HAVE_XML2 + +static int ccl_xml_config_attr(CCL_bibset bibset, const char *default_set, + WRBUF wrbuf, + const xmlNode *ptr, + const char **addinfo) +{ + struct _xmlAttr *attr; + const char *type = 0; + const char *value = 0; + const char *attrset = default_set; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "type") && + attr->children && attr->children->type == XML_TEXT_NODE) + type = (const char *) attr->children->content; + else if (!xmlStrcmp(attr->name, BAD_CAST "value") && + attr->children && attr->children->type == XML_TEXT_NODE) + value = (const char *) attr->children->content; + else if (!xmlStrcmp(attr->name, BAD_CAST "attrset") && + attr->children && attr->children->type == XML_TEXT_NODE) + attrset = (const char *) attr->children->content; + else + { + *addinfo = "bad attribute for 'attr'. " + "Expecting 'type', 'value', or 'attrset'"; + return 1; + } + } + if (!type) + { + *addinfo = "missing attribute for 'type' for element 'attr'"; + return 1; + } + if (!value) + { + *addinfo = "missing attribute for 'value' for element 'attr'"; + return 1; + } + if (attrset) + wrbuf_printf(wrbuf, "%s,%s=%s", attrset, type, value); + else + wrbuf_printf(wrbuf, "%s=%s", type, value); + return 0; +} + +static int ccl_xml_config_qual(CCL_bibset bibset, const char *default_set, + WRBUF wrbuf, + const xmlNode *ptr, + const char **addinfo) +{ + struct _xmlAttr *attr; + const char *name = 0; + const xmlNode *a_ptr = ptr->children; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "name") && + attr->children && attr->children->type == XML_TEXT_NODE) + name = (const char *) attr->children->content; + else + { + *addinfo = "bad attribute for 'qual'. Expecting 'name' only"; + return 1; + } + } + if (!name) + { + *addinfo = "missing attribute 'name' for 'qual' element"; + return 1; + } + for (; a_ptr; a_ptr = a_ptr->next) + { + if (a_ptr->type == XML_ELEMENT_NODE) + { + if (!xmlStrcmp(a_ptr->name, BAD_CAST "attr")) + { + int r = ccl_xml_config_attr(bibset, default_set, wrbuf, + a_ptr, addinfo); + if (r) + return r; + wrbuf_printf(wrbuf, " "); + } + else + { + *addinfo = "bad element: expecting 'attr'"; + return 1; + } + } + } + ccl_qual_fitem(bibset, wrbuf_cstr(wrbuf), name); + return 0; +} + +int ccl_xml_config_directive(CCL_bibset bibset, const xmlNode *ptr, + const char **addinfo) +{ + struct _xmlAttr *attr; + const char *name = 0; + const char *value = 0; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "name") && + attr->children && attr->children->type == XML_TEXT_NODE) + name = (const char *) attr->children->content; + else if (!xmlStrcmp(attr->name, BAD_CAST "value") && + attr->children && attr->children->type == XML_TEXT_NODE) + value = (const char *) attr->children->content; + else + { + *addinfo = "bad attribute for 'diretive'. " + "Expecting 'name' or 'value'"; + return 1; + } + } + if (!name) + { + *addinfo = "missing attribute 'name' for 'directive' element"; + return 1; + } + if (!value) + { + *addinfo = "missing attribute 'name' for 'value' element"; + return 1; + } + ccl_qual_add_special(bibset, name, value); + return 0; +} + +int ccl_xml_config(CCL_bibset bibset, const xmlNode *ptr, const char **addinfo) +{ + if (ptr && ptr->type == XML_ELEMENT_NODE && + !xmlStrcmp(ptr->name, BAD_CAST "cclmap")) + { + const xmlNode *c_ptr; + const char *set = 0; + struct _xmlAttr *attr; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "defaultattrset") && + attr->children && attr->children->type == XML_TEXT_NODE) + set = (const char *) attr->children->content; + else + { + *addinfo = "bad attribute for 'cclmap'. " + "expecting 'defaultattrset'"; + return 1; + } + } + for (c_ptr = ptr->children; c_ptr; c_ptr = c_ptr->next) + { + if (c_ptr->type == XML_ELEMENT_NODE) + { + if (!xmlStrcmp(c_ptr->name, BAD_CAST "qual")) + { + WRBUF wrbuf = wrbuf_alloc(); + int r = ccl_xml_config_qual(bibset, set, + wrbuf, c_ptr, addinfo); + wrbuf_destroy(wrbuf); + if (r) + return r; + } + else if (!xmlStrcmp(c_ptr->name, BAD_CAST "directive")) + { + int r = ccl_xml_config_directive(bibset, c_ptr, addinfo); + if (r) + return r; + } + else + { + *addinfo = "bad element for 'cclmap'. " + "expecting 'directive' or 'qual'"; + return 1; + } + } + } + } + return 0; +} +#else +int ccl_xml_config(CCL_bibset bibset, const xmlNode *ptr, const char **addinfo) +{ + *addinfo = "CCL XML configuration not supported. Libxml2 is disabled"; + return -1; +} +#endif + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */