include seems to work okay now augmented/updated the regression tests

* relaxng: include seems to work okay now
* test/relaxng/* result/relaxng/*: augmented/updated the
  regression tests
Daniel
diff --git a/ChangeLog b/ChangeLog
index 1635b9d..67cf344 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Feb  2 15:33:38 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng: include seems to work okay now
+	* test/relaxng/* result/relaxng/*: augmented/updated the
+	  regression tests
+
 Sat Feb  1 19:44:58 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* relaxng.c: a bit of work done in the train back.
diff --git a/relaxng.c b/relaxng.c
index 5dcd046..220edba 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -8,10 +8,10 @@
 
 /**
  * TODO:
- * - <interleave></interleave><element>...
  * - error reporting
- * - module
- * - fixing ref/def cross grammar contexts
+ * - simplification of the resulting compiled trees:
+ *    - NOT_ALLOWED
+ *    - EMPTY
  */
 
 #define IN_LIBXML
@@ -1560,6 +1560,8 @@
 	      xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
 static xmlRelaxNGPtr xmlRelaxNGParseDocument(
 	      xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
+static int xmlRelaxNGParseGrammarContent(
+	      xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes);
 
 
 #define IS_BLANK_NODE(n)						\
@@ -2087,13 +2089,68 @@
 }
 
 /**
+ * xmlRelaxNGParseInclude:
+ * @ctxt:  a Relax-NG parser context
+ * @node:  the include node
+ *
+ * Integrate the content of an include node in the current grammar
+ *
+ * Returns 0 in case of success or -1 in case of error
+ */
+static int
+xmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
+    xmlRelaxNGIncludePtr incl;
+    xmlNodePtr root;
+    int ret = 0, tmp;
+
+    incl = node->_private;
+    if (incl == NULL) {
+	if (ctxt->error != NULL)
+	    ctxt->error(ctxt->userData,
+		"Include node has no data\n");
+	ctxt->nbErrors++;
+	return(-1);
+    }
+    root = xmlDocGetRootElement(incl->doc);
+    if (root == NULL) {
+	if (ctxt->error != NULL)
+	    ctxt->error(ctxt->userData,
+		"Include document is empty\n");
+	ctxt->nbErrors++;
+	return(-1);
+    }
+    if (!xmlStrEqual(root->name, BAD_CAST "grammar")) {
+	if (ctxt->error != NULL)
+	    ctxt->error(ctxt->userData,
+		"Include document root is not a grammar\n");
+	ctxt->nbErrors++;
+	return(-1);
+    }
+
+    /*
+     * Merge the definition from both the include and the internal list
+     */
+    if (root->children != NULL) {
+	tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children);
+	if (tmp != 0)
+	    ret = -1;
+    }
+    if (node->children != NULL) {
+	tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children);
+	if (tmp != 0)
+	    ret = -1;
+    }
+    return(ret);
+}
+
+/**
  * xmlRelaxNGParseDefine:
  * @ctxt:  a Relax-NG parser context
  * @node:  the define node
  *
  * parse the content of a RelaxNG define element node.
  *
- * Returns the definition pointer or NULL in case of error.
+ * Returns 0 in case of success or -1 in case of error
  */
 static int
 xmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
@@ -2332,8 +2389,20 @@
 	} else {
 	    def = NULL;
 	}
+    } else if (IS_RELAXNG(node, "notAllowed")) {
+	def = xmlRelaxNGNewDefine(ctxt, node);
+	if (def == NULL)
+	    return(NULL);
+	def->type = XML_RELAXNG_NOT_ALLOWED;
+	if (node->children != NULL) {
+	    if (ctxt->error != NULL)
+		ctxt->error(ctxt->userData,
+			"xmlRelaxNGParse: notAllowed element is not empty\n");
+	    ctxt->nbErrors++;
+	}
     } else {
 	TODO
+	def = NULL;
     }
     return(def);
 }
@@ -2644,10 +2713,9 @@
  * Returns 0 in case of success, -1 in case of error
  */
 static int
-xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt
-                              ATTRIBUTE_UNUSED, xmlNodePtr nodes)
+xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
 {
-    int ret = 0;
+    int ret = 0, tmp;
 
     if (nodes == NULL) {
 	if (ctxt->error != NULL)
@@ -2656,30 +2724,30 @@
 	ctxt->nbErrors++;
 	return(-1);
     }
-    if (IS_RELAXNG(nodes, "start")) {
-	if (nodes->children == NULL) {
-	    if (ctxt->error != NULL)
-		ctxt->error(ctxt->userData,
-			    "grammar has no children\n");
-	    ctxt->nbErrors++;
-	} else {
-	    xmlRelaxNGParseStart(ctxt, nodes->children);
-	}
-	nodes = nodes->next;
-    } else {
-	if (ctxt->error != NULL)
-	    ctxt->error(ctxt->userData,
-			"grammar first child must be a <start>\n");
-	ctxt->nbErrors++;
-	return(-1);
-    }
     while (nodes != NULL) {
-        if (IS_RELAXNG(nodes, "define")) {
-	    ret = xmlRelaxNGParseDefine(ctxt, nodes);
+	if (IS_RELAXNG(nodes, "start")) {
+	    if (nodes->children == NULL) {
+		if (ctxt->error != NULL)
+		    ctxt->error(ctxt->userData,
+				"grammar has no children\n");
+		ctxt->nbErrors++;
+	    } else {
+		tmp = xmlRelaxNGParseStart(ctxt, nodes->children);
+		if (tmp != 0)
+		    ret = -1;
+	    }
+	} else if (IS_RELAXNG(nodes, "define")) {
+	    tmp = xmlRelaxNGParseDefine(ctxt, nodes);
+	    if (tmp != 0)
+		ret = -1;
+	} else if (IS_RELAXNG(nodes, "include")) {
+	    tmp = xmlRelaxNGParseInclude(ctxt, nodes);
+	    if (tmp != 0)
+		ret = -1;
         } else {
 	    if (ctxt->error != NULL)
 		ctxt->error(ctxt->userData,
-			"grammar allows onlys <define> child after <start>\n");
+			"grammar has unexpected child %s\n", nodes->name);
 	    ctxt->nbErrors++;
 	    ret = -1;
 	}
@@ -3213,23 +3281,7 @@
 		delete = cur;
 		goto skip_children;
 	    } else {
-		if (xmlStrEqual(cur->name, BAD_CAST "div")) {
-		    /*
-		     * implements rule 4.11
-		     */
-		    xmlNodePtr child, ins, tmp;
-
-		    child = cur->children;
-		    ins = child;
-		    while (child != NULL) {
-			tmp = child->next;
-			xmlUnlinkNode(child);
-			ins = xmlAddNextSibling(ins, child);
-			child = tmp;
-		    }
-		    delete = cur;
-		    goto skip_children;
-		} else if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
+		if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
 		    xmlChar *href, *ns, *base, *URL;
 		    xmlRelaxNGDocumentPtr docu;
 
@@ -3281,7 +3333,7 @@
 		    if (href == NULL) {
 			if (ctxt->error != NULL)
 			    ctxt->error(ctxt->userData,
-		    "xmlRelaxNGParse: externalRef has no href attribute\n");
+		    "xmlRelaxNGParse: include has no href attribute\n");
 			ctxt->nbErrors++;
 			delete = cur;
 			goto skip_children;
@@ -3291,7 +3343,7 @@
 		    if (URL == NULL) {
 			if (ctxt->error != NULL)
 			    ctxt->error(ctxt->userData,
-			"Failed to compute URL for externalRef %s\n", href);
+			"Failed to compute URL for include %s\n", href);
 			ctxt->nbErrors++;
 			if (href != NULL)
 			    xmlFree(href);
@@ -3308,7 +3360,7 @@
 		    if (incl == NULL) {
 			if (ctxt->error != NULL)
 			    ctxt->error(ctxt->userData,
-				"Failed to load externalRef %s\n", URL);
+				"Failed to load include %s\n", URL);
 			ctxt->nbErrors++;
 			xmlFree(URL);
 			delete = cur;
@@ -3418,6 +3470,27 @@
 			} 
 		    }
 		}
+		/*
+		 * Thisd is not an else since "include" is transformed
+		 * into a div
+		 */
+		if (xmlStrEqual(cur->name, BAD_CAST "div")) {
+		    /*
+		     * implements rule 4.11
+		     */
+		    xmlNodePtr child, ins, tmp;
+
+		    child = cur->children;
+		    ins = child;
+		    while (child != NULL) {
+			tmp = child->next;
+			xmlUnlinkNode(child);
+			ins = xmlAddNextSibling(ins, child);
+			child = tmp;
+		    }
+		    delete = cur;
+		    goto skip_children;
+		}
 	    }
 	}
 	/*
@@ -3587,6 +3660,8 @@
     ctxt->document = NULL;
     ret->documents = ctxt->documents;
     ctxt->documents = NULL;
+    ret->includes = ctxt->includes;
+    ctxt->includes = NULL;
 
     return (ret);
 }
@@ -4631,8 +4706,7 @@
 #endif
 	    return(0);
         case XML_RELAXNG_NOT_ALLOWED:
-	    TODO
-	    break;
+	    return(-1);
         case XML_RELAXNG_TEXT:
 	    if (node == NULL)
 		return(0);
@@ -4794,6 +4868,7 @@
 	    ctxt->flags = oldflags;
 	    break;
 	}
+        case XML_RELAXNG_DEF:
         case XML_RELAXNG_GROUP: {
 	    xmlRelaxNGDefinePtr list = define->content;
 
@@ -4815,9 +4890,6 @@
         case XML_RELAXNG_REF:
 	    ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
 	    break;
-        case XML_RELAXNG_DEF:
-	    ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
-	    break;
         case XML_RELAXNG_DATATYPE: {
 	    xmlChar *content;
 
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 28a6d51..28f4b55 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:4293
-error detected at relaxng.c:4341
+error detected at relaxng.c:4733
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index fc5adef..5730024 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:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor4_1_1 b/result/relaxng/tutor4_1_1
index 373a10d..d8f436d 100644
--- a/result/relaxng/tutor4_1_1
+++ b/result/relaxng/tutor4_1_1
@@ -1,2 +1 @@
-Extra content for element addressBook
-./test/relaxng/tutor4_1_1.xml validation generated an internal error
+./test/relaxng/tutor4_1_1.xml validates
diff --git a/result/relaxng/tutor4_1_1.err b/result/relaxng/tutor4_1_1.err
index 1e44ce9..adaf345 100644
--- a/result/relaxng/tutor4_1_1.err
+++ b/result/relaxng/tutor4_1_1.err
@@ -1,4 +1,7 @@
 xmlRelaxNGValidateDefinition(): validated name : 0
-xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
-xmlRelaxNGValidateDefinition(): validated addressBook : -1
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index a719419..0e2f256 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:4472
+error detected at relaxng.c:4910
 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 bfb47f3..c11ebed 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:4349
+error detected at relaxng.c:4789
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 02ace4c..fd91c10 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:4341
+error detected at relaxng.c:4781
 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 bfb47f3..c11ebed 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:4349
+error detected at relaxng.c:4789
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index d31ade5..cde76cd 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:3551
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:3992
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index 1bb9ef0..c6d9ee5 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:3739
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:4180
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index aa5e8ae..6310d77 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3714
-error detected at relaxng.c:4526
+error detected at relaxng.c:4155
+error detected at relaxng.c:4964
 xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err
index 880a609..74bd68f 100644
--- a/result/relaxng/tutor7_3_4.err
+++ b/result/relaxng/tutor7_3_4.err
@@ -1,7 +1,7 @@
 Unimplemented block at xmlschemastypes.c:1135
 Unimplemented block at xmlschemastypes.c:1135
 Unimplemented block at xmlschemastypes.c:1135
-error detected at relaxng.c:3739
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:4180
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated path : -1
diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err
index b49a8a5..d8657f5 100644
--- a/result/relaxng/tutor7_3_5.err
+++ b/result/relaxng/tutor7_3_5.err
@@ -1,5 +1,5 @@
 Unimplemented block at xmlschemastypes.c:1135
-error detected at relaxng.c:3551
-error detected at relaxng.c:4526
-error detected at relaxng.c:4341
+error detected at relaxng.c:3992
+error detected at relaxng.c:4964
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated path : -1
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
index bfce578..0af92c6 100644
--- a/result/relaxng/tutor8_2_4.err
+++ b/result/relaxng/tutor8_2_4.err
@@ -3,5 +3,5 @@
   6 groups
 xmlRelaxNGValidateDefinition(): validated title : 0
 xmlRelaxNGValidateDefinition(): validated title : 0
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
index 4080909..516916b 100644
--- a/result/relaxng/tutor8_2_5.err
+++ b/result/relaxng/tutor8_2_5.err
@@ -1,6 +1,6 @@
 xmlRelaxNGComputeInterleaves(interleave0)
   6 child
   6 groups
-error detected at relaxng.c:4287
-error detected at relaxng.c:4341
+error detected at relaxng.c:4727
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
index 2632bfd..871a5d5 100644
--- a/result/relaxng/tutor8_2_6.err
+++ b/result/relaxng/tutor8_2_6.err
@@ -4,5 +4,5 @@
 xmlRelaxNGValidateDefinition(): validated title : 0
 xmlRelaxNGValidateDefinition(): validated base : 0
 xmlRelaxNGValidateDefinition(): validated base : 0
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated head : -1
diff --git a/result/relaxng/tutor9_10_1 b/result/relaxng/tutor9_10_1
new file mode 100644
index 0000000..7c6117f
--- /dev/null
+++ b/result/relaxng/tutor9_10_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_10_1.xml validates
diff --git a/result/relaxng/tutor9_10_1.err b/result/relaxng/tutor9_10_1.err
new file mode 100644
index 0000000..a9b23d3
--- /dev/null
+++ b/result/relaxng/tutor9_10_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.extra defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_11_1 b/result/relaxng/tutor9_11_1
new file mode 100644
index 0000000..02a1f2a
--- /dev/null
+++ b/result/relaxng/tutor9_11_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_11_1.xml validates
diff --git a/result/relaxng/tutor9_11_1.err b/result/relaxng/tutor9_11_1.err
new file mode 100644
index 0000000..a06deb4
--- /dev/null
+++ b/result/relaxng/tutor9_11_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated emailAddress : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor9_12_1 b/result/relaxng/tutor9_12_1
new file mode 100644
index 0000000..08f2a8a
--- /dev/null
+++ b/result/relaxng/tutor9_12_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_12_1.xml validates
diff --git a/result/relaxng/tutor9_12_1.err b/result/relaxng/tutor9_12_1.err
new file mode 100644
index 0000000..a06deb4
--- /dev/null
+++ b/result/relaxng/tutor9_12_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated emailAddress : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
+xmlRelaxNGValidateDefinition(): validated addressBook : 0
diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err
index 2bdc72e..95c7ecd 100644
--- a/result/relaxng/tutor9_5_2.err
+++ b/result/relaxng/tutor9_5_2.err
@@ -5,5 +5,5 @@
 xmlRelaxNGValidateAttribute(name): 0
 xmlRelaxNGValidateAttribute(email): -1
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err
index 7aeb8b1..fdd483a 100644
--- a/result/relaxng/tutor9_5_3.err
+++ b/result/relaxng/tutor9_5_3.err
@@ -5,5 +5,5 @@
 xmlRelaxNGValidateAttribute(name): 0
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err
index bc1478c..3c5fd73 100644
--- a/result/relaxng/tutor9_6_2.err
+++ b/result/relaxng/tutor9_6_2.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(name): 0
 xmlRelaxNGValidateAttribute(email): -1
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err
index b9bac75..3580560 100644
--- a/result/relaxng/tutor9_6_3.err
+++ b/result/relaxng/tutor9_6_3.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(name): 0
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:4341
+error detected at relaxng.c:4781
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor9_7_1 b/result/relaxng/tutor9_7_1
new file mode 100644
index 0000000..00d1502
--- /dev/null
+++ b/result/relaxng/tutor9_7_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_7_1.xml validates
diff --git a/result/relaxng/tutor9_7_1.err b/result/relaxng/tutor9_7_1.err
new file mode 100644
index 0000000..20c76cb
--- /dev/null
+++ b/result/relaxng/tutor9_7_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.class defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_8_1 b/result/relaxng/tutor9_8_1
new file mode 100644
index 0000000..1849f8b
--- /dev/null
+++ b/result/relaxng/tutor9_8_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_8_1.xml validates
diff --git a/result/relaxng/tutor9_8_1.err b/result/relaxng/tutor9_8_1.err
new file mode 100644
index 0000000..20c76cb
--- /dev/null
+++ b/result/relaxng/tutor9_8_1.err
@@ -0,0 +1,6 @@
+xmlRelaxNGCheckCombine(): merging inline.class defines: 1
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/result/relaxng/tutor9_9_1 b/result/relaxng/tutor9_9_1
new file mode 100644
index 0000000..d88f01a
--- /dev/null
+++ b/result/relaxng/tutor9_9_1
@@ -0,0 +1 @@
+./test/relaxng/tutor9_9_1.xml validates
diff --git a/result/relaxng/tutor9_9_1.err b/result/relaxng/tutor9_9_1.err
new file mode 100644
index 0000000..dc2c439
--- /dev/null
+++ b/result/relaxng/tutor9_9_1.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateDefinition(): validated italic : 0
+xmlRelaxNGValidateDefinition(): validated em : 0
+xmlRelaxNGValidateDefinition(): validated bold : 0
+xmlRelaxNGValidateDefinition(): validated p : 0
+xmlRelaxNGValidateDefinition(): validated doc : 0
diff --git a/test/relaxng/addressBook.rng b/test/relaxng/addressBook.rng
new file mode 100644
index 0000000..3d910f9
--- /dev/null
+++ b/test/relaxng/addressBook.rng
@@ -0,0 +1,24 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <start>
+    <element name="addressBook">
+      <zeroOrMore>
+	<element name="card">
+	  <ref name="cardContent"/>
+	</element>
+      </zeroOrMore>
+    </element>
+  </start>
+
+  <define name="cardContent">
+    <element name="name">
+      <text/>
+    </element>
+    <element name="email">
+      <text/>
+    </element>
+  </define>
+
+</grammar>
+
+
diff --git a/test/relaxng/inline3.rng b/test/relaxng/inline3.rng
new file mode 100644
index 0000000..72f9db6
--- /dev/null
+++ b/test/relaxng/inline3.rng
@@ -0,0 +1,22 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <define name="inline">
+    <zeroOrMore>
+      <choice>
+	<text/>
+	<element name="bold">
+	  <ref name="inline"/>
+	</element>
+	<element name="italic">
+	  <ref name="inline"/>
+	</element>
+	<ref name="inline.extra"/>
+      </choice>
+    </zeroOrMore>
+  </define>
+
+  <define name="inline.extra">
+    <notAllowed/>
+  </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_10.rng b/test/relaxng/tutor9_10.rng
new file mode 100644
index 0000000..c5b38db
--- /dev/null
+++ b/test/relaxng/tutor9_10.rng
@@ -0,0 +1,26 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <include href="inline3.rng"/>
+
+  <start>
+    <element name="doc">
+      <zeroOrMore>
+	<element name="p">
+	  <ref name="inline"/>
+	</element>
+      </zeroOrMore>
+    </element>
+  </start>
+
+  <define name="inline.extra" combine="choice">
+    <choice>
+      <element name="code">
+	<ref name="inline"/>
+      </element>
+      <element name="em">
+	<ref name="inline"/>
+      </element>
+    </choice>
+  </define>
+  
+</grammar>
diff --git a/test/relaxng/tutor9_10_1.xml b/test/relaxng/tutor9_10_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_10_1.xml
@@ -0,0 +1,3 @@
+<doc>
+  <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_11.rng b/test/relaxng/tutor9_11.rng
new file mode 100644
index 0000000..cf63b02
--- /dev/null
+++ b/test/relaxng/tutor9_11.rng
@@ -0,0 +1,16 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <include href="addressBook.rng">
+
+    <define name="cardContent">
+      <element name="name">
+	<text/>
+      </element>
+      <element name="emailAddress">
+	<text/>
+      </element>
+    </define>
+
+  </include>
+
+</grammar>
diff --git a/test/relaxng/tutor9_11_1.xml b/test/relaxng/tutor9_11_1.xml
new file mode 100644
index 0000000..c542fa6
--- /dev/null
+++ b/test/relaxng/tutor9_11_1.xml
@@ -0,0 +1,3 @@
+<addressBook>
+  <card><name>foo</name><emailAddress>bar</emailAddress></card>
+</addressBook>
diff --git a/test/relaxng/tutor9_12.rng b/test/relaxng/tutor9_12.rng
new file mode 100644
index 0000000..be10b85
--- /dev/null
+++ b/test/relaxng/tutor9_12.rng
@@ -0,0 +1,22 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <start>
+    <element name="addressBook">
+      <zeroOrMore>
+	<element name="card">
+	  <ref name="cardContent"/>
+	</element>
+      </zeroOrMore>
+    </element>
+  </start>
+
+  <define name="cardContent">
+    <element name="name">
+      <text/>
+    </element>
+    <element name="emailAddress">
+      <text/>
+    </element>
+  </define>
+
+</grammar>
diff --git a/test/relaxng/tutor9_12_1.xml b/test/relaxng/tutor9_12_1.xml
new file mode 100644
index 0000000..c542fa6
--- /dev/null
+++ b/test/relaxng/tutor9_12_1.xml
@@ -0,0 +1,3 @@
+<addressBook>
+  <card><name>foo</name><emailAddress>bar</emailAddress></card>
+</addressBook>
diff --git a/test/relaxng/tutor9_7_1.xml b/test/relaxng/tutor9_7_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_7_1.xml
@@ -0,0 +1,3 @@
+<doc>
+  <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_8.rng b/test/relaxng/tutor9_8.rng
new file mode 100644
index 0000000..16a141d
--- /dev/null
+++ b/test/relaxng/tutor9_8.rng
@@ -0,0 +1,42 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <define name="inline">
+    <zeroOrMore>
+      <ref name="inline.class"/>
+    </zeroOrMore>
+  </define>
+
+  <define name="inline.class">
+    <choice>
+      <text/>
+      <element name="bold">
+	<ref name="inline"/>
+      </element>
+      <element name="italic">
+	<ref name="inline"/>
+      </element>
+    </choice>
+  </define>
+
+  <start>
+    <element name="doc">
+      <zeroOrMore>
+	<element name="p">
+	  <ref name="inline"/>
+	</element>
+      </zeroOrMore>
+    </element>
+  </start>
+
+  <define name="inline.class" combine="choice">
+    <choice>
+      <element name="code">
+	<ref name="inline"/>
+      </element>
+      <element name="em">
+	<ref name="inline"/>
+      </element>
+    </choice>
+  </define>
+  
+</grammar>
diff --git a/test/relaxng/tutor9_8_1.xml b/test/relaxng/tutor9_8_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_8_1.xml
@@ -0,0 +1,3 @@
+<doc>
+  <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>
diff --git a/test/relaxng/tutor9_9.rng b/test/relaxng/tutor9_9.rng
new file mode 100644
index 0000000..9f2e5ea
--- /dev/null
+++ b/test/relaxng/tutor9_9.rng
@@ -0,0 +1,37 @@
+<grammar xmlns="http://relaxng.org/ns/structure/1.0">
+
+  <define name="inline">
+    <zeroOrMore>
+      <ref name="inline.class"/>
+    </zeroOrMore>
+  </define>
+
+  <define name="inline.class">
+    <choice>
+      <text/>
+      <element name="bold">
+	<ref name="inline"/>
+      </element>
+      <element name="italic">
+	<ref name="inline"/>
+      </element>
+      <element name="code">
+	<ref name="inline"/>
+      </element>
+      <element name="em">
+	<ref name="inline"/>
+      </element>
+    </choice>
+  </define>
+
+  <start>
+    <element name="doc">
+      <zeroOrMore>
+	<element name="p">
+	  <ref name="inline"/>
+	</element>
+      </zeroOrMore>
+    </element>
+  </start>
+
+</grammar>
diff --git a/test/relaxng/tutor9_9_1.xml b/test/relaxng/tutor9_9_1.xml
new file mode 100644
index 0000000..139a079
--- /dev/null
+++ b/test/relaxng/tutor9_9_1.xml
@@ -0,0 +1,3 @@
+<doc>
+  <p>a<bold>b<em>c<italic>d</italic>e</em>f</bold>g</p>
+</doc>