diff options
Diffstat (limited to 'xmlreader.c')
| -rw-r--r-- | xmlreader.c | 284 |
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; |
