diff -Naurp libxml2-2.7.1/ChangeLog libxml2-2.7.1.oden/ChangeLog --- libxml2-2.7.1/ChangeLog 2008-09-01 16:49:56.000000000 +0200 +++ libxml2-2.7.1.oden/ChangeLog 2009-03-16 12:28:59.000000000 +0100 @@ -1,3 +1,8 @@ +Mon Jan 05 18:28:41 CET 2009 Rob Richards <rrichards@cdatazone.org> + + * include/libxml/parser.h parser.c: add XML_PARSE_OLDSAX parser + option to enable pre 2.7 SAX behavior. + Mon Sep 1 16:49:05 CEST 2008 Daniel Veillard <daniel@veillard.com> * doc/xml.html doc/news.html configure.in python/setup.py NEWS: diff -Naurp libxml2-2.7.1/include/libxml/parser.h libxml2-2.7.1.oden/include/libxml/parser.h --- libxml2-2.7.1/include/libxml/parser.h 2008-08-28 09:46:31.000000000 +0200 +++ libxml2-2.7.1.oden/include/libxml/parser.h 2009-03-16 12:28:31.000000000 +0100 @@ -1096,7 +1096,8 @@ typedef enum { crash if you try to modify the tree) */ XML_PARSE_OLD10 = 1<<17,/* parse using XML-1.0 before update 5 */ XML_PARSE_NOBASEFIX = 1<<18,/* do not fixup XINCLUDE xml:base uris */ - XML_PARSE_HUGE = 1<<19 /* relax any hardcoded limit from the parser */ + XML_PARSE_HUGE = 1<<19, /* relax any hardcoded limit from the parser */ + XML_PARSE_OLDSAX = 1<<20 /* parse using SAX2 interface from before 2.7.0 */ } xmlParserOption; XMLPUBFUN void XMLCALL diff -Naurp libxml2-2.7.1/parser.c libxml2-2.7.1.oden/parser.c --- libxml2-2.7.1/parser.c 2009-03-16 12:33:41.000000000 +0100 +++ libxml2-2.7.1.oden/parser.c 2009-03-16 12:32:43.000000000 +0100 @@ -7041,9 +7041,11 @@ xmlParseEntityRef(xmlParserCtxtPtr ctxt) /* * Predefined entites override any extra definition */ - ent = xmlGetPredefinedEntity(name); - if (ent != NULL) - return(ent); + if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { + ent = xmlGetPredefinedEntity(name); + if (ent != NULL) + return(ent); + } /* * Increate the number of entity references parsed @@ -7057,6 +7059,9 @@ xmlParseEntityRef(xmlParserCtxtPtr ctxt) if (ctxt->sax != NULL) { if (ctxt->sax->getEntity != NULL) ent = ctxt->sax->getEntity(ctxt->userData, name); + if ((ctxt->wellFormed == 1 ) && (ent == NULL) && + (ctxt->options & XML_PARSE_OLDSAX)) + ent = xmlGetPredefinedEntity(name); if ((ctxt->wellFormed == 1 ) && (ent == NULL) && (ctxt->userData==ctxt)) { ent = xmlSAX2GetEntity(ctxt, name); @@ -7129,6 +7134,7 @@ xmlParseEntityRef(xmlParserCtxtPtr ctxt) */ else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && (ent != NULL) && (ent->content != NULL) && + (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && (xmlStrchr(ent->content, '<'))) { xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, "'<' in entity '%s' is not allowed in attributes values\n", name); @@ -7224,10 +7230,13 @@ xmlParseStringEntityRef(xmlParserCtxtPtr /* * Predefined entites override any extra definition */ - ent = xmlGetPredefinedEntity(name); - if (ent != NULL) { - *str = ptr; - return(ent); + if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { + ent = xmlGetPredefinedEntity(name); + if (ent != NULL) { + xmlFree(name); + *str = ptr; + return(ent); + } } /* @@ -7242,6 +7251,8 @@ xmlParseStringEntityRef(xmlParserCtxtPtr if (ctxt->sax != NULL) { if (ctxt->sax->getEntity != NULL) ent = ctxt->sax->getEntity(ctxt->userData, name); + if ((ent == NULL) && (ctxt->options & XML_PARSE_OLDSAX)) + ent = xmlGetPredefinedEntity(name); if ((ent == NULL) && (ctxt->userData==ctxt)) { ent = xmlSAX2GetEntity(ctxt, name); } @@ -7310,6 +7321,7 @@ xmlParseStringEntityRef(xmlParserCtxtPtr */ else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && (ent != NULL) && (ent->content != NULL) && + (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && (xmlStrchr(ent->content, '<'))) { xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, "'<' in entity '%s' is not allowed in attributes values\n", @@ -14203,6 +14215,10 @@ xmlCtxtUseOptionsInternal(xmlParserCtxtP ctxt->options |= XML_PARSE_HUGE; options -= XML_PARSE_HUGE; } + if (options & XML_PARSE_OLDSAX) { + ctxt->options |= XML_PARSE_OLDSAX; + options -= XML_PARSE_OLDSAX; + } ctxt->linenumbers = 1; return (options); }