more work on the RelaxNG implementation conformance testing. found 373

* relaxng.c check-relaxng-test-suite.py: more work on the
  RelaxNG implementation conformance testing.
  found 373 test schemas: 284 success 89 failures
  found 529 test instances: 448 success 47 failures
* result/relaxng/*: updated the results
Daniel
diff --git a/ChangeLog b/ChangeLog
index a74a253..60974fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Feb 17 18:23:32 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c check-relaxng-test-suite.py: more work on the
+	  RelaxNG implementation conformance testing.
+	  found 373 test schemas: 284 success 89 failures
+	  found 529 test instances: 448 success 47 failures
+	* result/relaxng/*: updated the results
+
 Sun Feb 16 16:48:38 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* ChangeLog tree.c doc/libxml-doc.el doc/libxml2-api.xml: applied
diff --git a/check-relaxng-test-suite.py b/check-relaxng-test-suite.py
index 00fe902..aa6ad15 100755
--- a/check-relaxng-test-suite.py
+++ b/check-relaxng-test-suite.py
@@ -7,12 +7,13 @@
 sys.path.append("python")
 import libxml2
 
-
 #
 # the testsuite description
 #
 CONF="test/relaxng/OASIS/spectest.xml"
 LOG="check-relaxng-test-suite.log"
+RES="relaxng-test-results.xml"
+
 
 log = open(LOG, "w")
 nb_schemas_tests = 0
@@ -45,7 +46,17 @@
     log.write("resources: %s\n" % (resources))
     return None
 
-
+#
+# Load the previous results
+#
+#results = {}
+#previous = {}
+#
+#try:
+#    res = libxml2.parseFile(RES)
+#except:
+#    log.write("Could not parse %s" % (RES))
+    
 #
 # handle a valid instance
 #
diff --git a/relaxng.c b/relaxng.c
index 36cec74..d6f1f17 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -54,6 +54,7 @@
 /* #define DEBUG_TYPE 1 */
 /* #define DEBUG_VALID 1 */
 /* #define DEBUG_INTERLEAVE 1 */
+/* #define DEBUG_LIST 1 */
 
 #define UNBOUNDED (1 << 30)
 #define TODO 								\
@@ -99,6 +100,9 @@
     XML_RELAXNG_NOT_ALLOWED,    /* not allowed top */
     XML_RELAXNG_EXCEPT,    	/* except present in nameclass defs */
     XML_RELAXNG_TEXT,		/* textual content */
+#if 0
+    XML_RELAXNG_MIXED,		/* mixed content with single sub-content */
+#endif
     XML_RELAXNG_ELEMENT,	/* an element */
     XML_RELAXNG_DATATYPE,	/* extenal data type definition */
     XML_RELAXNG_VALUE,		/* value from an extenal data type definition */
@@ -797,6 +801,7 @@
  * @ctxt: the parser context
  * @URL:  the normalized URL
  * @node: the include node.
+ * @ns:  the namespace passed from the context.
  *
  * First lookup if the document is already loaded into the parser context,
  * check against recursion. If not found the resource is loaded and
@@ -806,7 +811,7 @@
  */
 static xmlRelaxNGIncludePtr
 xmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar *URL,
-	              xmlNodePtr node) {
+	              xmlNodePtr node, const xmlChar *ns) {
     xmlRelaxNGIncludePtr ret = NULL;
     xmlDocPtr doc;
     int i;
@@ -839,7 +844,10 @@
 	    return(NULL);
 	}
     } else {
-	ret = xmlHashLookup(ctxt->includes, URL);
+	if (ns == NULL)
+	    ret = xmlHashLookup2(ctxt->includes, BAD_CAST "", URL);
+	else
+	    ret = xmlHashLookup2(ctxt->includes, ns, URL);
 	if (ret != NULL)
 	    return(ret);
     }
@@ -874,9 +882,24 @@
     ret->href = xmlStrdup(URL);
 
     /*
+     * transmit the ns if needed
+     */
+    if (ns != NULL) {
+	root = xmlDocGetRootElement(doc);
+	if (root != NULL) {
+	    if (xmlHasProp(root, BAD_CAST"ns") == NULL) {
+		xmlSetProp(root, BAD_CAST"ns", ns);
+	    }
+	}
+    }
+
+    /*
      * push it on the stack and register it in the hash table
      */
-    xmlHashAddEntry(ctxt->includes, URL, ret);
+    if (ns == NULL)
+	xmlHashAddEntry2(ctxt->includes, BAD_CAST "", URL, ret);
+    else
+	xmlHashAddEntry2(ctxt->includes, ns, URL, ret);
     xmlRelaxNGIncludePush(ctxt, ret);
 
     /*
@@ -1793,7 +1816,7 @@
  */
 static xmlRelaxNGDefinePtr
 xmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
-    xmlRelaxNGDefinePtr def = NULL;
+    xmlRelaxNGDefinePtr def = NULL, except, last = NULL;
     xmlRelaxNGTypeLibraryPtr lib;
     xmlChar *type;
     xmlChar *library;
@@ -1858,11 +1881,64 @@
 	}
     }
     content = node->children;
+
+    /*
+     * Handle optional params
+     */
     while (content != NULL) {
+	if (!xmlStrEqual(content->name, BAD_CAST "param"))
+	    break;
 	TODO
 	ctxt->nbErrors++;
 	content = content->next;
     }
+    /*
+     * Handle optional except
+     */
+    if ((content != NULL) && (xmlStrEqual(content->name, BAD_CAST "except"))) {
+	xmlNodePtr child;
+	xmlRelaxNGDefinePtr tmp2, last2 = NULL;
+
+	except = xmlRelaxNGNewDefine(ctxt, node);
+	if (except == NULL) {
+	    return(def);
+	}
+	except->type = XML_RELAXNG_EXCEPT;
+	child = content->children;
+	if (last == NULL) {
+	    def->content = except;
+	} else {
+	    last->next = except;
+	}
+	if (child == NULL) {
+	    if (ctxt->error != NULL)
+		ctxt->error(ctxt->userData,
+		    "except has no content\n");
+	    ctxt->nbErrors++;
+	}
+	while (child != NULL) {
+	    tmp2 = xmlRelaxNGParsePattern(ctxt, child);
+	    if (tmp2 != NULL) {
+		if (last2 == NULL) {
+		    except->content = last2 = tmp2;
+		} else {
+		    last2->next = tmp2;
+		    last2 = tmp2;
+		}
+	    }
+	    child = child->next;
+	}
+	content = content->next;
+    }
+    /*
+     * Check there is no unhandled data
+     */
+    if (content != NULL) {
+	if (ctxt->error != NULL)
+	    ctxt->error(ctxt->userData,
+		"Element data has unexpected content %s\n", content->name);
+	ctxt->nbErrors++;
+    }
 
     return(def);
 }
@@ -2693,8 +2769,31 @@
 	    }
 	}
     } else if (IS_RELAXNG(node, "mixed")) {
-	TODO
-	ctxt->nbErrors++;
+	if (node->children == NULL) {
+	    if (ctxt->error != NULL)
+		ctxt->error(ctxt->userData,
+		    "Mixed is empty\n");
+	    ctxt->nbErrors++;
+	    def = NULL;
+#if 0
+	} else if (node->children->next == NULL) {
+	    def = xmlRelaxNGNewDefine(ctxt, node);
+	    if (def == NULL)
+		return(NULL);
+	    def->type = XML_RELAXNG_MIXED;
+#endif
+	} else {
+	    def = xmlRelaxNGParseInterleave(ctxt, node);
+	    if (def != NULL) {
+		xmlRelaxNGDefinePtr tmp;
+		tmp = xmlRelaxNGNewDefine(ctxt, node);
+		if (tmp == NULL)
+		    return(def);
+		tmp->type = XML_RELAXNG_TEXT;
+		tmp->next = def->content;
+		def->content = tmp;
+	    }
+	}
     } else {
 	if (ctxt->error != NULL)
 	    ctxt->error(ctxt->userData,
@@ -2760,6 +2859,9 @@
 		case XML_RELAXNG_OPTIONAL:
 		case XML_RELAXNG_CHOICE:
 		case XML_RELAXNG_GROUP:
+#if 0
+		case XML_RELAXNG_MIXED:
+#endif
 		case XML_RELAXNG_INTERLEAVE:
 		    ret->content = cur;
 		    cur->parent = ret;
@@ -2890,6 +2992,23 @@
 	ret->name = val;
 	val = xmlGetProp(node, BAD_CAST "ns");
 	ret->ns = val;
+	if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
+	    (val != NULL) &&
+	    (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
+	    ctxt->error(ctxt->userData,
+		"Attribute with namespace '%s' is not allowed\n",
+			val);
+	    ctxt->nbErrors++;
+	}
+	if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
+	    (val != NULL) &&
+	    (val[0] == 0) &&
+	    (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) {
+	    ctxt->error(ctxt->userData,
+		"Attribute with QName 'xmlns' is not allowed\n",
+			val);
+	    ctxt->nbErrors++;
+	}
     } else if (IS_RELAXNG(node, "anyName")) {
 	ret->name = NULL;
 	ret->ns = NULL;
@@ -2907,6 +3026,14 @@
 		    "nsName has no ns attribute\n");
 	    ctxt->nbErrors++;
 	}
+	if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
+	    (ret->ns != NULL) &&
+	    (xmlStrEqual(ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
+	    ctxt->error(ctxt->userData,
+		"Attribute with namespace '%s' is not allowed\n",
+			ret->ns);
+	    ctxt->nbErrors++;
+	}
 	if (node->children != NULL) {
 	    ret->nameClass =
 		xmlRelaxNGParseExceptNameClass(ctxt, node->children,
@@ -2924,8 +3051,7 @@
 
 	    child = node->children;
 	    while (child != NULL) {
-		tmp = xmlRelaxNGParseExceptNameClass(ctxt, child,
-				   (def->type == XML_RELAXNG_ATTRIBUTE));
+		tmp = xmlRelaxNGParseNameClass(ctxt, child, def);
 		if (tmp != NULL) {
 		    if (last == NULL) {
 			last = ret->nameClass = tmp;
@@ -3011,6 +3137,9 @@
 		case XML_RELAXNG_OPTIONAL:
 		case XML_RELAXNG_CHOICE:
 		case XML_RELAXNG_GROUP:
+#if 0
+		case XML_RELAXNG_MIXED:
+#endif
 		case XML_RELAXNG_INTERLEAVE:
 		    if (last == NULL) {
 			ret->content = last = cur;
@@ -3905,8 +4034,19 @@
 		if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
 		    xmlChar *href, *ns, *base, *URL;
 		    xmlRelaxNGDocumentPtr docu;
+		    xmlNodePtr tmp;
 
 		    ns = xmlGetProp(cur, BAD_CAST "ns");
+		    if (ns == NULL) {
+			tmp = cur->parent;
+			while ((tmp != NULL) &&
+			       (tmp->type == XML_ELEMENT_NODE)) {
+			    ns = xmlGetProp(tmp, BAD_CAST "ns");
+			    if (ns != NULL)
+				break;
+			    tmp = tmp->parent;
+			}
+		    }
 		    href = xmlGetProp(cur, BAD_CAST "href");
 		    if (href == NULL) {
 			if (ctxt->error != NULL)
@@ -3947,8 +4087,9 @@
 		    xmlFree(URL);
 		    cur->_private = docu;
 		} else if (xmlStrEqual(cur->name, BAD_CAST "include")) {
-		    xmlChar *href, *base, *URL;
+		    xmlChar *href, *ns, *base, *URL;
 		    xmlRelaxNGIncludePtr incl;
+		    xmlNodePtr tmp;
 
 		    href = xmlGetProp(cur, BAD_CAST "href");
 		    if (href == NULL) {
@@ -3977,7 +4118,20 @@
 			xmlFree(href);
 		    if (base != NULL)
 			xmlFree(base);
-		    incl = xmlRelaxNGLoadInclude(ctxt, URL, cur);
+		    ns = xmlGetProp(cur, BAD_CAST "ns");
+		    if (ns == NULL) {
+			tmp = cur->parent;
+			while ((tmp != NULL) &&
+			       (tmp->type == XML_ELEMENT_NODE)) {
+			    ns = xmlGetProp(tmp, BAD_CAST "ns");
+			    if (ns != NULL)
+				break;
+			    tmp = tmp->parent;
+			}
+		    }
+		    incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns);
+		    if (ns != NULL)
+			xmlFree(ns);
 		    if (incl == NULL) {
 			if (ctxt->error != NULL)
 			    ctxt->error(ctxt->userData,
@@ -4094,19 +4248,30 @@
 		 * into a div
 		 */
 		if (xmlStrEqual(cur->name, BAD_CAST "div")) {
+		    xmlChar *ns;
+		    xmlNodePtr child, ins, tmp;
+
 		    /*
 		     * implements rule 4.11
 		     */
-		    xmlNodePtr child, ins, tmp;
+
+		    ns = xmlGetProp(cur, BAD_CAST "ns");
 
 		    child = cur->children;
 		    ins = cur;
 		    while (child != NULL) {
+			if (ns != NULL) {
+			    if (!xmlHasProp(child, BAD_CAST "ns")) {
+				xmlSetProp(child, BAD_CAST "ns", ns);
+			    }
+			}
 			tmp = child->next;
 			xmlUnlinkNode(child);
 			ins = xmlAddNextSibling(ins, child);
 			child = tmp;
 		    }
+		    if (ns != NULL)
+			xmlFree(ns);
 		    delete = cur;
 		    goto skip_children;
 		}
@@ -4427,10 +4592,17 @@
 	    fprintf(output, "</parentRef>\n");
 	    break;
 	case XML_RELAXNG_EXTERNALREF:
-	    fprintf(output, "<externalRef");
+	    fprintf(output, "<externalRef>");
 	    xmlRelaxNGDumpDefines(output, define->content);
 	    fprintf(output, "</externalRef>\n");
 	    break;
+#if 0
+	case XML_RELAXNG_MIXED:
+	    fprintf(output, "<mixed>");
+	    xmlRelaxNGDumpDefines(output, define->content);
+	    fprintf(output, "</mixed>\n");
+	    break;
+#endif
         case XML_RELAXNG_DATATYPE:
         case XML_RELAXNG_VALUE:
 	    TODO
@@ -4653,6 +4825,17 @@
 	return(-1);
 	ret = -1;
     }
+    if ((ret == 0) && (define->content != NULL)) {
+	const xmlChar *oldvalue, *oldendvalue;
+
+	oldvalue = ctxt->state->value;
+	oldendvalue = ctxt->state->endvalue;
+	ctxt->state->value = (xmlChar *) value;
+	ctxt->state->endvalue = NULL;
+	ret = xmlRelaxNGValidateValue(ctxt, define->content);
+	ctxt->state->value = (xmlChar *) oldvalue;
+	ctxt->state->endvalue = (xmlChar *) oldendvalue;
+    }
     return(ret);
 }
 
@@ -4769,6 +4952,8 @@
 			xmlFree(nvalue);
 		}
 	    }
+	    if (ret == 0)
+		xmlRelaxNGNextValue(ctxt);
 	    break;
 	}
 	case XML_RELAXNG_DATATYPE: {
@@ -4795,11 +4980,16 @@
 		list = list->next;
 	    }
 	    ctxt->flags = oldflags;
+	    if (ret == 0)
+		xmlRelaxNGNextValue(ctxt);
 	    break;
 	}
 	case XML_RELAXNG_LIST: {
 	    xmlRelaxNGDefinePtr list = define->content;
 	    xmlChar *oldvalue, *oldend, *val, *cur;
+#ifdef DEBUG_LIST
+	    int nb_values = 0;
+#endif
 
 	    oldvalue = ctxt->state->value;
 	    oldend = ctxt->state->endvalue;
@@ -4812,10 +5002,22 @@
 	    }
 	    cur = val;
 	    while (*cur != 0) {
-		if (IS_BLANK(*cur))
+		if (IS_BLANK(*cur)) {
 		    *cur = 0;
-		cur++;
+		    cur++;
+#ifdef DEBUG_LIST
+		    nb_values++;
+#endif
+		    while (IS_BLANK(*cur))
+			*cur++ = 0;
+		} else
+		    cur++;
 	    }
+#ifdef DEBUG_LIST
+	    xmlGenericError(xmlGenericErrorContext,
+		    "list value: '%s' found %d items\n", oldvalue, nb_values);
+	    nb_values = 0;
+#endif 
 	    ctxt->state->endvalue = cur;
 	    cur = val;
 	    while ((*cur == 0) && (cur != ctxt->state->endvalue)) cur++;
@@ -4825,8 +5027,16 @@
 	    while (list != NULL) {
 		ret = xmlRelaxNGValidateValue(ctxt, list);
 		if (ret != 0) {
+#ifdef DEBUG_LIST
+		    xmlGenericError(xmlGenericErrorContext,
+			"Failed to validate value: '%s' with %d rule\n",
+		                    ctxt->state->value, nb_values);
+#endif
 		    break;
 		}
+#ifdef DEBUG_LIST
+		nb_values++;
+#endif
 		list = list->next;
 	    }
 	    if ((ret == 0) && (ctxt->state->value != NULL) &&
@@ -4867,6 +5077,21 @@
 	    ctxt->flags = oldflags;
 	    break;
 	}
+        case XML_RELAXNG_EXCEPT: {
+	    xmlRelaxNGDefinePtr list;
+
+	    list = define->content;
+	    while (list != NULL) {
+		ret = xmlRelaxNGValidateValue(ctxt, list);
+		if (ret == 0) {
+		    ret = -1;
+		    break;
+		} else 
+		    ret = 0;
+		list = list->next;
+	    }
+	    break;
+	}
 	default:
 	    TODO
 	    ret = -1;
@@ -5433,6 +5658,80 @@
 }
 
 /**
+ * xmlRelaxNGElementMatch:
+ * @ctxt:  a Relax-NG validation context
+ * @define:  the definition to check
+ * @elem:  the element
+ *
+ * Check if the element matches the definition nameClass
+ *
+ * Returns 1 if the element matches, 0 if no, or -1 in case of error
+ */
+static int
+xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, 
+	               xmlRelaxNGDefinePtr define,
+		       xmlNodePtr elem) {
+    int ret, oldflags;
+
+    if (define->name != NULL) {
+	if (!xmlStrEqual(elem->name, define->name)) {
+	    VALID_CTXT();
+	    VALID_ERROR3("Expecting element %s, got %s\n",
+			define->name, elem->name);
+	    return(0);
+	}
+    }
+    if ((define->ns != NULL) && (define->ns[0] != 0)) {
+	if (elem->ns == NULL) {
+	    VALID_CTXT();
+	    VALID_ERROR2("Expecting a namespace for element %s\n",
+			elem->name);
+	    return(0);
+	} else if (!xmlStrEqual(elem->ns->href, define->ns)) {
+	    VALID_CTXT();
+	    VALID_ERROR3("Expecting element %s has wrong namespace: expecting %s\n",
+			elem->name, define->ns);
+	    return(0);
+	}
+    } else if (define->name != NULL) {
+	if (elem->ns != NULL) {
+	    VALID_CTXT();
+	    VALID_ERROR2("Expecting no namespace for element %s\n",
+			define->name);
+	    return(0);
+	}
+    }
+
+    if (define->nameClass == NULL)
+	return(1);
+
+    define = define->nameClass;
+    if (define->type == XML_RELAXNG_EXCEPT) {
+	xmlRelaxNGDefinePtr list;
+	oldflags = ctxt->flags;
+	ctxt->flags |= FLAGS_IGNORABLE;
+
+	list = define->content;
+	while (list != NULL) {
+	    ret = xmlRelaxNGElementMatch(ctxt, list, elem);
+	    if (ret == 1) {
+		ctxt->flags = oldflags;
+		return(0);
+	    }
+	    if (ret < 0) {
+		ctxt->flags = oldflags;
+		return(ret);
+	    }
+	    list = list->next;
+	}
+	ctxt->flags = oldflags;
+    } else {
+	TODO
+    }
+    return(1);
+}
+
+/**
  * xmlRelaxNGValidateDefinition:
  * @ctxt:  a Relax-NG validation context
  * @define:  the definition to verify
@@ -5522,38 +5821,13 @@
 	     */
 	    if (node->_private == define)
 		break;
-	    if (define->name != NULL) {
-		if (!xmlStrEqual(node->name, define->name)) {
-		    VALID_CTXT();
-		    VALID_ERROR3("Expecting element %s, got %s\n",
-			        define->name, node->name);
-		    ret = -1;
-		    break;
-		}
+
+	    ret = xmlRelaxNGElementMatch(ctxt, define, node);
+	    if (ret <= 0) {
+		ret = -1;
+		break;
 	    }
-	    if ((define->ns != NULL) && (define->ns[0] != 0)) {
-		if (node->ns == NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR2("Expecting a namespace for element %s\n",
-			        node->name);
-		    ret = -1;
-		    break;
-		} else if (!xmlStrEqual(node->ns->href, define->ns)) {
-		    VALID_CTXT();
-		    VALID_ERROR3("Expecting element %s has wrong namespace: expecting %s\n",
-			        node->name, define->ns);
-		    ret = -1;
-		    break;
-		}
-	    } else if (define->name != NULL) {
-		if (node->ns != NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR2("Expecting no namespace for element %s\n",
-			        define->name);
-		    ret = -1;
-		    break;
-		}
-	    }
+	    ret = 0;
 	    
 	    state = xmlRelaxNGNewValidState(ctxt, node);
 	    if (state == NULL) {
@@ -5833,9 +6107,16 @@
 		xmlFree(content);
 	    break;
         }
+#if 0
+	case XML_RELAXNG_MIXED:
+	    TODO
+	    ret = -1;
+	    break;
+#endif
 	case XML_RELAXNG_START:
 	case XML_RELAXNG_EXCEPT:
 	    TODO
+	    ret = -1;
 	    break;
     }
     ctxt->depth--;
diff --git a/result/relaxng/spec1_err b/result/relaxng/spec1_err
index 9e1a6e0..d672705 100644
--- a/result/relaxng/spec1_err
+++ b/result/relaxng/spec1_err
@@ -1 +1 @@
-Unimplemented block at relaxng.c:5196
+Unimplemented block at relaxng.c:5502
diff --git a/result/relaxng/tutor10_1_4.err b/result/relaxng/tutor10_1_4.err
index 2086fb0..0378cea 100644
--- a/result/relaxng/tutor10_1_4.err
+++ b/result/relaxng/tutor10_1_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5455
+error detected at relaxng.c:5686
 Expecting a namespace for element foo
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor10_1_5.err b/result/relaxng/tutor10_1_5.err
index 9c448e9..e483ad8 100644
--- a/result/relaxng/tutor10_1_5.err
+++ b/result/relaxng/tutor10_1_5.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5461
+error detected at relaxng.c:5691
 Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor10_1_6.err b/result/relaxng/tutor10_1_6.err
index 9c448e9..e483ad8 100644
--- a/result/relaxng/tutor10_1_6.err
+++ b/result/relaxng/tutor10_1_6.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5461
+error detected at relaxng.c:5691
 Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor10_2_3.err b/result/relaxng/tutor10_2_3.err
index 2b656ed..0bf8041 100644
--- a/result/relaxng/tutor10_2_3.err
+++ b/result/relaxng/tutor10_2_3.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5469
+error detected at relaxng.c:5698
 Expecting no namespace for element foo
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor10_2_4.err b/result/relaxng/tutor10_2_4.err
index 2b656ed..0bf8041 100644
--- a/result/relaxng/tutor10_2_4.err
+++ b/result/relaxng/tutor10_2_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5469
+error detected at relaxng.c:5698
 Expecting no namespace for element foo
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor10_7_3.err b/result/relaxng/tutor10_7_3.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor10_7_3.err
+++ b/result/relaxng/tutor10_7_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor10_8_3.err b/result/relaxng/tutor10_8_3.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor10_8_3.err
+++ b/result/relaxng/tutor10_8_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor11_2_2.err b/result/relaxng/tutor11_2_2.err
index b4fc343..12657cf 100644
--- a/result/relaxng/tutor11_2_2.err
+++ b/result/relaxng/tutor11_2_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5524
+error detected at relaxng.c:5879
 Invalid attribute foo for element card
diff --git a/result/relaxng/tutor11_2_3.err b/result/relaxng/tutor11_2_3.err
index 477e537..384c886 100644
--- a/result/relaxng/tutor11_2_3.err
+++ b/result/relaxng/tutor11_2_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5524
+error detected at relaxng.c:5879
 Invalid attribute b for element card
diff --git a/result/relaxng/tutor12_1_err b/result/relaxng/tutor12_1_err
index 9e1a6e0..d672705 100644
--- a/result/relaxng/tutor12_1_err
+++ b/result/relaxng/tutor12_1_err
@@ -1 +1 @@
-Unimplemented block at relaxng.c:5196
+Unimplemented block at relaxng.c:5502
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 05208e7..6ed44be 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5446
+error detected at relaxng.c:5678
 Expecting element name, got email
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element card: email
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor3_7_err b/result/relaxng/tutor3_7_err
index 7d90f37..d203d70 100644
--- a/result/relaxng/tutor3_7_err
+++ b/result/relaxng/tutor3_7_err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5812
+error detected at relaxng.c:6174
 extra data on the document
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index 9b6ee15..d767e35 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5677
+error detected at relaxng.c:6032
 The data does not cover the full element bad
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index 39e9f46..dff42c3 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5524
+error detected at relaxng.c:5879
 Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 5565186..f20ab75 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element preferredFormat: text
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index 39e9f46..dff42c3 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5524
+error detected at relaxng.c:5879
 Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index ee868dd..bca8415 100644
--- a/result/relaxng/tutor7_1_2.err
+++ b/result/relaxng/tutor7_1_2.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:4564
+error detected at relaxng.c:4817
 Internal: failed to validate type float
-error detected at relaxng.c:5735
+error detected at relaxng.c:6090
 internal error validating list
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element vector: text
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index 04e88b8..4edebee 100644
--- a/result/relaxng/tutor7_1_3.err
+++ b/result/relaxng/tutor7_1_3.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:4753
+error detected at relaxng.c:5044
 Extra data in list: 5.6
-error detected at relaxng.c:5735
+error detected at relaxng.c:6090
 internal error validating list
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element vector: text
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index 970ed5e..80d04c6 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:4728
+error detected at relaxng.c:4999
 Internal: no state
-error detected at relaxng.c:5735
+error detected at relaxng.c:6090
 internal error validating list
diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err
index d13709e..7653463 100644
--- a/result/relaxng/tutor7_3_4.err
+++ b/result/relaxng/tutor7_3_4.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:4753
+error detected at relaxng.c:5044
 Extra data in list: 5.6
-error detected at relaxng.c:5735
+error detected at relaxng.c:6090
 internal error validating list
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element path: text
diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err
index bbb092a..1dec06d 100644
--- a/result/relaxng/tutor7_3_5.err
+++ b/result/relaxng/tutor7_3_5.err
@@ -1,6 +1,6 @@
-error detected at relaxng.c:4564
+error detected at relaxng.c:4817
 Internal: failed to validate type double
-error detected at relaxng.c:5735
+error detected at relaxng.c:6090
 internal error validating list
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element path: text
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
index c0563aa..9a08754 100644
--- a/result/relaxng/tutor8_2_4.err
+++ b/result/relaxng/tutor8_2_4.err
@@ -1,4 +1,4 @@
-Unimplemented block at relaxng.c:5196
-Unimplemented block at relaxng.c:5196
-error detected at relaxng.c:5511
+Unimplemented block at relaxng.c:5502
+Unimplemented block at relaxng.c:5502
+error detected at relaxng.c:5866
 Extra content for element head: meta
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
index f25449a..8890db3 100644
--- a/result/relaxng/tutor8_2_5.err
+++ b/result/relaxng/tutor8_2_5.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:5427
+error detected at relaxng.c:5807
 Expecting an element, got empty
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element head: meta
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
index ab81255..7301b17 100644
--- a/result/relaxng/tutor8_2_6.err
+++ b/result/relaxng/tutor8_2_6.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element head: base
diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor9_5_2.err
+++ b/result/relaxng/tutor9_5_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor9_5_3.err
+++ b/result/relaxng/tutor9_5_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor9_6_2.err
+++ b/result/relaxng/tutor9_6_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card
diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err
index eca41dd..c9a8556 100644
--- a/result/relaxng/tutor9_6_3.err
+++ b/result/relaxng/tutor9_6_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:5511
+error detected at relaxng.c:5866
 Extra content for element addressBook: card