fixed some problems in the previous commit and finished implementing 4.16
* relaxng.c: fixed some problems in the previous commit
and finished implementing 4.16 rules checking
found 373 test schemas: 353 success 20 failures
found 529 test instances: 519 success 6 failures
* result/relaxng/*: updated the results
Daniel
diff --git a/ChangeLog b/ChangeLog
index 32e5f26..f091045 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Feb 21 18:12:19 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+ * relaxng.c: fixed some problems in the previous commit
+ and finished implementing 4.16 rules checking
+ found 373 test schemas: 353 success 20 failures
+ found 529 test instances: 519 success 6 failures
+ * result/relaxng/*: updated the results
+
Fri Feb 21 16:37:39 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: implemented checks from section 7.2
diff --git a/relaxng.c b/relaxng.c
index 1d3a3f6..eeb06b8 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -175,6 +175,8 @@
#define XML_RELAXNG_IN_OOMGROUP (1 << 5)
#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6)
#define XML_RELAXNG_IN_EXTERNALREF (1 << 7)
+#define XML_RELAXNG_IN_ANYEXCEPT (1 << 8)
+#define XML_RELAXNG_IN_NSEXCEPT (1 << 9)
struct _xmlRelaxNGParserCtxt {
void *userData; /* user specific data block */
@@ -4046,8 +4048,6 @@
ret = XML_RELAXNG_CONTENT_EMPTY;
if ((cur->type == XML_RELAXNG_REF) ||
(cur->type == XML_RELAXNG_PARENTREF)) {
- ret = XML_RELAXNG_CONTENT_COMPLEX;
-
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4066,12 +4066,16 @@
"Found forbidden pattern data/except//ref\n");
ctxt->nbErrors++;
}
- if (cur->depth != -4) {
+ if (cur->depth > -4) {
cur->depth = -4;
- xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
- }
- if (ret != XML_RELAXNG_CONTENT_ERROR)
+ ret = xmlRelaxNGCheckRules(ctxt, cur->content,
+ flags, cur->type);
+ cur->depth = ret - 15 ;
+ } else if (cur->depth == -4) {
ret = XML_RELAXNG_CONTENT_COMPLEX;
+ } else {
+ ret = (xmlRelaxNGContentType) cur->depth + 15;
+ }
} else if (cur->type == XML_RELAXNG_ELEMENT) {
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
@@ -4700,34 +4704,17 @@
}
/**
- * xmlRelaxNGCleanupDoc:
+ * xmlRelaxNGCleanupTree:
* @ctxt: a Relax-NG parser context
- * @doc: an xmldocPtr document pointer
+ * @root: an xmlNodePtr subtree
*
- * Cleanup the document from unwanted nodes for parsing, resolve
+ * Cleanup the subtree from unwanted nodes for parsing, resolve
* Include and externalRef lookups.
- *
- * Returns the cleaned up document or NULL in case of error
*/
-static xmlDocPtr
-xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) {
- xmlNodePtr root, cur, delete;
+static void
+xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) {
+ xmlNodePtr cur, delete;
- /*
- * Extract the root
- */
- root = xmlDocGetRootElement(doc);
- if (root == NULL) {
- if (ctxt->error != NULL)
- ctxt->error(ctxt->userData, "xmlRelaxNGParse: %s is empty\n",
- ctxt->URL);
- ctxt->nbErrors++;
- return (NULL);
- }
-
- /*
- * Remove all the blank text nodes
- */
delete = NULL;
cur = root;
while (cur != NULL) {
@@ -4968,6 +4955,43 @@
xmlFree(name);
}
}
+ if (xmlStrEqual(cur->name, BAD_CAST "nsName")) {
+ if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Found nsName/except//nsName forbidden construct\n");
+ ctxt->nbErrors++;
+ }
+ }
+ } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) &&
+ (cur != root)) {
+ int oldflags = ctxt->flags;
+
+ if ((cur->parent != NULL) &&
+ (xmlStrEqual(cur->parent->name, BAD_CAST "anyName"))) {
+ ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT;
+ xmlRelaxNGCleanupTree(ctxt, cur);
+ ctxt->flags = oldflags;
+ goto skip_children;
+ } else if ((cur->parent != NULL) &&
+ (xmlStrEqual(cur->parent->name, BAD_CAST "nsName"))) {
+ ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT;
+ xmlRelaxNGCleanupTree(ctxt, cur);
+ ctxt->flags = oldflags;
+ goto skip_children;
+ }
+ } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) {
+ if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Found anyName/except//anyName forbidden construct\n");
+ ctxt->nbErrors++;
+ } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Found nsName/except//anyName forbidden construct\n");
+ ctxt->nbErrors++;
+ }
}
/*
* Thisd is not an else since "include" is transformed
@@ -5058,7 +5082,34 @@
xmlFreeNode(delete);
delete = NULL;
}
+}
+/**
+ * xmlRelaxNGCleanupDoc:
+ * @ctxt: a Relax-NG parser context
+ * @doc: an xmldocPtr document pointer
+ *
+ * Cleanup the document from unwanted nodes for parsing, resolve
+ * Include and externalRef lookups.
+ *
+ * Returns the cleaned up document or NULL in case of error
+ */
+static xmlDocPtr
+xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc) {
+ xmlNodePtr root;
+
+ /*
+ * Extract the root
+ */
+ root = xmlDocGetRootElement(doc);
+ if (root == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData, "xmlRelaxNGParse: %s is empty\n",
+ ctxt->URL);
+ ctxt->nbErrors++;
+ return (NULL);
+ }
+ xmlRelaxNGCleanupTree(ctxt, root);
return(doc);
}
diff --git a/result/relaxng/spec1_err b/result/relaxng/spec1_err
index cd80a7d..9189fd8 100644
--- a/result/relaxng/spec1_err
+++ b/result/relaxng/spec1_err
@@ -1 +1 @@
-Unimplemented block at relaxng.c:5874
+Unimplemented block at relaxng.c:6304
diff --git a/result/relaxng/tutor10_1_4.err b/result/relaxng/tutor10_1_4.err
index e661d73..15fd907 100644
--- a/result/relaxng/tutor10_1_4.err
+++ b/result/relaxng/tutor10_1_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6058
+error detected at relaxng.c:6488
Expecting a namespace for element foo
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor10_1_5.err b/result/relaxng/tutor10_1_5.err
index 814058f..c919e68 100644
--- a/result/relaxng/tutor10_1_5.err
+++ b/result/relaxng/tutor10_1_5.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6063
+error detected at relaxng.c:6493
Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor10_1_6.err b/result/relaxng/tutor10_1_6.err
index 814058f..c919e68 100644
--- a/result/relaxng/tutor10_1_6.err
+++ b/result/relaxng/tutor10_1_6.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6063
+error detected at relaxng.c:6493
Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor10_2_3.err b/result/relaxng/tutor10_2_3.err
index 74b3d65..7597101 100644
--- a/result/relaxng/tutor10_2_3.err
+++ b/result/relaxng/tutor10_2_3.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6075
+error detected at relaxng.c:6505
Expecting no namespace for element foo
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor10_2_4.err b/result/relaxng/tutor10_2_4.err
index 74b3d65..7597101 100644
--- a/result/relaxng/tutor10_2_4.err
+++ b/result/relaxng/tutor10_2_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6075
+error detected at relaxng.c:6505
Expecting no namespace for element foo
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor10_7_3.err b/result/relaxng/tutor10_7_3.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor10_7_3.err
+++ b/result/relaxng/tutor10_7_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor10_8_3.err b/result/relaxng/tutor10_8_3.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor10_8_3.err
+++ b/result/relaxng/tutor10_8_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor11_2_2.err b/result/relaxng/tutor11_2_2.err
index 9cae4df..3b346fe 100644
--- a/result/relaxng/tutor11_2_2.err
+++ b/result/relaxng/tutor11_2_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6282
+error detected at relaxng.c:6712
Invalid attribute foo for element card
diff --git a/result/relaxng/tutor11_2_3.err b/result/relaxng/tutor11_2_3.err
index f24944b..9e2730b 100644
--- a/result/relaxng/tutor11_2_3.err
+++ b/result/relaxng/tutor11_2_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6282
+error detected at relaxng.c:6712
Invalid attribute b for element card
diff --git a/result/relaxng/tutor12_1_err b/result/relaxng/tutor12_1_err
index cd80a7d..9189fd8 100644
--- a/result/relaxng/tutor12_1_err
+++ b/result/relaxng/tutor12_1_err
@@ -1 +1 @@
-Unimplemented block at relaxng.c:5874
+Unimplemented block at relaxng.c:6304
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 4327550..9ecdb13 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6050
+error detected at relaxng.c:6480
Expecting element name, got email
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element card: email
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor3_7_err b/result/relaxng/tutor3_7_err
index 9a41395..dedbc90 100644
--- a/result/relaxng/tutor3_7_err
+++ b/result/relaxng/tutor3_7_err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6639
+error detected at relaxng.c:7070
extra data on the document
diff --git a/result/relaxng/tutor5_3_1 b/result/relaxng/tutor5_3_1
index 2c33d6c..e69de29 100644
--- a/result/relaxng/tutor5_3_1
+++ b/result/relaxng/tutor5_3_1
@@ -1 +0,0 @@
-./test/relaxng/tutor5_3_1.xml fails to validate
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index 1b1d92f..9b9aa0c 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,6 +1 @@
-error detected at relaxng.c:6433
-Element bad has child elements
-error detected at relaxng.c:6216
-Expecting an element got 3 type
-error detected at relaxng.c:6269
-Extra content for element bad: text
+Element bad has a content type error
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index 3ef6a41..e568637 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6282
+error detected at relaxng.c:6712
Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index db765b1..b76748b 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element preferredFormat: text
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index 3ef6a41..e568637 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6282
+error detected at relaxng.c:6712
Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index 6e22ca9..d2ee9ca 100644
--- a/result/relaxng/tutor7_1_2.err
+++ b/result/relaxng/tutor7_1_2.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:5161
+error detected at relaxng.c:5591
Internal: failed to validate type float
-error detected at relaxng.c:6571
+error detected at relaxng.c:7002
error validating list
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element vector: text
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index 31ed32f..b2108a4 100644
--- a/result/relaxng/tutor7_1_3.err
+++ b/result/relaxng/tutor7_1_3.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:5401
+error detected at relaxng.c:5831
Extra data in list: 5.6
-error detected at relaxng.c:6571
+error detected at relaxng.c:7002
error validating list
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element vector: text
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index 3bfb707..6f668cb 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5161
+error detected at relaxng.c:5591
Internal: failed to validate type double
-error detected at relaxng.c:6571
+error detected at relaxng.c:7002
error validating list
diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err
index 9672d11..22724fe 100644
--- a/result/relaxng/tutor7_3_4.err
+++ b/result/relaxng/tutor7_3_4.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:5401
+error detected at relaxng.c:5831
Extra data in list: 5.6
-error detected at relaxng.c:6571
+error detected at relaxng.c:7002
error validating list
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element path: text
diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err
index c94bf28..122642b 100644
--- a/result/relaxng/tutor7_3_5.err
+++ b/result/relaxng/tutor7_3_5.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:5161
+error detected at relaxng.c:5591
Internal: failed to validate type double
-error detected at relaxng.c:6571
+error detected at relaxng.c:7002
error validating list
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element path: text
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
index 6e73a99..3eb899c 100644
--- a/result/relaxng/tutor8_2_4.err
+++ b/result/relaxng/tutor8_2_4.err
@@ -1,4 +1,4 @@
-Unimplemented block at relaxng.c:5874
-Unimplemented block at relaxng.c:5874
-error detected at relaxng.c:6269
+Unimplemented block at relaxng.c:6304
+Unimplemented block at relaxng.c:6304
+error detected at relaxng.c:6699
Extra content for element head: meta
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
index 73526ae..cef2834 100644
--- a/result/relaxng/tutor8_2_5.err
+++ b/result/relaxng/tutor8_2_5.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6210
+error detected at relaxng.c:6640
Expecting an element, got empty
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element head: meta
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
index d23da38..6fade87 100644
--- a/result/relaxng/tutor8_2_6.err
+++ b/result/relaxng/tutor8_2_6.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element head: base
diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor9_5_2.err
+++ b/result/relaxng/tutor9_5_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor9_5_3.err
+++ b/result/relaxng/tutor9_5_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor9_6_2.err
+++ b/result/relaxng/tutor9_6_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err
index fbb50a8..2bdbe5e 100644
--- a/result/relaxng/tutor9_6_3.err
+++ b/result/relaxng/tutor9_6_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6269
+error detected at relaxng.c:6699
Extra content for element addressBook: card