aboutsummaryrefslogtreecommitdiffstats
path: root/catalog.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2001-11-06 15:24:37 +0000
committerDaniel Veillard <veillard@src.gnome.org>2001-11-06 15:24:37 +0000
commitc853b32f9d51c8ee842c04ffd73af3e36aa58714 (patch)
tree061adf00a1723f5486eb44e16eb22fa1b62c29bc /catalog.c
parent66870c7182d98c9e068d31437ed16ec72c174edc (diff)
downloadandroid_external_libxml2-c853b32f9d51c8ee842c04ffd73af3e36aa58714.tar.gz
android_external_libxml2-c853b32f9d51c8ee842c04ffd73af3e36aa58714.tar.bz2
android_external_libxml2-c853b32f9d51c8ee842c04ffd73af3e36aa58714.zip
releasing 2.4.9 fixing catalog breakages fixed more problems in catalog
* configure.in include/libxml/xmlwin32version.h: releasing 2.4.9 fixing catalog breakages * Makefile.am catalog.c result/catalogs/catal result/catalogs/mycatalog.* test/catalogs/catal*: fixed more problems in catalog support, added more regression tests for both XML and SGML catalog handling Daniel
Diffstat (limited to 'catalog.c')
-rw-r--r--catalog.c114
1 files changed, 65 insertions, 49 deletions
diff --git a/catalog.c b/catalog.c
index e843d898..e5798eea 100644
--- a/catalog.c
+++ b/catalog.c
@@ -70,6 +70,7 @@ static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename);
************************************************************************/
typedef enum {
+ XML_CATA_REMOVED = -1,
XML_CATA_NONE = 0,
XML_CATA_CATALOG,
XML_CATA_BROKEN_CATALOG,
@@ -105,6 +106,7 @@ struct _xmlCatalogEntry {
xmlCatalogEntryType type;
xmlChar *name;
xmlChar *value;
+ xmlChar *URL; /* The expanded URL using the base */
xmlCatalogPrefer prefer;
int dealloc;
};
@@ -193,7 +195,7 @@ static int xmlCatalogInitialized = 0;
*/
static xmlCatalogEntryPtr
xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
- const xmlChar *value, xmlCatalogPrefer prefer) {
+ const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer) {
xmlCatalogEntryPtr ret;
ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry));
@@ -214,6 +216,12 @@ xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name,
ret->value = xmlStrdup(value);
else
ret->value = NULL;
+ if (URL == NULL)
+ URL = value;
+ if (URL != NULL)
+ ret->URL = xmlStrdup(URL);
+ else
+ ret->URL = NULL;
ret->prefer = prefer;
ret->dealloc = 0;
return(ret);
@@ -255,6 +263,8 @@ xmlFreeCatalogEntry(xmlCatalogEntryPtr ret) {
xmlFree(ret->name);
if (ret->value != NULL)
xmlFree(ret->value);
+ if (ret->URL != NULL)
+ xmlFree(ret->URL);
xmlFree(ret);
}
@@ -470,6 +480,8 @@ BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd");
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) {
@@ -983,7 +995,7 @@ xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type,
xmlGenericError(xmlGenericErrorContext,
"Found %s: '%s'\n", name, URL);
}
- ret = xmlNewCatalogEntry(type, nameValue, URL, prefer);
+ ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer);
} else {
xmlGenericError(xmlGenericErrorContext,
"%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue);
@@ -1157,7 +1169,7 @@ xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) {
(xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) {
parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
- (const xmlChar *)filename, prefer);
+ (const xmlChar *)filename, NULL, prefer);
if (parent == NULL) {
xmlFreeDoc(doc);
return(NULL);
@@ -1202,7 +1214,7 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
if (catal == NULL)
return(-1);
- if (catal->value == NULL)
+ if (catal->URL == NULL)
return(-1);
if (catal->children != NULL)
return(-1);
@@ -1219,11 +1231,11 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
if (xmlCatalogXMLFiles != NULL) {
doc = (xmlCatalogEntryPtr)
- xmlHashLookup(xmlCatalogXMLFiles, catal->value);
+ xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
if (doc != NULL) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "Found %s in file hash\n", catal->value);
+ "Found %s in file hash\n", catal->URL);
if (catal->type == XML_CATA_CATALOG)
catal->children = doc->children;
@@ -1235,7 +1247,7 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
}
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "%s not found in file hash\n", catal->value);
+ "%s not found in file hash\n", catal->URL);
}
/*
@@ -1243,7 +1255,7 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
* use the existing catalog, there is no recusivity allowed at
* that level.
*/
- doc = xmlParseXMLCatalogFile(catal->prefer, catal->value);
+ doc = xmlParseXMLCatalogFile(catal->prefer, catal->URL);
if (doc == NULL) {
catal->type = XML_CATA_BROKEN_CATALOG;
xmlRMutexUnlock(xmlCatalogMutex);
@@ -1262,8 +1274,8 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) {
if (xmlCatalogXMLFiles != NULL) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "%s added to file hash\n", catal->value);
- xmlHashAddEntry(xmlCatalogXMLFiles, catal->value, doc);
+ "%s added to file hash\n", catal->URL);
+ xmlHashAddEntry(xmlCatalogXMLFiles, catal->URL, doc);
}
xmlRMutexUnlock(xmlCatalogMutex);
return(0);
@@ -1292,6 +1304,7 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
const xmlChar *orig, const xmlChar *replace) {
xmlCatalogEntryPtr cur;
xmlCatalogEntryType typ;
+ int doregister = 0;
if ((catal == NULL) ||
((catal->type != XML_CATA_CATALOG) &&
@@ -1300,6 +1313,9 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
if (catal->children == NULL) {
xmlFetchXMLCatalogFile(catal);
}
+ if (catal->children == NULL)
+ doregister = 1;
+
typ = xmlGetXMLCatalogEntryType(type);
if (typ == XML_CATA_NONE) {
if (xmlDebugCatalogs)
@@ -1321,7 +1337,10 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
"Updating element %s to catalog\n", type);
if (cur->value != NULL)
xmlFree(cur->value);
+ if (cur->URL != NULL)
+ xmlFree(cur->URL);
cur->value = xmlStrdup(replace);
+ cur->URL = xmlStrdup(replace);
return(0);
}
if (cur->next == NULL)
@@ -1333,9 +1352,17 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
xmlGenericError(xmlGenericErrorContext,
"Adding element %s to catalog\n", type);
if (cur == NULL)
- catal->children = xmlNewCatalogEntry(typ, orig, replace, catal->prefer);
+ catal->children = xmlNewCatalogEntry(typ, orig, replace,
+ NULL, catal->prefer);
else
- cur->next = xmlNewCatalogEntry(typ, orig, replace, catal->prefer);
+ cur->next = xmlNewCatalogEntry(typ, orig, replace,
+ NULL, catal->prefer);
+ if (doregister) {
+ cur = xmlHashLookup(xmlCatalogXMLFiles, catal->URL);
+ if (cur != NULL)
+ cur->children = catal->children;
+ }
+
return(0);
}
@@ -1351,7 +1378,7 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type,
*/
static int
xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
- xmlCatalogEntryPtr cur, prev, tmp;
+ xmlCatalogEntryPtr cur;
int ret = 0;
if ((catal == NULL) ||
@@ -1368,7 +1395,6 @@ xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
* Scan the children
*/
cur = catal->children;
- prev = NULL;
while (cur != NULL) {
if (((cur->name != NULL) && (xmlStrEqual(value, cur->name))) ||
(xmlStrEqual(value, cur->value))) {
@@ -1380,18 +1406,8 @@ xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) {
xmlGenericError(xmlGenericErrorContext,
"Removing element %s from catalog\n", cur->value);
}
- ret++;
- tmp = cur;
- cur = tmp->next;
- if (prev == NULL) {
- catal->children = cur;
- } else {
- prev->next = cur;
- }
- xmlFreeCatalogEntry(tmp);
- continue;
+ cur->type = XML_CATA_REMOVED;
}
- prev = cur;
cur = cur->next;
}
return(ret);
@@ -1434,7 +1450,7 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Found system match %s\n", cur->name);
- return(xmlStrdup(cur->value));
+ return(xmlStrdup(cur->URL));
}
break;
case XML_CATA_REWRITE_SYSTEM:
@@ -1461,7 +1477,7 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Using rewriting rule %s\n", rewrite->name);
- ret = xmlStrdup(rewrite->value);
+ ret = xmlStrdup(rewrite->URL);
if (ret != NULL)
ret = xmlStrcat(ret, &sysID[lenrewrite]);
return(ret);
@@ -1479,14 +1495,14 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if ((cur->type == XML_CATA_DELEGATE_SYSTEM) &&
(!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) {
for (i = 0;i < nbList;i++)
- if (xmlStrEqual(cur->value, delegates[i]))
+ if (xmlStrEqual(cur->URL, delegates[i]))
break;
if (i < nbList) {
cur = cur->next;
continue;
}
if (nbList < MAX_DELEGATE)
- delegates[nbList++] = cur->value;
+ delegates[nbList++] = cur->URL;
if (cur->children == NULL) {
xmlFetchXMLCatalogFile(cur);
@@ -1494,7 +1510,7 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if (cur->children != NULL) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "Trying system delegate %s\n", cur->value);
+ "Trying system delegate %s\n", cur->URL);
ret = xmlCatalogListXMLResolve(
cur->children, NULL, sysID);
if (ret != NULL)
@@ -1522,7 +1538,7 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Found public match %s\n", cur->name);
- return(xmlStrdup(cur->value));
+ return(xmlStrdup(cur->URL));
}
break;
case XML_CATA_DELEGATE_PUBLIC:
@@ -1554,14 +1570,14 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
(!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) {
for (i = 0;i < nbList;i++)
- if (xmlStrEqual(cur->value, delegates[i]))
+ if (xmlStrEqual(cur->URL, delegates[i]))
break;
if (i < nbList) {
cur = cur->next;
continue;
}
if (nbList < MAX_DELEGATE)
- delegates[nbList++] = cur->value;
+ delegates[nbList++] = cur->URL;
if (cur->children == NULL) {
xmlFetchXMLCatalogFile(cur);
@@ -1569,7 +1585,7 @@ xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID,
if (cur->children != NULL) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "Trying public delegate %s\n", cur->value);
+ "Trying public delegate %s\n", cur->URL);
ret = xmlCatalogListXMLResolve(
cur->children, pubID, NULL);
if (ret != NULL)
@@ -1645,7 +1661,7 @@ xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Found URI match %s\n", cur->name);
- return(xmlStrdup(cur->value));
+ return(xmlStrdup(cur->URL));
}
break;
case XML_CATA_REWRITE_URI:
@@ -1672,7 +1688,7 @@ xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
"Using rewriting rule %s\n", rewrite->name);
- ret = xmlStrdup(rewrite->value);
+ ret = xmlStrdup(rewrite->URL);
if (ret != NULL)
ret = xmlStrcat(ret, &URI[lenrewrite]);
return(ret);
@@ -1690,14 +1706,14 @@ xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
if ((cur->type == XML_CATA_DELEGATE_SYSTEM) &&
(!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) {
for (i = 0;i < nbList;i++)
- if (xmlStrEqual(cur->value, delegates[i]))
+ if (xmlStrEqual(cur->URL, delegates[i]))
break;
if (i < nbList) {
cur = cur->next;
continue;
}
if (nbList < MAX_DELEGATE)
- delegates[nbList++] = cur->value;
+ delegates[nbList++] = cur->URL;
if (cur->children == NULL) {
xmlFetchXMLCatalogFile(cur);
@@ -1705,7 +1721,7 @@ xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) {
if (cur->children != NULL) {
if (xmlDebugCatalogs)
xmlGenericError(xmlGenericErrorContext,
- "Trying URI delegate %s\n", cur->value);
+ "Trying URI delegate %s\n", cur->URL);
ret = xmlCatalogListXMLResolveURI(
cur->children, URI);
if (ret != NULL)
@@ -2209,7 +2225,7 @@ xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
xmlCatalogEntryPtr entry;
entry = xmlNewCatalogEntry(type, name, filename,
- XML_CATA_PREFER_NONE);
+ NULL, XML_CATA_PREFER_NONE);
res = xmlHashAddEntry(catal->sgml, name, entry);
if (res < 0) {
xmlFreeCatalogEntry(entry);
@@ -2221,7 +2237,7 @@ xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value,
if (super) {
xmlCatalogEntryPtr entry;
- entry = xmlNewCatalogEntry(type, sysid, NULL,
+ entry = xmlNewCatalogEntry(type, sysid, NULL, NULL,
XML_CATA_PREFER_NONE);
res = xmlHashAddEntry(catal->sgml, sysid, entry);
if (res < 0) {
@@ -2279,7 +2295,7 @@ xmlCatalogGetSGMLPublic(xmlHashTablePtr catal, const xmlChar *pubID) {
if (entry == NULL)
return(NULL);
if (entry->type == SGML_CATA_PUBLIC)
- return(entry->value);
+ return(entry->URL);
return(NULL);
}
@@ -2303,7 +2319,7 @@ xmlCatalogGetSGMLSystem(xmlHashTablePtr catal, const xmlChar *sysID) {
if (entry == NULL)
return(NULL);
if (entry->type == SGML_CATA_SYSTEM)
- return(entry->value);
+ return(entry->URL);
return(NULL);
}
@@ -2425,7 +2441,7 @@ xmlLoadACatalog(const char *filename)
xmlFree(content);
return(NULL);
}
- catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG,
+ catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer);
}
xmlFree(content);
@@ -2466,7 +2482,7 @@ xmlExpandCatalog(xmlCatalogPtr catal, const char *filename)
xmlFree(content);
} else {
xmlCatalogEntryPtr tmp, cur;
- tmp = xmlNewCatalogEntry(XML_CATA_CATALOG,
+ tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
NULL, BAD_CAST filename, xmlCatalogDefaultPrefer);
cur = catal->xml;
@@ -2679,7 +2695,7 @@ xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type,
if (cattype != XML_CATA_NONE) {
xmlCatalogEntryPtr entry;
- entry = xmlNewCatalogEntry(cattype, orig, replace,
+ entry = xmlNewCatalogEntry(cattype, orig, replace, NULL,
XML_CATA_PREFER_NONE);
if (catal->sgml == NULL)
catal->sgml = xmlHashCreate(10);
@@ -2829,7 +2845,7 @@ xmlInitializeCatalog(void) {
catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer);
if (catal != NULL) {
- catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG,
+ catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL,
NULL, BAD_CAST catalogs, xmlCatalogDefaultPrefer);
xmlDefaultCatalog = catal;
@@ -3068,7 +3084,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, xmlCatalogDefaultPrefer);
+ orig, NULL, xmlCatalogDefaultPrefer);
xmlRMutexUnlock(xmlCatalogMutex);
return(0);
@@ -3273,7 +3289,7 @@ xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) {
xmlGenericError(xmlGenericErrorContext,
"Adding document catalog %s\n", URL);
- add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL,
+ add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL,
xmlCatalogDefaultPrefer);
if (add == NULL)
return(catalogs);