more work on Relax-NG, implementing interleave augmented/updated the

* relaxng.c: more work on Relax-NG, implementing interleave
* test/relaxng/* result/relaxng/*: augmented/updated the
  regression tests
Daniel
diff --git a/ChangeLog b/ChangeLog
index 728eb9b..fcb5434 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jan 29 00:08:38 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c: more work on Relax-NG, implementing interleave
+	* test/relaxng/* result/relaxng/*: augmented/updated the 
+	  regression tests
+
 Tue Jan 28 21:56:49 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* relaxng.c: more work on Relax-NG, implementing interleave
diff --git a/relaxng.c b/relaxng.c
index 49b089e..0776147 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -42,7 +42,7 @@
 #define DEBUG_CONTENT 1
 #define DEBUG_TYPE 1
 #define DEBUG_VALID 1
-#define DEBUG_INTERLEAVE 1
+#define DEBUG_INTERLEAVE 1 */
 
 #define UNBOUNDED (1 << 30)
 #define TODO 								\
@@ -1299,7 +1299,8 @@
     parent = NULL;
     cur = def;
     while (cur != NULL) {
-	if (cur->type == XML_RELAXNG_ELEMENT) {
+	if ((cur->type == XML_RELAXNG_ELEMENT) ||
+	    (cur->type == XML_RELAXNG_TEXT)) {
 	    if (ret == NULL) {
 		max = 10;
 		ret = (xmlRelaxNGDefinePtr *)
@@ -1322,13 +1323,16 @@
 		    return(NULL);
 		}
 	    }
-	    ret[len++] = def;
+	    ret[len++] = cur;
 	    ret[len] = NULL;
 	} else if ((cur->type == XML_RELAXNG_CHOICE) ||
 		   (cur->type == XML_RELAXNG_INTERLEAVE) ||
 		   (cur->type == XML_RELAXNG_GROUP) ||
 		   (cur->type == XML_RELAXNG_ONEORMORE) ||
-		   (cur->type == XML_RELAXNG_ZEROORMORE)) {
+		   (cur->type == XML_RELAXNG_ZEROORMORE) ||
+		   (cur->type == XML_RELAXNG_OPTIONAL) ||
+		   (cur->type == XML_RELAXNG_REF) ||
+		   (cur->type == XML_RELAXNG_DEF)) {
 	    /*
 	     * Don't go within elements or attributes or string values.
 	     * Just gather the element top list
@@ -3627,7 +3631,7 @@
 xmlRelaxNGValidatePartGroup(xmlRelaxNGValidCtxtPtr ctxt, 
 			    xmlRelaxNGInterleaveGroupPtr *groups,
 			    int nbgroups, xmlNodePtr *nodes, int len) {
-    int level = -1, ret = -1, i, j, k;
+    int level, ret = -1, i, j, k;
     xmlNodePtr *array = NULL, *list, oldseq;
     xmlRelaxNGInterleaveGroupPtr group;
 
@@ -3662,6 +3666,7 @@
 	ctxt->state->seq = oldseq;
 	if (k > 1) {
 	    memset(array, 0, k * sizeof(xmlNodePtr));
+	    level = -1;
 	    ret = xmlRelaxNGValidateWalkPermutations(ctxt, group->rule,
 					  list, array, k, &level, -1);
 	} else {
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 93bea8e..9f912af 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3888
-error detected at relaxng.c:3936
+error detected at relaxng.c:3893
+error detected at relaxng.c:3941
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index 0b2e98c..d4572ba 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(name): -1
 xmlRelaxNGValidateDefinition(): validated email : 0
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:3936
+error detected at relaxng.c:3941
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index 9c62a48..af193a7 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:4066
+error detected at relaxng.c:4071
 xmlRelaxNGValidateDefinition(): validated note : 0
 xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index a401290..140c39e 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(preferredFormat): -1
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3944
+error detected at relaxng.c:3949
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 444711f..f81281e 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateDefinition(): validated name : 0
 xmlRelaxNGValidateDefinition(): validated email : 0
-error detected at relaxng.c:3936
+error detected at relaxng.c:3941
 xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index a401290..140c39e 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(preferredFormat): -1
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3944
+error detected at relaxng.c:3949
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index c4852a8..f767200 100644
--- a/result/relaxng/tutor7_1_2.err
+++ b/result/relaxng/tutor7_1_2.err
@@ -1,5 +1,5 @@
 Unimplemented block at xmlschemastypes.c:1132
-error detected at relaxng.c:3147
-error detected at relaxng.c:4120
-error detected at relaxng.c:3936
+error detected at relaxng.c:3151
+error detected at relaxng.c:4125
+error detected at relaxng.c:3941
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index ed15abe..0ca0de9 100644
--- a/result/relaxng/tutor7_1_3.err
+++ b/result/relaxng/tutor7_1_3.err
@@ -1,6 +1,6 @@
 Unimplemented block at xmlschemastypes.c:1132
 Unimplemented block at xmlschemastypes.c:1132
-error detected at relaxng.c:3335
-error detected at relaxng.c:4120
-error detected at relaxng.c:3936
+error detected at relaxng.c:3339
+error detected at relaxng.c:4125
+error detected at relaxng.c:3941
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index 02fceec..bab6132 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3310
-error detected at relaxng.c:4120
+error detected at relaxng.c:3314
+error detected at relaxng.c:4125
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor8_2_1 b/result/relaxng/tutor8_2_1
new file mode 100644
index 0000000..4c6b3d4
--- /dev/null
+++ b/result/relaxng/tutor8_2_1
@@ -0,0 +1 @@
+./test/relaxng/tutor8_2_1.xml validates
diff --git a/result/relaxng/tutor8_2_1.err b/result/relaxng/tutor8_2_1.err
new file mode 100644
index 0000000..be2e794
--- /dev/null
+++ b/result/relaxng/tutor8_2_1.err
@@ -0,0 +1,7 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+xmlRelaxNGValidateDefinition(): validated title : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated head : 0
diff --git a/result/relaxng/tutor8_2_2 b/result/relaxng/tutor8_2_2
new file mode 100644
index 0000000..7f959b9
--- /dev/null
+++ b/result/relaxng/tutor8_2_2
@@ -0,0 +1 @@
+./test/relaxng/tutor8_2_2.xml validates
diff --git a/result/relaxng/tutor8_2_2.err b/result/relaxng/tutor8_2_2.err
new file mode 100644
index 0000000..258bedf
--- /dev/null
+++ b/result/relaxng/tutor8_2_2.err
@@ -0,0 +1,38 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+xmlRelaxNGValidateDefinition(): validated title : 0
+xmlRelaxNGValidateDefinition(): validated base : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated style : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated script : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated link : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated meta : 0
+xmlRelaxNGValidateDefinition(): validated head : 0
diff --git a/result/relaxng/tutor8_2_3 b/result/relaxng/tutor8_2_3
new file mode 100644
index 0000000..21abe93
--- /dev/null
+++ b/result/relaxng/tutor8_2_3
@@ -0,0 +1 @@
+./test/relaxng/tutor8_2_3.xml validates
diff --git a/result/relaxng/tutor8_2_3.err b/result/relaxng/tutor8_2_3.err
new file mode 100644
index 0000000..eb816f0
--- /dev/null
+++ b/result/relaxng/tutor8_2_3.err
@@ -0,0 +1,5 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+xmlRelaxNGValidateDefinition(): validated title : 0
+xmlRelaxNGValidateDefinition(): validated head : 0
diff --git a/result/relaxng/tutor8_2_4 b/result/relaxng/tutor8_2_4
new file mode 100644
index 0000000..9554ec3
--- /dev/null
+++ b/result/relaxng/tutor8_2_4
@@ -0,0 +1,2 @@
+Extra content for element head
+./test/relaxng/tutor8_2_4.xml validation generated an internal error
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
new file mode 100644
index 0000000..9871e82
--- /dev/null
+++ b/result/relaxng/tutor8_2_4.err
@@ -0,0 +1,7 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+xmlRelaxNGValidateDefinition(): validated title : 0
+xmlRelaxNGValidateDefinition(): validated title : 0
+error detected at relaxng.c:3941
+xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_5 b/result/relaxng/tutor8_2_5
new file mode 100644
index 0000000..d6aed29
--- /dev/null
+++ b/result/relaxng/tutor8_2_5
@@ -0,0 +1,3 @@
+Expecting an element
+Extra content for element head
+./test/relaxng/tutor8_2_5.xml validation generated an internal error
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
new file mode 100644
index 0000000..3ce1e71
--- /dev/null
+++ b/result/relaxng/tutor8_2_5.err
@@ -0,0 +1,6 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+error detected at relaxng.c:3887
+error detected at relaxng.c:3941
+xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_6 b/result/relaxng/tutor8_2_6
new file mode 100644
index 0000000..f7ede6f
--- /dev/null
+++ b/result/relaxng/tutor8_2_6
@@ -0,0 +1,2 @@
+Extra content for element head
+./test/relaxng/tutor8_2_6.xml validation generated an internal error
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
new file mode 100644
index 0000000..5fedf88
--- /dev/null
+++ b/result/relaxng/tutor8_2_6.err
@@ -0,0 +1,8 @@
+xmlRelaxNGComputeInterleaves(interleave0)
+  6 child
+  6 groups
+xmlRelaxNGValidateDefinition(): validated title : 0
+xmlRelaxNGValidateDefinition(): validated base : 0
+xmlRelaxNGValidateDefinition(): validated base : 0
+error detected at relaxng.c:3941
+xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/test/relaxng/tutor8_2.rng b/test/relaxng/tutor8_2.rng
new file mode 100644
index 0000000..495968e
--- /dev/null
+++ b/test/relaxng/tutor8_2.rng
@@ -0,0 +1,57 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+  <start>
+    <ref name="head"/>
+  </start>
+  <define name="head">
+    <element name="head">
+      <interleave>
+        <ref name="title"/>
+        <optional>
+          <ref name="base"/>
+        </optional>
+        <zeroOrMore>
+          <ref name="style"/>
+        </zeroOrMore>
+        <zeroOrMore>
+          <ref name="script"/>
+        </zeroOrMore>
+        <zeroOrMore>
+          <ref name="link"/>
+        </zeroOrMore>
+        <zeroOrMore>
+          <ref name="meta"/>
+        </zeroOrMore>
+      </interleave>
+    </element>
+  </define>
+  <define name="title">
+    <element name="title">
+      <text/>
+    </element>
+  </define>
+  <define name="base">
+    <element name="base">
+      <text/>
+    </element>
+  </define>
+  <define name="style">
+    <element name="style">
+      <text/>
+    </element>
+  </define>
+  <define name="script">
+    <element name="script">
+      <text/>
+    </element>
+  </define>
+  <define name="meta">
+    <element name="meta">
+      <text/>
+    </element>
+  </define>
+  <define name="link">
+    <element name="link">
+      <text/>
+    </element>
+  </define>
+</grammar>
diff --git a/test/relaxng/tutor8_2_1.xml b/test/relaxng/tutor8_2_1.xml
new file mode 100644
index 0000000..fed80d4
--- /dev/null
+++ b/test/relaxng/tutor8_2_1.xml
@@ -0,0 +1,5 @@
+<head>
+  <meta>meta1</meta>
+  <title>foo</title>
+  <meta>meta2</meta>
+</head>
diff --git a/test/relaxng/tutor8_2_2.xml b/test/relaxng/tutor8_2_2.xml
new file mode 100644
index 0000000..24c2e6b
--- /dev/null
+++ b/test/relaxng/tutor8_2_2.xml
@@ -0,0 +1,36 @@
+<head>
+  <meta>meta</meta>
+  <meta>meta</meta>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <base>base</base>
+  <title>foo</title>
+  <meta>meta</meta>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <meta>meta</meta>
+  <meta>meta</meta>
+  <meta>meta</meta>
+  <meta>meta</meta>
+  <meta>meta</meta>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+  <script>script</script>
+  <link>link</link>
+  <style>link</style>
+</head>
diff --git a/test/relaxng/tutor8_2_3.xml b/test/relaxng/tutor8_2_3.xml
new file mode 100644
index 0000000..920f99d
--- /dev/null
+++ b/test/relaxng/tutor8_2_3.xml
@@ -0,0 +1,3 @@
+<head>
+  <title>title</title>
+</head>
diff --git a/test/relaxng/tutor8_2_4.xml b/test/relaxng/tutor8_2_4.xml
new file mode 100644
index 0000000..68f3865
--- /dev/null
+++ b/test/relaxng/tutor8_2_4.xml
@@ -0,0 +1,6 @@
+<head>
+  <meta>meta1</meta>
+  <title>foo</title>
+  <meta>meta2</meta>
+  <title>error</title>
+</head>
diff --git a/test/relaxng/tutor8_2_5.xml b/test/relaxng/tutor8_2_5.xml
new file mode 100644
index 0000000..75b9d53
--- /dev/null
+++ b/test/relaxng/tutor8_2_5.xml
@@ -0,0 +1,3 @@
+<head>
+  <meta>meta2</meta>
+</head>
diff --git a/test/relaxng/tutor8_2_6.xml b/test/relaxng/tutor8_2_6.xml
new file mode 100644
index 0000000..20fb4c7
--- /dev/null
+++ b/test/relaxng/tutor8_2_6.xml
@@ -0,0 +1,5 @@
+<head>
+  <base>base</base>
+  <title>foo</title>
+  <base>error</base>
+</head>
diff --git a/test/relaxng/tutor8_3.rng b/test/relaxng/tutor8_3.rng
new file mode 100644
index 0000000..b68814d
--- /dev/null
+++ b/test/relaxng/tutor8_3.rng
@@ -0,0 +1,9 @@
+<element name="content" xmlns="http://relaxng.org/ns/structure/1.0">
+  <interleave>
+    <text/>
+    <element name="p">
+      <text/>
+    </element>
+  </interleave>
+</element>
+
diff --git a/test/relaxng/tutor8_3_1.xml b/test/relaxng/tutor8_3_1.xml
new file mode 100644
index 0000000..86ea447
--- /dev/null
+++ b/test/relaxng/tutor8_3_1.xml
@@ -0,0 +1 @@
+<content> how are you <p> 'yau de poelle </p> ? </content>