summaryrefslogtreecommitdiff
path: root/xmlreader.c
diff options
context:
space:
mode:
Diffstat (limited to 'xmlreader.c')
-rw-r--r--xmlreader.c284
1 files changed, 244 insertions, 40 deletions
diff --git a/xmlreader.c b/xmlreader.c
index 14843eb..7efa273 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -348,7 +348,8 @@ xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) {
(cur->type == XML_XINCLUDE_END)) &&
(cur->properties != NULL))
xmlTextReaderFreePropList(reader, cur->properties);
- if ((cur->type != XML_ELEMENT_NODE) &&
+ if ((cur->content != (xmlChar *) &(cur->properties)) &&
+ (cur->type != XML_ELEMENT_NODE) &&
(cur->type != XML_XINCLUDE_START) &&
(cur->type != XML_XINCLUDE_END) &&
(cur->type != XML_ENTITY_REF_NODE)) {
@@ -422,7 +423,8 @@ xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) {
(cur->type == XML_XINCLUDE_END)) &&
(cur->properties != NULL))
xmlTextReaderFreePropList(reader, cur->properties);
- if ((cur->type != XML_ELEMENT_NODE) &&
+ if ((cur->content != (xmlChar *) &(cur->properties)) &&
+ (cur->type != XML_ELEMENT_NODE) &&
(cur->type != XML_XINCLUDE_START) &&
(cur->type != XML_XINCLUDE_END) &&
(cur->type != XML_ENTITY_REF_NODE)) {
@@ -598,14 +600,14 @@ xmlTextReaderEntPop(xmlTextReaderPtr reader)
xmlNodePtr ret;
if (reader->entNr <= 0)
- return (0);
+ return (NULL);
reader->entNr--;
if (reader->entNr > 0)
reader->ent = reader->entTab[reader->entNr - 1];
else
reader->ent = NULL;
ret = reader->entTab[reader->entNr];
- reader->entTab[reader->entNr] = 0;
+ reader->entTab[reader->entNr] = NULL;
return (ret);
}
@@ -2172,7 +2174,7 @@ xmlFreeTextReader(xmlTextReaderPtr reader) {
if ((reader->ctxt->vctxt.vstateTab != NULL) &&
(reader->ctxt->vctxt.vstateMax > 0)){
xmlFree(reader->ctxt->vctxt.vstateTab);
- reader->ctxt->vctxt.vstateTab = 0;
+ reader->ctxt->vctxt.vstateTab = NULL;
reader->ctxt->vctxt.vstateMax = 0;
}
if (reader->allocs & XML_TEXTREADER_CTXT)
@@ -2309,15 +2311,42 @@ xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) {
return(NULL);
localname = xmlSplitQName2(name, &prefix);
- if (localname == NULL)
- return(xmlGetProp(reader->node, name));
-
- ns = xmlSearchNs(reader->node->doc, reader->node, prefix);
- if (ns != NULL)
- ret = xmlGetNsProp(reader->node, localname, ns->href);
+ if (localname == NULL) {
+ /*
+ * Namespace default decl
+ */
+ if (xmlStrEqual(name, BAD_CAST "xmlns")) {
+ ns = reader->node->nsDef;
+ while (ns != NULL) {
+ if (ns->prefix == NULL) {
+ return(xmlStrdup(ns->href));
+ }
+ ns = ns->next;
+ }
+ return NULL;
+ }
+ return(xmlGetNoNsProp(reader->node, name));
+ }
- if (localname != NULL)
- xmlFree(localname);
+ /*
+ * Namespace default decl
+ */
+ if (xmlStrEqual(prefix, BAD_CAST "xmlns")) {
+ ns = reader->node->nsDef;
+ while (ns != NULL) {
+ if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) {
+ ret = xmlStrdup(ns->href);
+ break;
+ }
+ ns = ns->next;
+ }
+ } else {
+ ns = xmlSearchNs(reader->node->doc, reader->node, prefix);
+ if (ns != NULL)
+ ret = xmlGetNsProp(reader->node, localname, ns->href);
+ }
+
+ xmlFree(localname);
if (prefix != NULL)
xmlFree(prefix);
return(ret);
@@ -2338,6 +2367,9 @@ xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) {
xmlChar *
xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName,
const xmlChar *namespaceURI) {
+ xmlChar *prefix = NULL;
+ xmlNsPtr ns;
+
if ((reader == NULL) || (localName == NULL))
return(NULL);
if (reader->node == NULL)
@@ -2349,6 +2381,21 @@ xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName,
if (reader->node->type != XML_ELEMENT_NODE)
return(NULL);
+ if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) {
+ if (! xmlStrEqual(localName, BAD_CAST "xmlns")) {
+ prefix = BAD_CAST localName;
+ }
+ ns = reader->node->nsDef;
+ while (ns != NULL) {
+ if ((prefix == NULL && ns->prefix == NULL) ||
+ ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) {
+ return xmlStrdup(ns->href);
+ }
+ ns = ns->next;
+ }
+ return NULL;
+ }
+
return(xmlGetNsProp(reader->node, localName, namespaceURI));
}
@@ -2599,6 +2646,8 @@ xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,
const xmlChar *localName, const xmlChar *namespaceURI) {
xmlAttrPtr prop;
xmlNodePtr node;
+ xmlNsPtr ns;
+ xmlChar *prefix = NULL;
if ((reader == NULL) || (localName == NULL) || (namespaceURI == NULL))
return(-1);
@@ -2608,10 +2657,22 @@ xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,
return(0);
node = reader->node;
- /*
- * A priori reading http://www.w3.org/TR/REC-xml-names/ there is no
- * namespace name associated to "xmlns"
- */
+ if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) {
+ if (! xmlStrEqual(localName, BAD_CAST "xmlns")) {
+ prefix = BAD_CAST localName;
+ }
+ ns = reader->node->nsDef;
+ while (ns != NULL) {
+ if ((prefix == NULL && ns->prefix == NULL) ||
+ ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) {
+ reader->curnode = (xmlNodePtr) ns;
+ return(1);
+ }
+ ns = ns->next;
+ }
+ return(0);
+ }
+
prop = node->properties;
while (prop != NULL) {
/*
@@ -2751,7 +2812,9 @@ xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader) {
reader->faketext = xmlNewDocText(reader->node->doc,
ns->href);
} else {
- if (reader->faketext->content != NULL)
+ if ((reader->faketext->content != NULL) &&
+ (reader->faketext->content !=
+ (xmlChar *) &(reader->faketext->properties)))
xmlFree(reader->faketext->content);
reader->faketext->content = xmlStrdup(ns->href);
}
@@ -3880,6 +3943,66 @@ xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) {
}
#ifdef LIBXML_SCHEMAS_ENABLED
+
+static char *
+xmlTextReaderBuildMessage(const char *msg, va_list ap);
+
+static void XMLCDECL
+xmlTextReaderValidityError(void *ctxt, const char *msg, ...);
+
+static void XMLCDECL
+xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...);
+
+static void XMLCDECL xmlTextReaderValidityErrorRelay(void *ctx, const char *msg, ...)
+{
+ xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx;
+ char * str;
+ va_list ap;
+
+ va_start(ap,msg);
+ str = xmlTextReaderBuildMessage(msg,ap);
+ if (!reader->errorFunc) {
+ xmlTextReaderValidityError(ctx, "%s", str);
+ } else {
+ reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY_VALIDITY_ERROR, NULL /* locator */);
+ }
+ if (str != NULL)
+ xmlFree(str);
+ va_end(ap);
+}
+
+static void XMLCDECL xmlTextReaderValidityWarningRelay(void *ctx, const char *msg, ...)
+{
+ xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx;
+ char * str;
+ va_list ap;
+
+ va_start(ap,msg);
+ str = xmlTextReaderBuildMessage(msg,ap);
+ if (!reader->errorFunc) {
+ xmlTextReaderValidityWarning(ctx, "%s", str);
+ } else {
+ reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY_VALIDITY_WARNING, NULL /* locator */);
+ }
+ if (str != NULL)
+ xmlFree(str);
+ va_end(ap);
+}
+
+static void
+xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error);
+
+static void xmlTextReaderValidityStructuredRelay(void * userData, xmlErrorPtr error)
+{
+ xmlTextReaderPtr reader = (xmlTextReaderPtr) userData;
+
+ if (reader->sErrorFunc) {
+ reader->sErrorFunc(reader->errorFuncArg, error);
+ } else {
+ xmlTextReaderStructuredError(reader, error);
+ }
+}
+
/**
* xmlTextReaderRelaxNGSetSchema:
* @reader: the xmlTextReaderPtr used
@@ -3924,9 +4047,14 @@ xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) {
return(-1);
if (reader->errorFunc != NULL) {
xmlRelaxNGSetValidErrors(reader->rngValidCtxt,
- (xmlRelaxNGValidityErrorFunc)reader->errorFunc,
- (xmlRelaxNGValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ }
+ if (reader->sErrorFunc != NULL) {
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
}
reader->rngValidErrors = 0;
reader->rngFullNode = NULL;
@@ -3999,9 +4127,14 @@ xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) {
}
if (reader->errorFunc != NULL) {
xmlSchemaSetValidErrors(reader->xsdValidCtxt,
- (xmlSchemaValidityErrorFunc)reader->errorFunc,
- (xmlSchemaValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ }
+ if (reader->sErrorFunc != NULL) {
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
}
reader->xsdValidErrors = 0;
reader->validate = XML_TEXTREADER_VALIDATE_XSD;
@@ -4051,9 +4184,14 @@ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) {
ctxt = xmlRelaxNGNewParserCtxt(rng);
if (reader->errorFunc != NULL) {
xmlRelaxNGSetParserErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) reader->errorFunc,
- (xmlRelaxNGValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ }
+ if (reader->sErrorFunc != NULL) {
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
}
reader->rngSchemas = xmlRelaxNGParse(ctxt);
xmlRelaxNGFreeParserCtxt(ctxt);
@@ -4067,9 +4205,14 @@ xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) {
}
if (reader->errorFunc != NULL) {
xmlRelaxNGSetValidErrors(reader->rngValidCtxt,
- (xmlRelaxNGValidityErrorFunc)reader->errorFunc,
- (xmlRelaxNGValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ }
+ if (reader->sErrorFunc != NULL) {
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
}
reader->rngValidErrors = 0;
reader->rngFullNode = NULL;
@@ -4129,9 +4272,9 @@ xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) {
ctxt = xmlSchemaNewParserCtxt(xsd);
if (reader->errorFunc != NULL) {
xmlSchemaSetParserErrors(ctxt,
- (xmlSchemaValidityErrorFunc) reader->errorFunc,
- (xmlSchemaValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
}
reader->xsdSchemas = xmlSchemaParse(ctxt);
xmlSchemaFreeParserCtxt(ctxt);
@@ -4155,9 +4298,14 @@ xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) {
}
if (reader->errorFunc != NULL) {
xmlSchemaSetValidErrors(reader->xsdValidCtxt,
- (xmlSchemaValidityErrorFunc)reader->errorFunc,
- (xmlSchemaValidityWarningFunc) reader->errorFunc,
- reader->errorFuncArg);
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ }
+ if (reader->sErrorFunc != NULL) {
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
}
reader->xsdValidErrors = 0;
reader->validate = XML_TEXTREADER_VALIDATE_XSD;
@@ -4385,7 +4533,7 @@ xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) {
}
}
-static void
+static void XMLCDECL
xmlTextReaderError(void *ctxt, const char *msg, ...) {
va_list ap;
@@ -4397,7 +4545,7 @@ xmlTextReaderError(void *ctxt, const char *msg, ...) {
}
-static void
+static void XMLCDECL
xmlTextReaderWarning(void *ctxt, const char *msg, ...) {
va_list ap;
@@ -4408,7 +4556,7 @@ xmlTextReaderWarning(void *ctxt, const char *msg, ...) {
va_end(ap);
}
-static void
+static void XMLCDECL
xmlTextReaderValidityError(void *ctxt, const char *msg, ...) {
va_list ap;
int len = xmlStrlen((const xmlChar *) msg);
@@ -4426,7 +4574,7 @@ xmlTextReaderValidityError(void *ctxt, const char *msg, ...) {
}
}
-static void
+static void XMLCDECL
xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) {
va_list ap;
int len = xmlStrlen((const xmlChar *) msg);
@@ -4467,6 +4615,22 @@ xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,
reader->errorFunc = f;
reader->sErrorFunc = NULL;
reader->errorFuncArg = arg;
+#ifdef LIBXML_SCHEMAS_ENABLED
+ if (reader->rngValidCtxt) {
+ xmlRelaxNGSetValidErrors(reader->rngValidCtxt,
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader);
+ }
+ if (reader->xsdValidCtxt) {
+ xmlSchemaSetValidErrors(reader->xsdValidCtxt,
+ xmlTextReaderValidityErrorRelay,
+ xmlTextReaderValidityWarningRelay,
+ reader);
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader);
+ }
+#endif
}
else {
/* restore defaults */
@@ -4477,6 +4641,16 @@ xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,
reader->errorFunc = NULL;
reader->sErrorFunc = NULL;
reader->errorFuncArg = NULL;
+#ifdef LIBXML_SCHEMAS_ENABLED
+ if (reader->rngValidCtxt) {
+ xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader);
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader);
+ }
+ if (reader->xsdValidCtxt) {
+ xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader);
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader);
+ }
+#endif
}
}
@@ -4503,6 +4677,20 @@ xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,
reader->sErrorFunc = f;
reader->errorFunc = NULL;
reader->errorFuncArg = arg;
+#ifdef LIBXML_SCHEMAS_ENABLED
+ if (reader->rngValidCtxt) {
+ xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader);
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
+ }
+ if (reader->xsdValidCtxt) {
+ xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader);
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
+ xmlTextReaderValidityStructuredRelay,
+ reader);
+ }
+#endif
}
else {
/* restore defaults */
@@ -4514,6 +4702,16 @@ xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,
reader->errorFunc = NULL;
reader->sErrorFunc = NULL;
reader->errorFuncArg = NULL;
+#ifdef LIBXML_SCHEMAS_ENABLED
+ if (reader->rngValidCtxt) {
+ xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, reader);
+ xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, reader);
+ }
+ if (reader->xsdValidCtxt) {
+ xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, reader);
+ xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, reader);
+ }
+#endif
}
}
@@ -4582,6 +4780,12 @@ xmlTextReaderSetup(xmlTextReaderPtr reader,
if (reader == NULL)
return (-1);
+ /*
+ * we force the generation of compact text nodes on the reader
+ * since usr applications should never modify the tree
+ */
+ options |= XML_PARSE_COMPACT;
+
reader->doc = NULL;
reader->entNr = 0;
reader->parserFlags = options;