aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2002-06-11 10:08:16 +0000
committerDaniel Veillard <veillard@src.gnome.org>2002-06-11 10:08:16 +0000
commitf5582f156c82962e669f68c8cd6b8ea4d3277086 (patch)
tree96c16c404b6cb90dab1f7794ae12abaf4bf78e4d
parent38d80e25adef864df9187dc5d4d056cba3996565 (diff)
downloadandroid_external_libxml2-f5582f156c82962e669f68c8cd6b8ea4d3277086.tar.gz
android_external_libxml2-f5582f156c82962e669f68c8cd6b8ea4d3277086.tar.bz2
android_external_libxml2-f5582f156c82962e669f68c8cd6b8ea4d3277086.zip
applied a couple of patches from Peter Jacobi to start to get rid of
* parser.c: applied a couple of patches from Peter Jacobi to start to get rid of ctxt->token, with a possible significant speed improvement to be gained once done. Better compliance with PE references constructs in DTDs too. * test/valid/t[0-9]* result/valid/t[0-9]*: added a set of tests from Peter too Daniel
-rw-r--r--ChangeLog9
-rw-r--r--parser.c79
-rw-r--r--result/valid/t4.dtd0
-rw-r--r--result/valid/t4.dtd.err6
-rw-r--r--result/valid/t4.xml3
-rw-r--r--result/valid/t4.xml.err0
-rw-r--r--result/valid/t4a.dtd0
-rw-r--r--result/valid/t4a.dtd.err6
-rw-r--r--result/valid/t4a.xml3
-rw-r--r--result/valid/t4a.xml.err0
-rw-r--r--result/valid/t6.dtd0
-rw-r--r--result/valid/t6.dtd.err6
-rw-r--r--result/valid/t6.xml3
-rw-r--r--result/valid/t6.xml.err0
-rw-r--r--result/valid/t8.xml0
-rw-r--r--result/valid/t8.xml.err18
-rw-r--r--result/valid/t8a.xml0
-rw-r--r--result/valid/t8a.xml.err18
-rw-r--r--result/valid/t9.xml10
-rw-r--r--result/valid/t9.xml.err0
-rw-r--r--result/valid/t9a.xml10
-rw-r--r--result/valid/t9a.xml.err0
-rw-r--r--test/valid/t4.dtd4
-rw-r--r--test/valid/t4.xml3
-rw-r--r--test/valid/t4a.dtd5
-rw-r--r--test/valid/t4a.xml3
-rw-r--r--test/valid/t6.dtd5
-rw-r--r--test/valid/t6.xml3
-rw-r--r--test/valid/t8.xml8
-rw-r--r--test/valid/t8a.xml8
-rw-r--r--test/valid/t9.xml8
-rw-r--r--test/valid/t9a.xml8
32 files changed, 215 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index e1b802f7..fe516b07 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Jun 11 12:07:04 CEST 2002 Daniel Veillard <daniel@veillard.com>
+
+ * parser.c: applied a couple of patches from Peter Jacobi to start
+ to get rid of ctxt->token, with a possible significant speed
+ improvement to be gained once done. Better compliance with PE
+ references constructs in DTDs too.
+ * test/valid/t[0-9]* result/valid/t[0-9]*: added a set of tests
+ from Peter too
+
Tue Jun 11 09:25:12 CEST 2002 Daniel Veillard <daniel@veillard.com>
* parser.c: Babak Vahedipour-Kunze reported that openTag in
diff --git a/parser.c b/parser.c
index 745bd897..f5827e05 100644
--- a/parser.c
+++ b/parser.c
@@ -665,6 +665,58 @@ xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) {
}
/**
+ * xmlNewBlanksWrapperInputStream:
+ * @ctxt: an XML parser context
+ * @entity: an Entity pointer
+ *
+ * Create a new input stream for wrapping
+ * blanks around a PEReference
+ *
+ * Returns the new input stream or NULL
+ */
+
+static void deallocblankswrapper (xmlChar *str) {xmlFree(str);}
+
+xmlParserInputPtr
+xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
+ xmlParserInputPtr input;
+ xmlChar *buffer;
+ size_t length;
+ if (entity == NULL) {
+ ctxt->errNo = XML_ERR_INTERNAL_ERROR;
+ if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+ ctxt->sax->error(ctxt->userData,
+ "internal: xmlNewBlanksWrapperInputStream entity = NULL\n");
+ ctxt->errNo = XML_ERR_INTERNAL_ERROR;
+ return(NULL);
+ }
+ if (xmlParserDebugEntities)
+ xmlGenericError(xmlGenericErrorContext,
+ "new blanks wrapper for entity: %s\n", entity->name);
+ input = xmlNewInputStream(ctxt);
+ if (input == NULL) {
+ return(NULL);
+ }
+ length = xmlStrlen(entity->name) + 5;
+ buffer = xmlMalloc(length);
+ if (buffer == NULL) {
+ return(NULL);
+ }
+ buffer [0] = ' ';
+ buffer [1] = '%';
+ buffer [length-3] = ';';
+ buffer [length-2] = ' ';
+ buffer [length-1] = 0;
+ memcpy(buffer + 2, entity->name, length - 5);
+ input->free = deallocblankswrapper;
+ input->base = buffer;
+ input->cur = buffer;
+ input->length = length;
+ input->end = &buffer[length];
+ return(input);
+}
+
+/**
* xmlParserHandlePEReference:
* @ctxt: the parser context
*
@@ -765,6 +817,8 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
*/
if ((ctxt->external == 0) && (ctxt->inputNr == 1))
return;
+ if (IS_BLANK(NXT(1)) || NXT(1) == 0)
+ return;
break;
case XML_PARSER_IGNORE:
return;
@@ -822,6 +876,9 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
"PEReference: %%%s; not found\n", name);
ctxt->valid = 0;
}
+ } else if (ctxt->input->free != deallocblankswrapper) {
+ input = xmlNewBlanksWrapperInputStream(ctxt, entity);
+ xmlPushInput(ctxt, input);
} else {
if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) ||
(entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) {
@@ -857,8 +914,6 @@ xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) {
(NXT(4) == 'l') && (IS_BLANK(NXT(5)))) {
xmlParseTextDecl(ctxt);
}
- if (ctxt->token == 0)
- ctxt->token = ' ';
} else {
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
@@ -3421,6 +3476,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
xmlChar *ndata = NULL;
int isParameter = 0;
xmlChar *orig = NULL;
+ int skipped;
GROW;
if ((RAW == '<') && (NXT(1) == '!') &&
@@ -3428,10 +3484,10 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
(NXT(4) == 'T') && (NXT(5) == 'I') &&
(NXT(6) == 'T') && (NXT(7) == 'Y')) {
xmlParserInputPtr input = ctxt->input;
- ctxt->instate = XML_PARSER_ENTITY_DECL;
SHRINK;
SKIP(8);
- if (!IS_BLANK(CUR)) {
+ skipped = SKIP_BLANKS;
+ if (skipped == 0) {
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
@@ -3439,11 +3495,11 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->wellFormed = 0;
ctxt->disableSAX = 1;
}
- SKIP_BLANKS;
if (RAW == '%') {
NEXT;
- if (!IS_BLANK(CUR)) {
+ skipped = SKIP_BLANKS;
+ if (skipped == 0) {
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
@@ -3451,7 +3507,6 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->wellFormed = 0;
ctxt->disableSAX = 1;
}
- SKIP_BLANKS;
isParameter = 1;
}
@@ -3464,7 +3519,8 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->disableSAX = 1;
return;
}
- if (!IS_BLANK(CUR)) {
+ skipped = SKIP_BLANKS;
+ if (skipped == 0) {
ctxt->errNo = XML_ERR_SPACE_REQUIRED;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
@@ -3472,8 +3528,8 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
ctxt->wellFormed = 0;
ctxt->disableSAX = 1;
}
- SKIP_BLANKS;
+ ctxt->instate = XML_PARSER_ENTITY_DECL;
/*
* handle the various case of definitions...
*/
@@ -6037,6 +6093,9 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) {
if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL))
ctxt->sax->warning(ctxt->userData,
"Internal: %%%s; is not a parameter entity\n", name);
+ } else if (ctxt->input->free != deallocblankswrapper) {
+ input = xmlNewBlanksWrapperInputStream(ctxt, entity);
+ xmlPushInput(ctxt, input);
} else {
/*
* TODO !!!
@@ -6060,8 +6119,6 @@ xmlParsePEReference(xmlParserCtxtPtr ctxt) {
return;
}
}
- if (ctxt->token == 0)
- ctxt->token = ' ';
}
}
ctxt->hasPErefs = 1;
diff --git a/result/valid/t4.dtd b/result/valid/t4.dtd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t4.dtd
diff --git a/result/valid/t4.dtd.err b/result/valid/t4.dtd.err
new file mode 100644
index 00000000..bd98d328
--- /dev/null
+++ b/result/valid/t4.dtd.err
@@ -0,0 +1,6 @@
+./test/valid/t4.dtd:1: error: xmlParseStartTag: invalid element name
+<!ENTITY % percent "&#x25;">
+^
+./test/valid/t4.dtd:1: error: Extra content at the end of the document
+<!ENTITY % percent "&#x25;">
+^
diff --git a/result/valid/t4.xml b/result/valid/t4.xml
new file mode 100644
index 00000000..c198f76c
--- /dev/null
+++ b/result/valid/t4.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE root SYSTEM "t4.dtd">
+<root>&abc;</root>
diff --git a/result/valid/t4.xml.err b/result/valid/t4.xml.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t4.xml.err
diff --git a/result/valid/t4a.dtd b/result/valid/t4a.dtd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t4a.dtd
diff --git a/result/valid/t4a.dtd.err b/result/valid/t4a.dtd.err
new file mode 100644
index 00000000..5d2a8d86
--- /dev/null
+++ b/result/valid/t4a.dtd.err
@@ -0,0 +1,6 @@
+./test/valid/t4a.dtd:1: error: xmlParseStartTag: invalid element name
+<!ENTITY % percent "&#x25;">
+^
+./test/valid/t4a.dtd:1: error: Extra content at the end of the document
+<!ENTITY % percent "&#x25;">
+^
diff --git a/result/valid/t4a.xml b/result/valid/t4a.xml
new file mode 100644
index 00000000..37e80f7e
--- /dev/null
+++ b/result/valid/t4a.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE root SYSTEM "t4a.dtd">
+<root>&abc;</root>
diff --git a/result/valid/t4a.xml.err b/result/valid/t4a.xml.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t4a.xml.err
diff --git a/result/valid/t6.dtd b/result/valid/t6.dtd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t6.dtd
diff --git a/result/valid/t6.dtd.err b/result/valid/t6.dtd.err
new file mode 100644
index 00000000..9eb7dc29
--- /dev/null
+++ b/result/valid/t6.dtd.err
@@ -0,0 +1,6 @@
+./test/valid/t6.dtd:1: error: xmlParseStartTag: invalid element name
+<!ENTITY % xdef "def">
+^
+./test/valid/t6.dtd:1: error: Extra content at the end of the document
+<!ENTITY % xdef "def">
+^
diff --git a/result/valid/t6.xml b/result/valid/t6.xml
new file mode 100644
index 00000000..23f2d25b
--- /dev/null
+++ b/result/valid/t6.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE root SYSTEM "t6.dtd">
+<root>&abc;</root>
diff --git a/result/valid/t6.xml.err b/result/valid/t6.xml.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t6.xml.err
diff --git a/result/valid/t8.xml b/result/valid/t8.xml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t8.xml
diff --git a/result/valid/t8.xml.err b/result/valid/t8.xml.err
new file mode 100644
index 00000000..d3fdf73f
--- /dev/null
+++ b/result/valid/t8.xml.err
@@ -0,0 +1,18 @@
+Entity: line 1: error: xmlParseInternalSubset: error detected in Markup declaration
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
+Entity: line 1: error: DOCTYPE improperly terminated
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
+Entity: line 1: error: Start tag expected, '<' not found
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
diff --git a/result/valid/t8a.xml b/result/valid/t8a.xml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t8a.xml
diff --git a/result/valid/t8a.xml.err b/result/valid/t8a.xml.err
new file mode 100644
index 00000000..d3fdf73f
--- /dev/null
+++ b/result/valid/t8a.xml.err
@@ -0,0 +1,18 @@
+Entity: line 1: error: xmlParseInternalSubset: error detected in Markup declaration
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
+Entity: line 1: error: DOCTYPE improperly terminated
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
+Entity: line 1: error: Start tag expected, '<' not found
+ %defroot;
+ ^
+Entity: line 1:
+&lt;!ELEMENT root (middle) >
+^
diff --git a/result/valid/t9.xml b/result/valid/t9.xml
new file mode 100644
index 00000000..6950b143
--- /dev/null
+++ b/result/valid/t9.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE root [
+<!ENTITY % deftest "&#60;!ELEMENT test (#PCDATA) >">
+<!ENTITY % defmiddle "&#60;!ELEMENT middle (test) >">
+<!ENTITY % defroot "&#60;!ELEMENT root (middle) >">
+<!ELEMENT root (middle)>
+<!ELEMENT middle (test)>
+<!ELEMENT test (#PCDATA)>
+]>
+<root><middle><test>sample</test></middle></root>
diff --git a/result/valid/t9.xml.err b/result/valid/t9.xml.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t9.xml.err
diff --git a/result/valid/t9a.xml b/result/valid/t9a.xml
new file mode 100644
index 00000000..6950b143
--- /dev/null
+++ b/result/valid/t9a.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE root [
+<!ENTITY % deftest "&#60;!ELEMENT test (#PCDATA) >">
+<!ENTITY % defmiddle "&#60;!ELEMENT middle (test) >">
+<!ENTITY % defroot "&#60;!ELEMENT root (middle) >">
+<!ELEMENT root (middle)>
+<!ELEMENT middle (test)>
+<!ELEMENT test (#PCDATA)>
+]>
+<root><middle><test>sample</test></middle></root>
diff --git a/result/valid/t9a.xml.err b/result/valid/t9a.xml.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/result/valid/t9a.xml.err
diff --git a/test/valid/t4.dtd b/test/valid/t4.dtd
new file mode 100644
index 00000000..27292bc8
--- /dev/null
+++ b/test/valid/t4.dtd
@@ -0,0 +1,4 @@
+<!ENTITY % percent "&#x25;">
+<!ENTITY %percent; def "ghi">
+<!ENTITY abc "%def;">
+<!ELEMENT root (#PCDATA)>
diff --git a/test/valid/t4.xml b/test/valid/t4.xml
new file mode 100644
index 00000000..baeb9d01
--- /dev/null
+++ b/test/valid/t4.xml
@@ -0,0 +1,3 @@
+<?xml version='1.0'?>
+<!DOCTYPE root SYSTEM 't4.dtd'>
+<root>&abc;</root>
diff --git a/test/valid/t4a.dtd b/test/valid/t4a.dtd
new file mode 100644
index 00000000..b7cdc7c5
--- /dev/null
+++ b/test/valid/t4a.dtd
@@ -0,0 +1,5 @@
+<!ENTITY % percent "&#x25;">
+<!ENTITY%percent;def "ghi">
+<!ENTITY abc "%def;">
+<!ELEMENT root (#PCDATA)>
+
diff --git a/test/valid/t4a.xml b/test/valid/t4a.xml
new file mode 100644
index 00000000..27fa6038
--- /dev/null
+++ b/test/valid/t4a.xml
@@ -0,0 +1,3 @@
+<?xml version='1.0'?>
+<!DOCTYPE root SYSTEM 't4a.dtd'>
+<root>&abc;</root>
diff --git a/test/valid/t6.dtd b/test/valid/t6.dtd
new file mode 100644
index 00000000..7497c281
--- /dev/null
+++ b/test/valid/t6.dtd
@@ -0,0 +1,5 @@
+<!ENTITY % xdef "def">
+<!ENTITY % %xdef; "ghi">
+<!ENTITY abc "%def;">
+<!ELEMENT root (#PCDATA)>
+
diff --git a/test/valid/t6.xml b/test/valid/t6.xml
new file mode 100644
index 00000000..b9f62ca5
--- /dev/null
+++ b/test/valid/t6.xml
@@ -0,0 +1,3 @@
+<?xml version='1.0'?>
+<!DOCTYPE root SYSTEM 't6.dtd'>
+<root>&abc;</root>
diff --git a/test/valid/t8.xml b/test/valid/t8.xml
new file mode 100644
index 00000000..c7c2b0a7
--- /dev/null
+++ b/test/valid/t8.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE root [
+<!ENTITY % deftest '&lt;!ELEMENT test (#PCDATA) >' >
+<!ENTITY % defmiddle '&lt;!ELEMENT middle (test) >' >
+<!ENTITY % defroot '&lt;!ELEMENT root (middle) >' >
+%defroot; %defmiddle; %deftest;
+]>
+<root><middle><test>sample</test></middle></root>
diff --git a/test/valid/t8a.xml b/test/valid/t8a.xml
new file mode 100644
index 00000000..13470ebe
--- /dev/null
+++ b/test/valid/t8a.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE root [
+<!ENTITY % deftest '&lt;!ELEMENT test (#PCDATA) >' >
+<!ENTITY % defmiddle '&lt;!ELEMENT middle (test) >' >
+<!ENTITY % defroot '&lt;!ELEMENT root (middle) >' >
+%defroot;%defmiddle;%deftest;
+]>
+<root><middle><test>sample</test></middle></root>
diff --git a/test/valid/t9.xml b/test/valid/t9.xml
new file mode 100644
index 00000000..645d35af
--- /dev/null
+++ b/test/valid/t9.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE root [
+<!ENTITY % deftest '&#60;!ELEMENT test (#PCDATA) >' >
+<!ENTITY % defmiddle '&#60;!ELEMENT middle (test) >' >
+<!ENTITY % defroot '&#60;!ELEMENT root (middle) >' >
+%defroot; %defmiddle; %deftest;
+]>
+<root><middle><test>sample</test></middle></root>
diff --git a/test/valid/t9a.xml b/test/valid/t9a.xml
new file mode 100644
index 00000000..23d3c064
--- /dev/null
+++ b/test/valid/t9a.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE root [
+<!ENTITY % deftest '&#60;!ELEMENT test (#PCDATA) >' >
+<!ENTITY % defmiddle '&#60;!ELEMENT middle (test) >' >
+<!ENTITY % defroot '&#60;!ELEMENT root (middle) >' >
+%defroot;%defmiddle;%deftest;
+]>
+<root><middle><test>sample</test></middle></root>