mirror of
https://gitlab.gnome.org/GNOME/libxml2
synced 2025-03-28 21:33:13 +00:00
added code to handle <group>, including dumping to output (bug 151924).
* catalog.c: added code to handle <group>, including dumping to output (bug 151924). * xmlcatalog.c, xmlstring.c, parser.c: minor compiler warning cleanup (no change to logic)
This commit is contained in:
parent
22cdb842fd
commit
b7b54de6c6
@ -1,3 +1,10 @@
|
||||
Wed Oct 6 09:33:51 PDT 2004 William Brack <wbrack@mmm.com.hk>
|
||||
|
||||
* catalog.c: added code to handle <group>, including dumping
|
||||
to output (bug 151924).
|
||||
* xmlcatalog.c, xmlstring.c, parser.c: minor compiler warning
|
||||
cleanup (no change to logic)
|
||||
|
||||
Mon Oct 4 16:09:07 CEST 2004 Daniel Veillard <daniel@veillard.com>
|
||||
|
||||
* configure.in debugXML.c include/libxml/xmlversion.h.in
|
||||
|
297
catalog.c
297
catalog.c
@ -90,6 +90,7 @@ typedef enum {
|
||||
XML_CATA_CATALOG,
|
||||
XML_CATA_BROKEN_CATALOG,
|
||||
XML_CATA_NEXT_CATALOG,
|
||||
XML_CATA_GROUP,
|
||||
XML_CATA_PUBLIC,
|
||||
XML_CATA_SYSTEM,
|
||||
XML_CATA_REWRITE_SYSTEM,
|
||||
@ -125,6 +126,7 @@ struct _xmlCatalogEntry {
|
||||
xmlCatalogPrefer prefer;
|
||||
int dealloc;
|
||||
int depth;
|
||||
struct _xmlCatalogEntry *group;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
@ -245,6 +247,7 @@ xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error,
|
||||
* @name: name of the entry
|
||||
* @value: value of the entry
|
||||
* @prefer: the PUBLIC vs. SYSTEM current preference value
|
||||
* @group: for members of a group, the group entry
|
||||
*
|
||||
* create a new Catalog entry, this type is shared both by XML and
|
||||
* SGML catalogs, but the acceptable types values differs.
|
||||
@ -253,7 +256,8 @@ xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error,
|
||||
*/
|
||||
static xmlCatalogEntryPtr
|
||||
xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
|
||||
const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer) {
|
||||
const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer,
|
||||
xmlCatalogEntryPtr group) {
|
||||
xmlCatalogEntryPtr ret;
|
||||
xmlChar *normid = NULL;
|
||||
|
||||
@ -290,6 +294,7 @@ xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
|
||||
ret->prefer = prefer;
|
||||
ret->dealloc = 0;
|
||||
ret->depth = 0;
|
||||
ret->group = group;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -504,15 +509,137 @@ xmlCatalogDumpEntry(xmlCatalogEntryPtr entry, FILE *out) {
|
||||
fprintf(out, "\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* xmlDumpXMLCatalogNode:
|
||||
* @catal: top catalog entry
|
||||
* @catalog: pointer to the xml tree
|
||||
* @doc: the containing document
|
||||
* @ns: the current namespace
|
||||
* @cgroup: group node for group members
|
||||
*
|
||||
* Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively
|
||||
* for group entries
|
||||
*/
|
||||
static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog,
|
||||
xmlDocPtr doc, xmlNsPtr ns, xmlCatalogEntryPtr cgroup) {
|
||||
xmlNodePtr node;
|
||||
xmlCatalogEntryPtr cur;
|
||||
/*
|
||||
* add all the catalog entries
|
||||
*/
|
||||
cur = catal;
|
||||
while (cur != NULL) {
|
||||
if (cur->group == cgroup) {
|
||||
switch (cur->type) {
|
||||
case XML_CATA_REMOVED:
|
||||
break;
|
||||
case XML_CATA_BROKEN_CATALOG:
|
||||
case XML_CATA_CATALOG:
|
||||
if (cur == catal) {
|
||||
cur = cur->children;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case XML_CATA_NEXT_CATALOG:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_NONE:
|
||||
break;
|
||||
case XML_CATA_GROUP:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL);
|
||||
xmlSetProp(node, BAD_CAST "id", cur->name);
|
||||
if (cur->value != NULL)
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
switch (cur->prefer) {
|
||||
case XML_CATA_PREFER_NONE:
|
||||
break;
|
||||
case XML_CATA_PREFER_PUBLIC:
|
||||
xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public");
|
||||
break;
|
||||
case XML_CATA_PREFER_SYSTEM:
|
||||
xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system");
|
||||
break;
|
||||
}
|
||||
xmlDumpXMLCatalogNode(cur->next, node, doc, ns, cur);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_PUBLIC:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL);
|
||||
xmlSetProp(node, BAD_CAST "publicId", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemId", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_REWRITE_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_PUBLIC:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL);
|
||||
xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL);
|
||||
xmlSetProp(node, BAD_CAST "name", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_REWRITE_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL);
|
||||
xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL);
|
||||
xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case SGML_CATA_SYSTEM:
|
||||
case SGML_CATA_PUBLIC:
|
||||
case SGML_CATA_ENTITY:
|
||||
case SGML_CATA_PENTITY:
|
||||
case SGML_CATA_DOCTYPE:
|
||||
case SGML_CATA_LINKTYPE:
|
||||
case SGML_CATA_NOTATION:
|
||||
case SGML_CATA_DELEGATE:
|
||||
case SGML_CATA_BASE:
|
||||
case SGML_CATA_CATALOG:
|
||||
case SGML_CATA_DOCUMENT:
|
||||
case SGML_CATA_SGMLDECL:
|
||||
break;
|
||||
}
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
xmlDumpXMLCatalog(FILE *out, xmlCatalogEntryPtr catal) {
|
||||
int ret;
|
||||
xmlDocPtr doc;
|
||||
xmlNsPtr ns;
|
||||
xmlDtdPtr dtd;
|
||||
xmlNodePtr node, catalog;
|
||||
xmlNodePtr catalog;
|
||||
xmlOutputBufferPtr buf;
|
||||
xmlCatalogEntryPtr cur;
|
||||
|
||||
/*
|
||||
* Rebuild a catalog
|
||||
@ -540,93 +667,8 @@ BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd");
|
||||
catalog->nsDef = ns;
|
||||
xmlAddChild((xmlNodePtr) doc, catalog);
|
||||
|
||||
/*
|
||||
* add all the catalog entries
|
||||
*/
|
||||
cur = catal;
|
||||
while (cur != NULL) {
|
||||
switch (cur->type) {
|
||||
case XML_CATA_REMOVED:
|
||||
break;
|
||||
case XML_CATA_BROKEN_CATALOG:
|
||||
case XML_CATA_CATALOG:
|
||||
if (cur == catal) {
|
||||
cur = cur->children;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case XML_CATA_NEXT_CATALOG:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_NONE:
|
||||
break;
|
||||
case XML_CATA_PUBLIC:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL);
|
||||
xmlSetProp(node, BAD_CAST "publicId", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemId", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_REWRITE_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_PUBLIC:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL);
|
||||
xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_SYSTEM:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL);
|
||||
xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL);
|
||||
xmlSetProp(node, BAD_CAST "name", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "uri", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_REWRITE_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL);
|
||||
xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case XML_CATA_DELEGATE_URI:
|
||||
node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL);
|
||||
xmlSetProp(node, BAD_CAST "uriStartString", cur->name);
|
||||
xmlSetProp(node, BAD_CAST "catalog", cur->value);
|
||||
xmlAddChild(catalog, node);
|
||||
break;
|
||||
case SGML_CATA_SYSTEM:
|
||||
case SGML_CATA_PUBLIC:
|
||||
case SGML_CATA_ENTITY:
|
||||
case SGML_CATA_PENTITY:
|
||||
case SGML_CATA_DOCTYPE:
|
||||
case SGML_CATA_LINKTYPE:
|
||||
case SGML_CATA_NOTATION:
|
||||
case SGML_CATA_DELEGATE:
|
||||
case SGML_CATA_BASE:
|
||||
case SGML_CATA_CATALOG:
|
||||
case SGML_CATA_DOCUMENT:
|
||||
case SGML_CATA_SGMLDECL:
|
||||
break;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL);
|
||||
|
||||
/*
|
||||
* reserialize it
|
||||
*/
|
||||
@ -1017,7 +1059,7 @@ static xmlCatalogEntryPtr
|
||||
xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename);
|
||||
static void
|
||||
xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
xmlCatalogEntryPtr parent);
|
||||
xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup);
|
||||
static xmlChar *
|
||||
xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
|
||||
const xmlChar *sysID);
|
||||
@ -1067,6 +1109,7 @@ xmlGetXMLCatalogEntryType(const xmlChar *name) {
|
||||
* @attrName: the attribute holding the value
|
||||
* @uriAttrName: the attribute holding the URI-Reference
|
||||
* @prefer: the PUBLIC vs. SYSTEM current preference value
|
||||
* @cgroup: the group which includes this node
|
||||
*
|
||||
* Finishes the examination of an XML tree node of a catalog and build
|
||||
* a Catalog entry from it.
|
||||
@ -1076,7 +1119,8 @@ xmlGetXMLCatalogEntryType(const xmlChar *name) {
|
||||
static xmlCatalogEntryPtr
|
||||
xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
|
||||
const xmlChar *name, const xmlChar *attrName,
|
||||
const xmlChar *uriAttrName, xmlCatalogPrefer prefer) {
|
||||
const xmlChar *uriAttrName, xmlCatalogPrefer prefer,
|
||||
xmlCatalogEntryPtr cgroup) {
|
||||
int ok = 1;
|
||||
xmlChar *uriValue;
|
||||
xmlChar *nameValue = NULL;
|
||||
@ -1117,7 +1161,7 @@ xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
|
||||
xmlGenericError(xmlGenericErrorContext,
|
||||
"Found %s: '%s'\n", name, URL);
|
||||
}
|
||||
ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer);
|
||||
ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer, cgroup);
|
||||
} else {
|
||||
xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN,
|
||||
"%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue);
|
||||
@ -1138,6 +1182,7 @@ xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
|
||||
* @cur: the XML node
|
||||
* @prefer: the PUBLIC vs. SYSTEM current preference value
|
||||
* @parent: the parent Catalog entry
|
||||
* @cgroup: the group which includes this node
|
||||
*
|
||||
* Examines an XML tree node of a catalog and build
|
||||
* a Catalog entry from it adding it to its parent. The examination can
|
||||
@ -1145,7 +1190,7 @@ xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
|
||||
*/
|
||||
static void
|
||||
xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
xmlCatalogEntryPtr parent)
|
||||
xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup)
|
||||
{
|
||||
xmlChar *uri = NULL;
|
||||
xmlChar *URL = NULL;
|
||||
@ -1156,6 +1201,7 @@ xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
return;
|
||||
if (xmlStrEqual(cur->name, BAD_CAST "group")) {
|
||||
xmlChar *prop;
|
||||
xmlCatalogPrefer pref = XML_CATA_PREFER_NONE;
|
||||
|
||||
prop = xmlGetProp(cur, BAD_CAST "prefer");
|
||||
if (prop != NULL) {
|
||||
@ -1169,46 +1215,45 @@ xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
prop, NULL, NULL);
|
||||
}
|
||||
xmlFree(prop);
|
||||
pref = prefer;
|
||||
}
|
||||
/*
|
||||
* Recurse to propagate prefer to the subtree
|
||||
* (xml:base handling is automated)
|
||||
*/
|
||||
xmlParseXMLCatalogNodeList(cur->children, prefer, parent);
|
||||
prop = xmlGetProp(cur, BAD_CAST "id");
|
||||
base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE);
|
||||
entry = xmlNewCatalogEntry(XML_CATA_GROUP, prop, base, NULL, pref, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "public")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_PUBLIC,
|
||||
BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer);
|
||||
BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "system")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_SYSTEM,
|
||||
BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer);
|
||||
BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "rewriteSystem")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_SYSTEM,
|
||||
BAD_CAST "rewriteSystem", BAD_CAST "systemIdStartString",
|
||||
BAD_CAST "rewritePrefix", prefer);
|
||||
BAD_CAST "rewritePrefix", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "delegatePublic")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_PUBLIC,
|
||||
BAD_CAST "delegatePublic", BAD_CAST "publicIdStartString",
|
||||
BAD_CAST "catalog", prefer);
|
||||
BAD_CAST "catalog", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "delegateSystem")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_SYSTEM,
|
||||
BAD_CAST "delegateSystem", BAD_CAST "systemIdStartString",
|
||||
BAD_CAST "catalog", prefer);
|
||||
BAD_CAST "catalog", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "uri")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_URI,
|
||||
BAD_CAST "uri", BAD_CAST "name",
|
||||
BAD_CAST "uri", prefer);
|
||||
BAD_CAST "uri", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "rewriteURI")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_URI,
|
||||
BAD_CAST "rewriteURI", BAD_CAST "uriStartString",
|
||||
BAD_CAST "rewritePrefix", prefer);
|
||||
BAD_CAST "rewritePrefix", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "delegateURI")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_URI,
|
||||
BAD_CAST "delegateURI", BAD_CAST "uriStartString",
|
||||
BAD_CAST "catalog", prefer);
|
||||
BAD_CAST "catalog", prefer, cgroup);
|
||||
} else if (xmlStrEqual(cur->name, BAD_CAST "nextCatalog")) {
|
||||
entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_NEXT_CATALOG,
|
||||
BAD_CAST "nextCatalog", NULL,
|
||||
BAD_CAST "catalog", prefer);
|
||||
BAD_CAST "catalog", prefer, cgroup);
|
||||
}
|
||||
if ((entry != NULL) && (parent != NULL)) {
|
||||
entry->parent = parent;
|
||||
@ -1223,6 +1268,13 @@ xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
prev->next = entry;
|
||||
}
|
||||
}
|
||||
if (entry->type == XML_CATA_GROUP) {
|
||||
/*
|
||||
* Recurse to propagate prefer to the subtree
|
||||
* (xml:base handling is automated)
|
||||
*/
|
||||
xmlParseXMLCatalogNodeList(cur->children, prefer, parent, entry);
|
||||
}
|
||||
if (base != NULL)
|
||||
xmlFree(base);
|
||||
if (uri != NULL)
|
||||
@ -1236,6 +1288,7 @@ xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
* @cur: the XML node list of siblings
|
||||
* @prefer: the PUBLIC vs. SYSTEM current preference value
|
||||
* @parent: the parent Catalog entry
|
||||
* @cgroup: the group which includes this list
|
||||
*
|
||||
* Examines a list of XML sibling nodes of a catalog and build
|
||||
* a list of Catalog entry from it adding it to the parent.
|
||||
@ -1243,11 +1296,11 @@ xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
*/
|
||||
static void
|
||||
xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer,
|
||||
xmlCatalogEntryPtr parent) {
|
||||
xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) {
|
||||
while (cur != NULL) {
|
||||
if ((cur->ns != NULL) && (cur->ns->href != NULL) &&
|
||||
(xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
|
||||
xmlParseXMLCatalogNode(cur, prefer, parent);
|
||||
xmlParseXMLCatalogNode(cur, prefer, parent, cgroup);
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
@ -1292,7 +1345,7 @@ xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
|
||||
(xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
|
||||
|
||||
parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
|
||||
(const xmlChar *)filename, NULL, prefer);
|
||||
(const xmlChar *)filename, NULL, prefer, NULL);
|
||||
if (parent == NULL) {
|
||||
xmlFreeDoc(doc);
|
||||
return(NULL);
|
||||
@ -1312,7 +1365,7 @@ xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
|
||||
xmlFree(prop);
|
||||
}
|
||||
cur = cur->children;
|
||||
xmlParseXMLCatalogNodeList(cur, prefer, parent);
|
||||
xmlParseXMLCatalogNodeList(cur, prefer, parent, NULL);
|
||||
} else {
|
||||
xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG,
|
||||
"File %s is not an XML Catalog\n",
|
||||
@ -1477,10 +1530,10 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
|
||||
"Adding element %s to catalog\n", type);
|
||||
if (cur == NULL)
|
||||
catal->children = xmlNewCatalogEntry(typ, orig, replace,
|
||||
NULL, catal->prefer);
|
||||
NULL, catal->prefer, NULL);
|
||||
else
|
||||
cur->next = xmlNewCatalogEntry(typ, orig, replace,
|
||||
NULL, catal->prefer);
|
||||
NULL, catal->prefer, NULL);
|
||||
if (doregister) {
|
||||
cur = xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
|
||||
if (cur != NULL)
|
||||
@ -2398,7 +2451,7 @@ xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
|
||||
xmlCatalogEntryPtr entry;
|
||||
|
||||
entry = xmlNewCatalogEntry(type, name, filename,
|
||||
NULL, XML_CATA_PREFER_NONE);
|
||||
NULL, XML_CATA_PREFER_NONE, NULL);
|
||||
res = xmlHashAddEntry(catal->sgml, name, entry);
|
||||
if (res < 0) {
|
||||
xmlFreeCatalogEntry(entry);
|
||||
@ -2411,7 +2464,7 @@ xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
|
||||
xmlCatalogEntryPtr entry;
|
||||
|
||||
entry = xmlNewCatalogEntry(type, sysid, NULL, NULL,
|
||||
XML_CATA_PREFER_NONE);
|
||||
XML_CATA_PREFER_NONE, NULL);
|
||||
res = xmlHashAddEntry(catal->sgml, sysid, entry);
|
||||
if (res < 0) {
|
||||
xmlFreeCatalogEntry(entry);
|
||||
@ -2628,7 +2681,7 @@ xmlLoadACatalog(const char *filename)
|
||||
return(NULL);
|
||||
}
|
||||
catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
|
||||
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer);
|
||||
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
|
||||
}
|
||||
xmlFree(content);
|
||||
return (catal);
|
||||
@ -2669,7 +2722,7 @@ xmlExpandCatalog(xmlCatalogPtr catal, const char *filename)
|
||||
} else {
|
||||
xmlCatalogEntryPtr tmp, cur;
|
||||
tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
|
||||
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer);
|
||||
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL);
|
||||
|
||||
cur = catal->xml;
|
||||
if (cur == NULL) {
|
||||
@ -2887,7 +2940,7 @@ xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type,
|
||||
xmlCatalogEntryPtr entry;
|
||||
|
||||
entry = xmlNewCatalogEntry(cattype, orig, replace, NULL,
|
||||
XML_CATA_PREFER_NONE);
|
||||
XML_CATA_PREFER_NONE, NULL);
|
||||
if (catal->sgml == NULL)
|
||||
catal->sgml = xmlHashCreate(10);
|
||||
res = xmlHashAddEntry(catal->sgml, orig, entry);
|
||||
@ -3081,7 +3134,7 @@ xmlInitializeCatalog(void) {
|
||||
path = (char *) xmlStrndup((const xmlChar *)paths, cur - paths);
|
||||
if (path != NULL) {
|
||||
*nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
|
||||
NULL, BAD_CAST path, xmlCatalogDefaultPrefer);
|
||||
NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NULL);
|
||||
if (*nextent != NULL)
|
||||
nextent = &((*nextent)->next);
|
||||
xmlFree(path);
|
||||
@ -3328,7 +3381,7 @@ xmlCatalogAdd(const xmlChar *type, const xmlChar *orig, const xmlChar *replace)
|
||||
xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE,
|
||||
xmlCatalogDefaultPrefer);
|
||||
xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
|
||||
orig, NULL, xmlCatalogDefaultPrefer);
|
||||
orig, NULL, xmlCatalogDefaultPrefer, NULL);
|
||||
|
||||
xmlRMutexUnlock(xmlCatalogMutex);
|
||||
return(0);
|
||||
@ -3535,7 +3588,7 @@ xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) {
|
||||
"Adding document catalog %s\n", URL);
|
||||
|
||||
add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL,
|
||||
xmlCatalogDefaultPrefer);
|
||||
xmlCatalogDefaultPrefer, NULL);
|
||||
if (add == NULL)
|
||||
return(catalogs);
|
||||
|
||||
|
5
parser.c
5
parser.c
@ -11078,9 +11078,8 @@ xmlParseInNodeContext(xmlNodePtr node, const char *data, int datalen,
|
||||
*lst = NULL;
|
||||
}
|
||||
|
||||
if ((doc->dict == NULL) && (ctxt->dict != NULL))
|
||||
xmlDictFree(ctxt->dict);
|
||||
ctxt->dict = NULL;
|
||||
if (doc->dict != NULL)
|
||||
ctxt->dict = NULL;
|
||||
xmlFreeParserCtxt(ctxt);
|
||||
|
||||
return(ret);
|
||||
|
@ -307,6 +307,7 @@ static void usershell(void) {
|
||||
* *
|
||||
************************************************************************/
|
||||
static void usage(const char *name) {
|
||||
/* split into 2 printf's to avoid overly long string (gcc warning) */
|
||||
printf("\
|
||||
Usage : %s [options] catalogfile entities...\n\
|
||||
\tParse the catalog file and query it for the entities\n\
|
||||
@ -314,13 +315,14 @@ Usage : %s [options] catalogfile entities...\n\
|
||||
\t--shell : run a shell allowing interactive queries\n\
|
||||
\t--create : create a new catalog\n\
|
||||
\t--add 'type' 'orig' 'replace' : add an XML entry\n\
|
||||
\t--add 'entry' : add an SGML entry\n\
|
||||
\t--add 'entry' : add an SGML entry\n", name);
|
||||
printf("\
|
||||
\t--del 'values' : remove values\n\
|
||||
\t--noout: avoid dumping the result on stdout\n\
|
||||
\t used with --add or --del, it saves the catalog changes\n\
|
||||
\t and with --sgml it automatically updates the super catalog\n\
|
||||
\t--no-super-update: do not update the SGML super catalog\n\
|
||||
\t-v --verbose : provide debug informations\n", name);
|
||||
\t-v --verbose : provide debug informations\n");
|
||||
}
|
||||
int main(int argc, char **argv) {
|
||||
int i;
|
||||
|
@ -209,7 +209,7 @@ xmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len) {
|
||||
if (str1 == NULL) return(-1);
|
||||
if (str2 == NULL) return(1);
|
||||
#ifdef __GNUC__
|
||||
tmp = strncmp(str1, str2, len);
|
||||
tmp = strncmp((const char *)str1, (const char *)str2, len);
|
||||
return tmp;
|
||||
#else
|
||||
do {
|
||||
|
Loading…
x
Reference in New Issue
Block a user