diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2001-08-23 15:31:19 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2001-08-23 15:31:19 +0000 |
commit | 9f7b84bb07ab4f748ba981a38c7566cd48af60fa (patch) | |
tree | 52123a3279eac76660a475f783cb10dabcdfb0b6 /catalog.c | |
parent | bc2ddbe7c3cc496c843667b157a68d4fee4def90 (diff) | |
download | libxml2-9f7b84bb07ab4f748ba981a38c7566cd48af60fa.tar.gz |
preparing for a 2.4.3 release even if it may not be ready yet redirected
* Makefile.am configure.in include/libxml/xmlwin32version.h:
preparing for a 2.4.3 release even if it may not be ready yet
* catalog.c parser.c xmlIO.c include/libxml/catalog.h: redirected
all file parsing lookup to go through the entity resolver, add
to add an API to bypass it (needed to load catalogs themselves),
some cleanup on the catalog code too.
* nanoftp.c: small cleanup
* doc/catalog.html: small update
Daniel
Diffstat (limited to 'catalog.c')
-rw-r--r-- | catalog.c | 83 |
1 files changed, 78 insertions, 5 deletions
@@ -58,6 +58,7 @@ typedef enum { XML_CATA_NONE = 0, XML_CATA_CATALOG, + XML_CATA_BROKEN_CATALOG, XML_CATA_NEXT_CATALOG, XML_CATA_PUBLIC, XML_CATA_SYSTEM, @@ -311,6 +312,71 @@ xmlCatalogUnWrapURN(const xmlChar *urn) { return(xmlStrdup(result)); } +/** + * xmlParseCatalogFile: + * @filename: the filename + * + * parse an XML file and build a tree. It's like xmlParseFile() + * except it bypass all catalog lookups. + * + * Returns the resulting document tree or NULL in case of error + */ + +xmlDocPtr +xmlParseCatalogFile(const char *filename) { + xmlDocPtr ret; + xmlParserCtxtPtr ctxt; + char *directory = NULL; + xmlParserInputPtr inputStream; + xmlParserInputBufferPtr buf; + + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL) { + if (xmlDefaultSAXHandler.error != NULL) { + xmlDefaultSAXHandler.error(NULL, "out of memory\n"); + } + return(NULL); + } + + buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); + if (buf == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputStream = xmlNewInputStream(ctxt); + if (inputStream == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputStream->filename = xmlMemStrdup(filename); + inputStream->buf = buf; + inputStream->base = inputStream->buf->buffer->content; + inputStream->cur = inputStream->buf->buffer->content; + inputStream->end = + &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; + + inputPush(ctxt, inputStream); + if ((ctxt->directory == NULL) && (directory == NULL)) + directory = xmlParserGetDirectory(filename); + if ((ctxt->directory == NULL) && (directory != NULL)) + ctxt->directory = directory; + + xmlParseDocument(ctxt); + + if (ctxt->wellFormed) + ret = ctxt->myDoc; + else { + ret = NULL; + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + } + xmlFreeParserCtxt(ctxt); + + return(ret); +} + /************************************************************************ * * * The XML Catalog parser * @@ -585,7 +651,7 @@ xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) { if (filename == NULL) return(NULL); - doc = xmlParseFile((const char *) filename); + doc = xmlParseCatalogFile((const char *) filename); if (doc == NULL) { if (xmlDebugCatalogs) xmlGenericError(xmlGenericErrorContext, @@ -659,8 +725,10 @@ xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) { * Fetch and parse */ children = xmlParseXMLCatalogFile(catal->prefer, catal->value); - if (children == NULL) + if (children == NULL) { + catal->type = XML_CATA_BROKEN_CATALOG; return(-1); + } /* * Where a real test and set would be needed ! @@ -718,12 +786,13 @@ 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_BROKEN_CATALOG: case XML_CATA_CATALOG: if (cur == catal) { cur = cur->children; continue; } - break; + break; case XML_CATA_NEXT_CATALOG: node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL); xmlSetProp(node, BAD_CAST "catalog", cur->value); @@ -832,7 +901,9 @@ xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type, xmlCatalogEntryPtr cur; xmlCatalogEntryType typ; - if ((catal == NULL) || (catal->type != XML_CATA_CATALOG)) + if ((catal == NULL) || + ((catal->type != XML_CATA_CATALOG) && + (catal->type != XML_CATA_BROKEN_CATALOG))) return(-1); typ = xmlGetXMLCatalogEntryType(type); if (typ == XML_CATA_NONE) { @@ -888,7 +959,9 @@ xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) { xmlCatalogEntryPtr cur, prev, tmp; int ret = 0; - if ((catal == NULL) || (catal->type != XML_CATA_CATALOG)) + if ((catal == NULL) || + ((catal->type != XML_CATA_CATALOG) && + (catal->type != XML_CATA_BROKEN_CATALOG))) return(-1); if (value == NULL) return(-1); |