after and exchange with James Clark it appeared I had bug in URI parsing

* test/xsdtest/xsdtest.xml uri.c: after and exchange with James
  Clark it appeared I had bug in URI parsing code ...
* relaxng.c include/libxml/relaxng.h: completely revamped error
  reporting to not loose message from optional parts.
* xmllint.c: added timing for RNG validation steps
* result/relaxng/*: updated the result, all error messages changed
Daniel
diff --git a/ChangeLog b/ChangeLog
index 32c25f4..31fbd80 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Fri Mar  7 19:29:40 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* test/xsdtest/xsdtest.xml uri.c: after and exchange with James
+	  Clark it appeared I had bug in URI parsing code ...
+	* relaxng.c include/libxml/relaxng.h: completely revamped error
+	  reporting to not loose message from optional parts.
+	* xmllint.c: added timing for RNG validation steps
+	* result/relaxng/*: updated the result, all error messages changed
+
 Fri Mar  7 15:18:32 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* xpath.c: fix bug #107804, the algorithm used for document order
diff --git a/include/libxml/relaxng.h b/include/libxml/relaxng.h
index 788864d..8add822 100644
--- a/include/libxml/relaxng.h
+++ b/include/libxml/relaxng.h
@@ -28,6 +28,44 @@
 typedef xmlRelaxNGValidCtxt *xmlRelaxNGValidCtxtPtr;
 
 /*
+ * xmlRelaxNGValidErr:
+ *
+ * List of possible Relax NG validation errors
+ */
+typedef enum {
+    XML_RELAXNG_OK = 0,
+    XML_RELAXNG_ERR_MEMORY,
+    XML_RELAXNG_ERR_TYPE,
+    XML_RELAXNG_ERR_TYPEVAL,
+    XML_RELAXNG_ERR_TYPECMP,
+    XML_RELAXNG_ERR_NOSTATE,
+    XML_RELAXNG_ERR_NODEFINE,
+    XML_RELAXNG_ERR_LISTEXTRA,
+    XML_RELAXNG_ERR_INTERNODATA,
+    XML_RELAXNG_ERR_INTERSEQ,
+    XML_RELAXNG_ERR_INTEREXTRA,
+    XML_RELAXNG_ERR_ELEMNAME,
+    XML_RELAXNG_ERR_ELEMNONS,
+    XML_RELAXNG_ERR_ELEMWRONGNS,
+    XML_RELAXNG_ERR_ELEMEXTRANS,
+    XML_RELAXNG_ERR_ELEMNOTEMPTY,
+    XML_RELAXNG_ERR_NOELEM,
+    XML_RELAXNG_ERR_NOTELEM,
+    XML_RELAXNG_ERR_ATTRVALID,
+    XML_RELAXNG_ERR_CONTENTVALID,
+    XML_RELAXNG_ERR_EXTRACONTENT,
+    XML_RELAXNG_ERR_INVALIDATTR,
+    XML_RELAXNG_ERR_DATAELEM,
+    XML_RELAXNG_ERR_VALELEM,
+    XML_RELAXNG_ERR_LISTELEM,
+    XML_RELAXNG_ERR_DATATYPE,
+    XML_RELAXNG_ERR_VALUE,
+    XML_RELAXNG_ERR_LIST,
+    XML_RELAXNG_ERR_NOGRAMMAR,
+    XML_RELAXNG_ERR_EXTRADATA
+} xmlRelaxNGValidErr;
+
+/*
  * Interfaces for parsing.
  */
 xmlRelaxNGParserCtxtPtr xmlRelaxNGNewParserCtxt	(const char *URL);
diff --git a/relaxng.c b/relaxng.c
index 018c1c7..f8e0b9f 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -46,7 +46,7 @@
     (xmlStrEqual(node->ns->href, xmlRelaxNGNs)))
 
 
-/* #define DEBUG 1 */                /* very verbose output */
+/* #define DEBUG 1 */               /* very verbose output */
 /* #define DEBUG_GRAMMAR 1 */
 /* #define DEBUG_CONTENT 1 */
 /* #define DEBUG_TYPE 1 */
@@ -159,12 +159,6 @@
     void *_private;	/* unused by the library for users or bindings */
 };
 
-typedef enum {
-    XML_RELAXNG_ERR_OK		= 0,
-    XML_RELAXNG_ERR_NOROOT	= 1,
-    XML_RELAXNG_ERR_
-} xmlRelaxNGValidError;
-
 #define XML_RELAXNG_IN_ATTRIBUTE	(1 << 0)
 #define XML_RELAXNG_IN_ONEORMORE	(1 << 1)
 #define XML_RELAXNG_IN_LIST		(1 << 2)
@@ -180,7 +174,7 @@
     void *userData;			/* user specific data block */
     xmlRelaxNGValidityErrorFunc error;	/* the callback in case of errors */
     xmlRelaxNGValidityWarningFunc warning;/* the callback in case of warning */
-    xmlRelaxNGValidError err;
+    xmlRelaxNGValidErr err;
 
     xmlRelaxNGPtr      schema;        /* The schema in use */
     xmlRelaxNGGrammarPtr grammar;     /* the current grammar */
@@ -266,6 +260,21 @@
 };
 
 /**
+ * xmlRelaxNGValidError:
+ *
+ * A RelaxNGs validation error
+ */
+typedef struct _xmlRelaxNGValidError xmlRelaxNGValidError;
+typedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr;
+struct _xmlRelaxNGValidError {
+    xmlRelaxNGValidErr	err;	/* the error number */
+    xmlNodePtr		node;	/* the current node */
+    xmlNodePtr		seq;	/* the current child */
+    const xmlChar *	arg1;	/* first arg */
+    const xmlChar *	arg2;	/* second arg */
+};
+
+/**
  * xmlRelaxNGValidCtxt:
  *
  * A RelaxNGs validation context
@@ -281,6 +290,15 @@
     xmlRelaxNGValidStatePtr state;	/* the current validation state */
     int                     flags;	/* validation flags */
     int                     depth;	/* validation depth */
+
+    /*
+     * Errors accumulated in branches may have to be stacked to be
+     * provided back when it's sure they affect validation.
+     */
+    xmlRelaxNGValidErrorPtr err;        /* Last error */
+    int                     errNr;      /* Depth of the error stack */
+    int                     errMax;     /* Max depth of the error stack */
+    xmlRelaxNGValidErrorPtr errTab;	/* stack of errors */
 };
 
 /**
@@ -1139,6 +1157,82 @@
 }
 
 /**
+ * xmlRelaxNGValidErrorPush:
+ * @ctxt:  the validation context
+ * @err:  the error code
+ * @arg1:  the first string argument
+ * @arg2:  the second string argument
+ *
+ * Pushes a new error on top of the error stack
+ *
+ * Returns 0 in case of error, the index in the stack otherwise
+ */
+static int
+xmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err,
+	const xmlChar *arg1, const xmlChar *arg2)
+{
+    xmlRelaxNGValidErrorPtr cur;
+    if (ctxt->errTab == NULL) {
+	ctxt->errMax = 8;
+	ctxt->errNr = 0;
+	ctxt->errTab = (xmlRelaxNGValidErrorPtr) xmlMalloc(
+		        ctxt->errMax * sizeof(xmlRelaxNGValidError));
+        if (ctxt->errTab == NULL) {
+            xmlGenericError(xmlGenericErrorContext, "malloc failed !\n");
+            return (0);
+        }
+    }
+    if (ctxt->errNr >= ctxt->errMax) {
+        ctxt->errMax *= 2;
+        ctxt->errTab =
+            (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab,
+			      ctxt->errMax * sizeof(xmlRelaxNGValidError));
+        if (ctxt->errTab == NULL) {
+            xmlGenericError(xmlGenericErrorContext, "realloc failed !\n");
+            return (0);
+        }
+    }
+    cur = &ctxt->errTab[ctxt->errNr];
+    cur->err = err;
+    cur->arg1 = arg1;
+    cur->arg2 = arg2;
+    if (ctxt->state != NULL) {
+	cur->node = ctxt->state->node;
+	cur->seq = ctxt->state->seq;
+    } else {
+	cur->node = NULL;
+	cur->seq = NULL;
+    }
+    ctxt->err = cur;
+    return (ctxt->errNr++);
+}
+
+/**
+ * xmlRelaxNGValidErrorPop:
+ * @ctxt: the validation context
+ *
+ * Pops the top error from the error stack
+ *
+ * Returns the error just removed
+ */
+static xmlRelaxNGValidErrorPtr
+xmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
+{
+    xmlRelaxNGValidErrorPtr ret;
+
+    if (ctxt->errNr <= 0)
+        return (NULL);
+    ctxt->errNr--;
+    if (ctxt->errNr > 0)
+        ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
+    else
+        ctxt->err = NULL;
+    ret = &ctxt->errTab[ctxt->errNr];
+    return (ret);
+}
+
+
+/**
  * xmlRelaxNGDocumentPush:
  * @ctxt:  the parser context
  * @value:  the element doc
@@ -1303,21 +1397,9 @@
  * 									*
  ************************************************************************/
 
-#define VALID_CTXT() 							\
-    if (((ctxt->flags & 1) == 0) || (ctxt->flags & 2))			\
-         xmlGenericError(xmlGenericErrorContext,			\
-	    "error detected at %s:%d\n",				\
-            __FILE__, __LINE__);
-
-#define VALID_ERROR(a)							\
-    if (((ctxt->flags & 1) == 0) || (ctxt->flags & 2))			\
-        if (ctxt->error != NULL) ctxt->error(ctxt->userData, a)
-#define VALID_ERROR2(a, b)						\
-    if (((ctxt->flags & 1) == 0) || (ctxt->flags & 2))			\
-        if (ctxt->error != NULL) ctxt->error(ctxt->userData, a, b)
-#define VALID_ERROR3(a, b, c)						\
-    if (((ctxt->flags & 1) == 0) || (ctxt->flags & 2))			\
-        if (ctxt->error != NULL) ctxt->error(ctxt->userData, a, b, c)
+#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL);
+#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL);
+#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c);
 
 #ifdef DEBUG
 static const char *
@@ -1350,19 +1432,137 @@
 }
 #endif
 
-#if 0
 /**
- * xmlRelaxNGErrorContext:
- * @ctxt:  the parsing context
- * @schema:  the schema being built
- * @node:  the node being processed
- * @child:  the child being processed
+ * xmlRelaxNGGetErrorString:
+ * @err:  the error code
+ * @arg1:  the first string argument
+ * @arg2:  the second string argument
  *
- * Dump a RelaxNGType structure
+ * computes a formatted error string for the given error code and args
+ *
+ * Returns the error string, it must be deallocated by the caller
+ */
+static xmlChar *
+xmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar *arg1,
+	                 const xmlChar *arg2) {
+    char msg[1000];
+
+    if (arg1 == NULL)
+	arg1 = BAD_CAST "";
+    if (arg2 == NULL)
+	arg2 = BAD_CAST "";
+
+    msg[0] = 0;
+    switch (err) {
+	case XML_RELAXNG_OK:
+	    return(NULL);
+	case XML_RELAXNG_ERR_MEMORY:
+	    return(xmlCharStrdup("out of memory"));
+        case XML_RELAXNG_ERR_TYPE:
+	    snprintf(msg, 1000, "failed to validate type %s", arg1);
+	    break;
+	case XML_RELAXNG_ERR_TYPEVAL:
+	    snprintf(msg, 1000, "Type %s doesn't allow value %s", arg1, arg2);
+	    break;
+	case XML_RELAXNG_ERR_TYPECMP:
+	    snprintf(msg, 1000, "failed to compare type %s", arg1);
+	    break;
+	case XML_RELAXNG_ERR_NOSTATE:
+	    return(xmlCharStrdup("Internal error: no state"));
+	case XML_RELAXNG_ERR_NODEFINE:
+	    return(xmlCharStrdup("Internal error: no define"));
+	case XML_RELAXNG_ERR_LISTEXTRA:
+	    snprintf(msg, 1000, "Extra data in list: %s", arg1);
+	    break;
+	case XML_RELAXNG_ERR_INTERNODATA:
+	    return(xmlCharStrdup("Internal: interleave block has no data"));
+	case XML_RELAXNG_ERR_INTERSEQ:
+	    return(xmlCharStrdup("Invalid sequence in interleave"));
+	case XML_RELAXNG_ERR_INTEREXTRA:
+	    snprintf(msg, 1000, "Extra element %s in interleave", arg1);
+	    break;
+	case XML_RELAXNG_ERR_ELEMNAME:
+	    snprintf(msg, 1000, "Expecting element %s, got %s", arg1, arg2);
+	    break;
+	case XML_RELAXNG_ERR_ELEMNONS:
+	    snprintf(msg, 1000, "Expecting a namespace for element %s", arg1);
+	    break;
+	case XML_RELAXNG_ERR_ELEMWRONGNS:
+	    snprintf(msg, 1000, "Element %s has wrong namespace: expecting %s",
+		     arg1, arg2);
+	    break;
+	case XML_RELAXNG_ERR_ELEMEXTRANS:
+	    snprintf(msg, 1000, "Expecting no namespace for element %s", arg1);
+	    break;
+	case XML_RELAXNG_ERR_ELEMNOTEMPTY:
+	    snprintf(msg, 1000, "Expecting element %s to be empty", arg1);
+	    break;
+	case XML_RELAXNG_ERR_NOELEM:
+	    snprintf(msg, 1000, "Expecting an element %s, got nothing", arg1);
+	    break;
+	case XML_RELAXNG_ERR_NOTELEM:
+	    return(xmlCharStrdup("Expecting an element got text"));
+	case XML_RELAXNG_ERR_ATTRVALID:
+	    snprintf(msg, 1000, "Element %s failed to validate attributes",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_CONTENTVALID:
+	    snprintf(msg, 1000, "Element %s failed to validate content",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_EXTRACONTENT:
+	    snprintf(msg, 1000, "Element %s has extra content: %s",
+		     arg1, arg2);
+	    break;
+	case XML_RELAXNG_ERR_INVALIDATTR:
+	    snprintf(msg, 1000, "Invalid attribute %s for element %s",
+		     arg1, arg2);
+	    break;
+	case XML_RELAXNG_ERR_DATAELEM:
+	    snprintf(msg, 1000, "Datatype element %s has child elements",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_VALELEM:
+	    snprintf(msg, 1000, "Value element %s has child elements",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_LISTELEM:
+	    snprintf(msg, 1000, "List element %s has child elements",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_DATATYPE:
+	    snprintf(msg, 1000, "Error validating datatype %s",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_VALUE:
+	    snprintf(msg, 1000, "Error validating value %s",
+		     arg1);
+	    break;
+	case XML_RELAXNG_ERR_LIST:
+	    return(xmlCharStrdup("Error validating list"));
+	case XML_RELAXNG_ERR_NOGRAMMAR:
+	    return(xmlCharStrdup("No top grammar defined"));
+	case XML_RELAXNG_ERR_EXTRADATA:
+	    return(xmlCharStrdup("Extra data in the document"));
+    }
+    if (msg[0] == 0) {
+	snprintf(msg, 1000, "Unknown error code %d", err);
+    }
+    msg[1000] = 0;
+    return(xmlStrdup((xmlChar *) msg));
+}
+
+/**
+ * xmlRelaxNGValidErrorContext:
+ * @ctxt:  the validation context
+ * @node:  the node
+ * @child:  the node child generating the problem.
+ *
+ * Dump informations about the kocation of the error in the instance
  */
 static void
-xmlRelaxNGErrorContext(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGPtr schema,
-                      xmlNodePtr node, xmlNodePtr child)
+xmlRelaxNGValidErrorContext(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node,
+	                    xmlNodePtr child)
 {
     int line = 0;
     const xmlChar *file = NULL;
@@ -1401,10 +1601,7 @@
 	}
     } 
     
-    if (ctxt != NULL)
-	type = "compilation error";
-    else if (schema != NULL)
-	type = "runtime error";
+    type = "RNG validity error";
 
     if ((file != NULL) && (line != 0) && (name != NULL))
 	ctxt->error(ctxt->userData, "%s: file %s line %d element %s\n",
@@ -1421,7 +1618,99 @@
     else
 	ctxt->error(ctxt->userData, "%s\n", type);
 }
-#endif
+
+/**
+ * xmlRelaxNGShowValidError:
+ * @ctxt:  the validation context
+ * @err:  the error number
+ * @node:  the node
+ * @child:  the node child generating the problem.
+ * @arg1:  the first argument
+ * @arg2:  the second argument
+ *
+ * Show a validation error.
+ */
+static void
+xmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err,
+	                 xmlNodePtr node, xmlNodePtr child,
+			 const xmlChar *arg1, const xmlChar *arg2)
+{
+    xmlChar *msg;
+
+    if (ctxt->error == NULL)
+        return;
+
+    msg = xmlRelaxNGGetErrorString(err, arg1, arg2);
+    if (msg == NULL)
+	return;
+
+    xmlRelaxNGValidErrorContext(ctxt, node, child);
+    ctxt->error(ctxt->userData, "%s\n", msg);
+    xmlFree(msg);
+}
+
+/**
+ * xmlRelaxNGDumpValidError:
+ * @ctxt:  the validation context
+ *
+ * Show all validation error over a given index.
+ */
+static void
+xmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt) {
+    int i;
+    xmlRelaxNGValidErrorPtr err;
+
+    for (i = 0;i < ctxt->errNr;i++) {
+	err = &ctxt->errTab[i];
+	xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq,
+		                 err->arg1, err->arg2);
+    }
+    ctxt->errNr = 0;
+}
+/**
+ * xmlRelaxNGAddValidError:
+ * @ctxt:  the validation context
+ * @err:  the error number
+ * @arg1:  the first argument
+ * @arg2:  the second argument
+ *
+ * Register a validation error, either generating it if it's sure
+ * or stacking it for later handling if unsure.
+ */
+static void
+xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, xmlRelaxNGValidErr err,
+			const xmlChar *arg1, const xmlChar *arg2)
+{
+    if ((ctxt == NULL) || (ctxt->error == NULL))
+	return;
+
+    /*
+     * generate the error directly
+     */
+    if (((ctxt->flags & 1) == 0) || (ctxt->flags & 2)) {
+	xmlNodePtr node, seq;
+	/*
+	 * Flush first any stacked error which might be the
+	 * real cause of the problem.
+	 */
+	if (ctxt->errNr != 0)
+	    xmlRelaxNGDumpValidError(ctxt);
+	if (ctxt->state != NULL) {
+	    node = ctxt->state->node;
+	    seq = ctxt->state->seq;
+	} else {
+	    node = seq = NULL;
+	}
+	xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2);
+    }
+    /*
+     * Stack the error for later processing if needed
+     */
+    else {
+	xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2);
+    }
+}
+
 
 /************************************************************************
  * 									*
@@ -1509,7 +1798,7 @@
  * Returns 1 if yes, 0 if no and -1 in case of error.
  */
 static int
-xmlRelaxNGSchemaFacetCheck (void *data, const xmlChar *type,
+xmlRelaxNGSchemaFacetCheck (void *data ATTRIBUTE_UNUSED, const xmlChar *type,
 	                    const xmlChar *facetname, const xmlChar *val,
 			    const xmlChar *strval, void *value) {
     xmlSchemaFacetPtr facet;
@@ -2193,6 +2482,8 @@
     xmlRelaxNGValidCtxt ctxt;
     ctxt.flags = FLAGS_IGNORABLE;
 
+    memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt));
+
     if ((def1->type == XML_RELAXNG_ELEMENT) ||
 	(def1->type == XML_RELAXNG_ATTRIBUTE)) {
 	if (def2->type == XML_RELAXNG_TEXT)
@@ -5899,8 +6190,7 @@
     ret = (xmlChar *) xmlMalloc((len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
 	if (ctxt != NULL) {
-	    VALID_CTXT();
-	    VALID_ERROR("xmlRelaxNGNormalize: out of memory\n");
+	    VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 	} else {
 	    xmlGenericError(xmlGenericErrorContext,
 		"xmlRelaxNGNormalize: out of memory\n");
@@ -5954,16 +6244,14 @@
     } else 
 	ret = -1;
     if (ret < 0) {
-	VALID_CTXT();
-	VALID_ERROR2("failed to validate type %s\n", define->name);
+	VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name);
 	if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
 	    lib->freef(lib->data, result);
 	return(-1);
     } else if (ret == 1) {
 	ret = 0;
     } else {
-	VALID_CTXT();
-	VALID_ERROR3("Type %s doesn't allow value %s\n", define->name, value);
+	VALID_ERR3(XML_RELAXNG_ERR_TYPEVAL, define->name, value);
 	ret = -1;
     }
     cur = define->attrs;
@@ -6084,9 +6372,7 @@
 		    else
 			ret = -1;
 		    if (ret < 0) {
-			VALID_CTXT();
-			VALID_ERROR2("Internal: failed to compare type %s\n",
-				    define->name);
+			VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, define->name);
 			return(-1);
 		    } else if (ret == 1) {
 			ret = 0;
@@ -6140,6 +6426,12 @@
 		list = list->next;
 	    }
 	    ctxt->flags = oldflags;
+	    if (ret != 0) {
+		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
+		    xmlRelaxNGDumpValidError(ctxt);
+	    } else {
+		ctxt->errNr = 0;
+	    }
 	    if (ret == 0)
 		xmlRelaxNGNextValue(ctxt);
 	    break;
@@ -6159,8 +6451,7 @@
 		val = xmlStrdup(BAD_CAST "");
 	    }
 	    if (val == NULL) {
-		VALID_CTXT();
-		VALID_ERROR("Internal: no state\n");
+		VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
 		return(-1);
 	    }
 	    cur = val;
@@ -6207,8 +6498,7 @@
 
 	    if ((ret == 0) && (ctxt->state->value != NULL) &&
 		(ctxt->state->value != ctxt->state->endvalue)) {
-		VALID_CTXT();
-		VALID_ERROR2("Extra data in list: %s\n", ctxt->state->value);
+		VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, ctxt->state->value);
 		ret = -1;
 	    }
 	    xmlFree(val);
@@ -6241,6 +6531,12 @@
 		cur = ctxt->state->value;
 	    }
 	    ctxt->flags = oldflags;
+	    if (ret != 0) {
+		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
+		    xmlRelaxNGDumpValidError(ctxt);
+	    } else {
+		ctxt->errNr = 0;
+	    }
 	    break;
 	}
         case XML_RELAXNG_EXCEPT: {
@@ -6538,6 +6834,8 @@
 xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, 
 	                     xmlRelaxNGDefinePtr define) {
     int ret = 0, i, nbgroups, left;
+    int errNr = ctxt->errNr;
+
     xmlRelaxNGPartitionPtr partitions;
     xmlRelaxNGInterleaveGroupPtr group = NULL;
     xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem;
@@ -6548,8 +6846,7 @@
 	nbgroups = partitions->nbgroups;
 	left = nbgroups;
     } else {
-	VALID_CTXT();
-	VALID_ERROR("Internal: interleave block has no data\n");
+	VALID_ERR(XML_RELAXNG_ERR_INTERNODATA);
 	return(-1);
     }
 
@@ -6559,15 +6856,13 @@
      */
     list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
     if (list == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("Internal: out of memory in interleave check\n");
+	VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 	return(-1);
     }
     memset(list, 0, nbgroups * sizeof(xmlNodePtr));
     lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
     if (lasts == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("Internal: out of memory in interleave check\n");
+	VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 	return(-1);
     }
     memset(lasts, 0, nbgroups * sizeof(xmlNodePtr));
@@ -6608,8 +6903,7 @@
 	cur = xmlRelaxNGSkipIgnored(ctxt, cur->next);
     }
     if (ret != 0) {
-	VALID_CTXT();
-	VALID_ERROR("Invalid sequence in interleave\n");
+	VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
 	ret = -1;
 	goto done;
     }
@@ -6627,8 +6921,7 @@
 	cur = ctxt->state->seq;
 	cur = xmlRelaxNGSkipIgnored(ctxt, cur);
 	if (cur != NULL) {
-	    VALID_CTXT();
-	    VALID_ERROR2("Extra element %s in interleave\n", cur->name);
+	    VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
 	    ret = -1;
 	    goto done;
 	}
@@ -6638,8 +6931,7 @@
     }
     ctxt->state->seq = lastelem;
     if (ret != 0) {
-	VALID_CTXT();
-	VALID_ERROR("Invalid sequence in interleave\n");
+	VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
 	ret = -1;
 	goto done;
     }
@@ -6655,6 +6947,9 @@
 	cur->prev->next = cur;
 	cur = cur->prev;
     }
+    if (ret == 0) {
+	ctxt->errNr = errNr;
+    }
 
     xmlFree(list);
     xmlFree(lasts);
@@ -6676,8 +6971,7 @@
     int ret = 0, res;
 
     if (ctxt->state == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("Internal: no state\n");
+	VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
 	return(-1);
     }
     while (defines != NULL) {
@@ -6708,33 +7002,27 @@
 
     if (define->name != NULL) {
 	if (!xmlStrEqual(elem->name, define->name)) {
-	    VALID_CTXT();
-	    VALID_ERROR3("Expecting element %s, got %s\n",
-			define->name, elem->name);
+	    VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, 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",
+	    VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS,
 			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",
+	    VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS,
 			elem->name, define->ns);
 	    return(0);
 	}
     } else if ((elem->ns != NULL) && (define->ns != NULL) &&
 	       (define->name == NULL)) {
-	VALID_CTXT();
-	VALID_ERROR2("Expecting no namespace for element %s\n",
-		    define->name);
+	VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS,
+		     elem->name);
 	return(0);
     } else if ((elem->ns != NULL) && (define->name != NULL)) {
-	VALID_CTXT();
-	VALID_ERROR2("Expecting no namespace for element %s\n",
+	VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS,
 		    define->name);
 	return(0);
     }
@@ -6765,6 +7053,7 @@
 	ctxt->flags = oldflags;
     } else if (define->type == XML_RELAXNG_CHOICE) {
 	xmlRelaxNGDefinePtr list;
+
 	oldflags = ctxt->flags;
 	ctxt->flags |= FLAGS_IGNORABLE;
 
@@ -6781,6 +7070,12 @@
 	    }
 	    list = list->next;
 	}
+	if (ret != 0) {
+	    if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
+		xmlRelaxNGDumpValidError(ctxt);
+	} else {
+	    ctxt->errNr = 0;
+	}
 	ret = 0;
 	ctxt->flags = oldflags;
     } else {
@@ -6807,8 +7102,7 @@
     xmlRelaxNGValidStatePtr oldstate, state;
 
     if (define == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("internal error: define == NULL\n");
+	VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
 	return(-1);
     }
     if (ctxt->state != NULL) {
@@ -6833,8 +7127,8 @@
         case XML_RELAXNG_EMPTY:
 	    node = xmlRelaxNGSkipIgnored(ctxt, node);
 	    if (node != NULL) {
-		VALID_CTXT();
-		VALID_ERROR("Expecting an empty element\n");
+		VALID_ERR2(XML_RELAXNG_ERR_ELEMNOTEMPTY,
+			     ctxt->state->node->name);
 		ret = -1;
 		break;
 	    }
@@ -6844,38 +7138,23 @@
 	    ret = -1;
 	    break;
         case XML_RELAXNG_TEXT:
-#if 0
-	    if (node == NULL) {
-		ret = 0;
-		break;
-	    }
-#endif
 	    while ((node != NULL) &&
 		   ((node->type == XML_TEXT_NODE) ||
 		    (node->type == XML_COMMENT_NODE) ||
 		    (node->type == XML_PI_NODE) ||
 		    (node->type == XML_CDATA_SECTION_NODE)))
 		node = node->next;
-#if 0
-	    if (node == ctxt->state->seq) {
-		VALID_CTXT();
-		VALID_ERROR("Expecting text content\n");
-		ret = -1;
-	    }
-#endif
 	    ctxt->state->seq = node;
 	    break;
         case XML_RELAXNG_ELEMENT:
 	    node = xmlRelaxNGSkipIgnored(ctxt, node);
 	    if (node == NULL) {
-		VALID_CTXT();
-		VALID_ERROR("Expecting an element, got empty\n");
+		VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name);
 		ret = -1;
 		break;
 	    }
 	    if (node->type != XML_ELEMENT_NODE) {
-		VALID_CTXT();
-		VALID_ERROR2("Expecting an element got %d type\n", node->type);
+		VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
 		ret = -1;
 		break;
 	    }
@@ -6894,6 +7173,16 @@
 		break;
 	    }
 	    ret = 0;
+	    if (ctxt->errNr != 0) {
+		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
+		    ctxt->errNr = 0;
+		else {
+		    while ((ctxt->err != NULL) &&
+			   (ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) &&
+			   (xmlStrEqual(ctxt->err->arg2, node->name)))
+			xmlRelaxNGValidErrorPop(ctxt);
+		}
+	    }
 	    
 	    state = xmlRelaxNGNewValidState(ctxt, node);
 	    if (state == NULL) {
@@ -6907,43 +7196,28 @@
 		tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
 		if (tmp != 0) {
 		    ret = -1;
-#ifdef DEBUG
-		    xmlGenericError(xmlGenericErrorContext,
-			"E: Element %s failed to validate attributes\n",
-		            node->name);
-#endif
+		    VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name);
 		}
 	    }
 	    if (define->content != NULL) {
 		tmp = xmlRelaxNGValidateElementContent(ctxt, define->content);
 		if (tmp != 0) {
 		    ret = -1;
-#ifdef DEBUG
-		    xmlGenericError(xmlGenericErrorContext,
-			"E: Element %s failed to validate element content\n",
-		            node->name);
-#endif
+		    VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, node->name);
 		}
 	    }
 	    state = ctxt->state;
 	    if (state->seq != NULL) {
 		state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq);
 		if (state->seq != NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR3("Extra content for element %s: %s\n",
+		    VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT,
 				node->name, state->seq->name);
 		    ret = -1;
-#ifdef DEBUG
-		    xmlGenericError(xmlGenericErrorContext,
-			"E: Element %s has extra content: %s\n",
-		            node->name, state->seq->name);
-#endif
 		}
 	    }
 	    for (i = 0;i < state->nbAttrs;i++) {
 		if (state->attrs[i] != NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR3("Invalid attribute %s for element %s\n",
+		    VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR,
 				state->attrs[i]->name, node->name);
 		    ret = -1;
 		}
@@ -6952,8 +7226,9 @@
 	    xmlRelaxNGFreeValidState(state);
 	    if (oldstate != NULL)
 		oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
-	    if (ret == 0)
+	    if (ret == 0) {
 		node->_private = define;
+	    }
 
 
 #ifdef DEBUG
@@ -6972,7 +7247,7 @@
 			oldstate->seq->name, oldstate->seq->type);
 #endif
 	    break;
-        case XML_RELAXNG_OPTIONAL:
+        case XML_RELAXNG_OPTIONAL: {
 	    oldflags = ctxt->flags;
 	    ctxt->flags |= FLAGS_IGNORABLE;
 	    oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
@@ -6980,13 +7255,16 @@
 	    if (ret != 0) {
 		xmlRelaxNGFreeValidState(ctxt->state);
 		ctxt->state = oldstate;
+		ctxt->flags = oldflags;
 		ret = 0;
 		break;
 	    }
 	    xmlRelaxNGFreeValidState(oldstate);
 	    ctxt->flags = oldflags;
 	    ret = 0;
+	    ctxt->errNr = 0;
 	    break;
+        }
         case XML_RELAXNG_ONEORMORE:
 	    ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
 	    if (ret != 0) {
@@ -7029,6 +7307,9 @@
 		}
 	    }
 	    ctxt->flags = oldflags;
+	    if (ret == 0) {
+		ctxt->errNr = 0;
+	    }
 	    ret = 0;
 	    break;
 	}
@@ -7061,6 +7342,12 @@
 	    ctxt->flags = oldflags;
 	    if (success == 1)
 		ret = 0;
+	    if (ret != 0) {
+		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
+		    xmlRelaxNGDumpValidError(ctxt);
+	    } else if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
+		ctxt->errNr = 0;
+	    }
 	    break;
 	}
         case XML_RELAXNG_DEF:
@@ -7094,8 +7381,7 @@
 	    child = node;
 	    while (child != NULL) {
 		if (child->type == XML_ELEMENT_NODE) {
-		    VALID_CTXT();
-		    VALID_ERROR2("Element %s has child elements\n",
+		    VALID_ERR2(XML_RELAXNG_ERR_DATAELEM,
 				 node->parent->name);
 		    ret = -1;
 		    break;
@@ -7114,16 +7400,14 @@
 	    if (content == NULL) {
 		content = xmlStrdup(BAD_CAST "");
 		if (content == NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR("Allocation failure\n");
+		    VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 		    ret = -1;
 		    break;
 		}
 	    }
 	    ret = xmlRelaxNGValidateDatatype(ctxt, content, define);
 	    if (ret == -1) {
-		VALID_CTXT();
-		VALID_ERROR2("Error validating %s\n", define->name);
+		VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name);
 	    } else if (ret == 0) {
 		ctxt->state->seq = NULL;
 	    }
@@ -7139,8 +7423,7 @@
 	    child = node;
 	    while (child != NULL) {
 		if (child->type == XML_ELEMENT_NODE) {
-		    VALID_CTXT();
-		    VALID_ERROR2("Element %s has child elements\n",
+		    VALID_ERR2(XML_RELAXNG_ERR_VALELEM,
 				 node->parent->name);
 		    ret = -1;
 		    break;
@@ -7159,8 +7442,7 @@
 	    if (content == NULL) {
 		content = xmlStrdup(BAD_CAST "");
 		if (content == NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR("Allocation failure\n");
+		    VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 		    ret = -1;
 		    break;
 		}
@@ -7170,12 +7452,7 @@
 	    ret = xmlRelaxNGValidateValue(ctxt, define);
 	    ctxt->state->value = oldvalue;
 	    if (ret == -1) {
-		VALID_CTXT();
-		if (define->name != NULL) {
-		    VALID_ERROR2("error validating value %s\n", define->name);
-		} else {
-		    VALID_ERROR("error validating value\n");
-		}
+		VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name);
 	    } else if (ret == 0) {
 		ctxt->state->seq = NULL;
 	    }
@@ -7197,8 +7474,7 @@
 	    child = node;
 	    while (child != NULL) {
 		if (child->type == XML_ELEMENT_NODE) {
-		    VALID_CTXT();
-		    VALID_ERROR2("Element %s has child elements\n",
+		    VALID_ERR2(XML_RELAXNG_ERR_LISTELEM,
 				 node->parent->name);
 		    ret = -1;
 		    break;
@@ -7217,8 +7493,7 @@
 	    if (content == NULL) {
 		content = xmlStrdup(BAD_CAST "");
 		if (content == NULL) {
-		    VALID_CTXT();
-		    VALID_ERROR("Allocation failure\n");
+		    VALID_ERR(XML_RELAXNG_ERR_MEMORY);
 		    ret = -1;
 		    break;
 		}
@@ -7232,8 +7507,7 @@
 	    ctxt->state->value = oldvalue;
 	    ctxt->state->endvalue = oldendvalue;
 	    if (ret == -1) {
-		VALID_CTXT();
-		VALID_ERROR("error validating list\n");
+		VALID_ERR(XML_RELAXNG_ERR_LIST);
 	    } else if ((ret == 0) && (node != NULL)) {
 		ctxt->state->seq = node->next;
 	    }
@@ -7286,8 +7560,7 @@
     schema = ctxt->schema;
     grammar = schema->topgrammar;
     if (grammar == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("No top grammar defined\n");
+	VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
 	return(-1);
     }
     state = xmlRelaxNGNewValidState(ctxt, NULL);
@@ -7300,8 +7573,7 @@
 	node = state->seq;
 	node = xmlRelaxNGSkipIgnored(ctxt, node);
 	if (node != NULL) {
-	    VALID_CTXT();
-	    VALID_ERROR("extra data on the document\n");
+	    VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
 	    ret = -1;
 	}
     }
@@ -7337,6 +7609,10 @@
     ret->schema = schema;
     ret->error = xmlGenericError;
     ret->userData = xmlGenericErrorContext;
+    ret->errNr = 0;
+    ret->errMax = 0;
+    ret->err = NULL;
+    ret->errTab = NULL;
     return (ret);
 }
 
@@ -7350,6 +7626,8 @@
 xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) {
     if (ctxt == NULL)
 	return;
+    if (ctxt->errTab != NULL)
+	xmlFree(ctxt->errTab);
     xmlFree(ctxt);
 }
 
diff --git a/result/relaxng/spec1_err b/result/relaxng/spec1_err
index d3a5dd6..e3b2ee8 100644
--- a/result/relaxng/spec1_err
+++ b/result/relaxng/spec1_err
@@ -1,2 +1,82 @@
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element element, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element attribute, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element group, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element interleave, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element choice, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element optional, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element zeroOrMore, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element oneOrMore, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element list, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element mixed, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element ref, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element parentRef, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element empty, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element text, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element value, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element data, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element notAllowed, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element externalRef, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting an element grammar, got nothing
+RNG validity error: file ./test/relaxng/spec1.rng line 7 element documentation
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/spec1.rng line 7 element documentation
+Element element failed to validate content
+RNG validity error: file ./test/relaxng/spec1.rng line 7 element documentation
+Element element has extra content: documentation
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element attribute, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element group, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element interleave, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element choice, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element optional, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element zeroOrMore, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element oneOrMore, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element list, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element mixed, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element ref, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element parentRef, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element empty, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element text, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element value, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element data, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element notAllowed, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element externalRef, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Expecting element grammar, got element
+RNG validity error: file ./test/relaxng/spec1.rng line 6 element element
+Extra data in the document
diff --git a/result/relaxng/tutor10_1_4.err b/result/relaxng/tutor10_1_4.err
index 820cf4b..adee007 100644
--- a/result/relaxng/tutor10_1_4.err
+++ b/result/relaxng/tutor10_1_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6557
+RNG validity error: file ./test/relaxng/tutor10_1_4.xml line 1 element foo
 Expecting a namespace for element foo
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor10_1_4.xml line 1 element foo
+Extra data in the document
diff --git a/result/relaxng/tutor10_1_5.err b/result/relaxng/tutor10_1_5.err
index ea698c7..a985d4d 100644
--- a/result/relaxng/tutor10_1_5.err
+++ b/result/relaxng/tutor10_1_5.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6562
-Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor10_1_5.xml line 1 element foo
+Element foo has wrong namespace: expecting http://www.example.com
+RNG validity error: file ./test/relaxng/tutor10_1_5.xml line 1 element foo
+Extra data in the document
diff --git a/result/relaxng/tutor10_1_6.err b/result/relaxng/tutor10_1_6.err
index ea698c7..e6c640d 100644
--- a/result/relaxng/tutor10_1_6.err
+++ b/result/relaxng/tutor10_1_6.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6562
-Expecting element foo has wrong namespace: expecting http://www.example.com
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor10_1_6.xml line 1 element foo
+Element foo has wrong namespace: expecting http://www.example.com
+RNG validity error: file ./test/relaxng/tutor10_1_6.xml line 1 element foo
+Extra data in the document
diff --git a/result/relaxng/tutor10_2_3.err b/result/relaxng/tutor10_2_3.err
index 2064874..90c19cd 100644
--- a/result/relaxng/tutor10_2_3.err
+++ b/result/relaxng/tutor10_2_3.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6574
+RNG validity error: file ./test/relaxng/tutor10_2_3.xml line 1 element foo
 Expecting no namespace for element foo
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor10_2_3.xml line 1 element foo
+Extra data in the document
diff --git a/result/relaxng/tutor10_2_4.err b/result/relaxng/tutor10_2_4.err
index 2064874..6872bea 100644
--- a/result/relaxng/tutor10_2_4.err
+++ b/result/relaxng/tutor10_2_4.err
@@ -1,4 +1,4 @@
-error detected at relaxng.c:6574
+RNG validity error: file ./test/relaxng/tutor10_2_4.xml line 1 element foo
 Expecting no namespace for element foo
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor10_2_4.xml line 1 element foo
+Extra data in the document
diff --git a/result/relaxng/tutor10_7_3.err b/result/relaxng/tutor10_7_3.err
index 34c0ef1..85544c3 100644
--- a/result/relaxng/tutor10_7_3.err
+++ b/result/relaxng/tutor10_7_3.err
@@ -1,2 +1,8 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor10_7_3.xml line 2 element card
+Element card failed to validate attributes
+RNG validity error: file ./test/relaxng/tutor10_7_3.xml line 2 element card
+Invalid attribute name for element card
+RNG validity error: file ./test/relaxng/tutor10_7_3.xml line 2 element card
+Invalid attribute email for element card
+RNG validity error: file ./test/relaxng/tutor10_7_3.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor10_8_3.err b/result/relaxng/tutor10_8_3.err
index 34c0ef1..3b712f3 100644
--- a/result/relaxng/tutor10_8_3.err
+++ b/result/relaxng/tutor10_8_3.err
@@ -1,2 +1,8 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor10_8_3.xml line 2 element card
+Element card failed to validate attributes
+RNG validity error: file ./test/relaxng/tutor10_8_3.xml line 2 element card
+Invalid attribute name for element card
+RNG validity error: file ./test/relaxng/tutor10_8_3.xml line 2 element card
+Invalid attribute email for element card
+RNG validity error: file ./test/relaxng/tutor10_8_3.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor11_2_2.err b/result/relaxng/tutor11_2_2.err
index 8d7fe33..03d2edc 100644
--- a/result/relaxng/tutor11_2_2.err
+++ b/result/relaxng/tutor11_2_2.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6783
+RNG validity error: file ./test/relaxng/tutor11_2_2.xml line 3 element card
 Invalid attribute foo for element card
diff --git a/result/relaxng/tutor11_2_3.err b/result/relaxng/tutor11_2_3.err
index 5a7b74a..fed4d2d 100644
--- a/result/relaxng/tutor11_2_3.err
+++ b/result/relaxng/tutor11_2_3.err
@@ -1,2 +1,2 @@
-error detected at relaxng.c:6783
+RNG validity error: file ./test/relaxng/tutor11_2_3.xml line 3 element card
 Invalid attribute b for element card
diff --git a/result/relaxng/tutor12_1_err b/result/relaxng/tutor12_1_err
index d3a5dd6..2cdc5e1 100644
--- a/result/relaxng/tutor12_1_err
+++ b/result/relaxng/tutor12_1_err
@@ -1,2 +1,150 @@
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element element, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element attribute, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element group, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element interleave, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element choice, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element optional, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element zeroOrMore, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element oneOrMore, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element list, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element mixed, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element ref, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element parentRef, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element empty, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element text, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element value, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element data, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element notAllowed, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element externalRef, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting an element grammar, got nothing
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 4 element documentation
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 4 element documentation
+Element element failed to validate content
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 4 element documentation
+Element element has extra content: documentation
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element attribute, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element group, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element interleave, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element choice, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element optional, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element zeroOrMore, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element oneOrMore, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element list, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element mixed, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element ref, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element parentRef, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element empty, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element text, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element value, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element data, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element notAllowed, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element externalRef, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 3 element element
+Expecting element grammar, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Element zeroOrMore failed to validate content
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element oneOrMore, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element list, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element mixed, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element ref, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element parentRef, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element empty, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element text, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element value, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element data, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element notAllowed, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element externalRef, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 2 element zeroOrMore
+Expecting element grammar, got zeroOrMore
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Element element failed to validate content
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element attribute, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element group, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element interleave, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element choice, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element optional, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element zeroOrMore, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element oneOrMore, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element list, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element mixed, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element ref, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element parentRef, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element empty, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element text, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element value, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element data, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element notAllowed, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element externalRef, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Expecting element grammar, got element
+RNG validity error: file ./test/relaxng/tutor12_1.rng line 1 element element
+Extra data in the document
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 5b495ea..615cb87 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,4 +1,6 @@
-error detected at relaxng.c:6549
+RNG validity error: file ./test/relaxng/tutor3_2_1.xml line 1 element email
 Expecting element name, got email
-error detected at relaxng.c:6770
-Extra content for element card: email
+RNG validity error: file ./test/relaxng/tutor3_2_1.xml line 1 element email
+Element card failed to validate content
+RNG validity error: file ./test/relaxng/tutor3_2_1.xml line 1 element email
+Element card has extra content: email
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index 34c0ef1..42743a2 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,2 +1,6 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor3_5_2.xml line 2 element name
+Element card failed to validate content
+RNG validity error: file ./test/relaxng/tutor3_5_2.xml line 2 element name
+Element card has extra content: name
+RNG validity error: file ./test/relaxng/tutor3_5_2.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor3_7_err b/result/relaxng/tutor3_7_err
index d3a5dd6..89b1400 100644
--- a/result/relaxng/tutor3_7_err
+++ b/result/relaxng/tutor3_7_err
@@ -1,2 +1,80 @@
-error detected at relaxng.c:7141
-extra data on the document
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element element, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element attribute, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element group, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element interleave, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element choice, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element optional, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element zeroOrMore, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element oneOrMore, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element list, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element mixed, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element ref, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element parentRef, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element empty, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element text, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element value, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element data, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element notAllowed, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element externalRef, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting an element grammar, got nothing
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Element element failed to validate content
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element attribute, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element group, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element interleave, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element choice, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element optional, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element zeroOrMore, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element oneOrMore, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element list, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element mixed, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element ref, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element parentRef, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element empty, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element text, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element value, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element data, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element notAllowed, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element externalRef, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Expecting element grammar, got element
+RNG validity error: file ./test/relaxng/tutor3_7.rng line 1 element element
+Extra data in the document
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index d05cfe9..fa44637 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,2 +1,4 @@
-error detected at relaxng.c:6783
+RNG validity error: file ./test/relaxng/tutor6_1_3.xml line 1 element card
+Element card failed to validate attributes
+RNG validity error: file ./test/relaxng/tutor6_1_3.xml line 1 element card
 Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 1de9882..17a825d 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,2 +1,10 @@
-error detected at relaxng.c:6770
-Extra content for element preferredFormat: text
+RNG validity error: file ./test/relaxng/tutor6_2_4.xml line 4 element text
+Error validating value 
+RNG validity error: file ./test/relaxng/tutor6_2_4.xml line 4 element text
+Error validating value 
+RNG validity error: file ./test/relaxng/tutor6_2_4.xml line 4 element text
+Element preferredFormat failed to validate content
+RNG validity error: file ./test/relaxng/tutor6_2_4.xml line 4 element text
+Element preferredFormat has extra content: text
+RNG validity error: file ./test/relaxng/tutor6_2_4.xml line 1 element card
+Element card failed to validate content
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index d05cfe9..64b75e2 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,2 +1,4 @@
-error detected at relaxng.c:6783
+RNG validity error: file ./test/relaxng/tutor6_3_1.xml line 1 element card
+Element card failed to validate attributes
+RNG validity error: file ./test/relaxng/tutor6_3_1.xml line 1 element card
 Invalid attribute preferredFormat for element card
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
index f3cddfd..9b16493 100644
--- a/result/relaxng/tutor7_1_2.err
+++ b/result/relaxng/tutor7_1_2.err
@@ -1,6 +1,8 @@
-error detected at relaxng.c:5813
-Internal: failed to validate type float
-error detected at relaxng.c:7073
-error validating list
-error detected at relaxng.c:6770
-Extra content for element vector: text
+RNG validity error: file ./test/relaxng/tutor7_1_2.xml line 1 element text
+failed to validate type float
+RNG validity error: file ./test/relaxng/tutor7_1_2.xml line 1 element text
+Error validating list
+RNG validity error: file ./test/relaxng/tutor7_1_2.xml line 1 element text
+Element vector failed to validate content
+RNG validity error: file ./test/relaxng/tutor7_1_2.xml line 1 element text
+Element vector has extra content: text
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
index 3680610..b6ec751 100644
--- a/result/relaxng/tutor7_1_3.err
+++ b/result/relaxng/tutor7_1_3.err
@@ -1,6 +1,8 @@
-error detected at relaxng.c:6053
+RNG validity error: file ./test/relaxng/tutor7_1_3.xml line 1 element text
 Extra data in list: 5.6
-error detected at relaxng.c:7073
-error validating list
-error detected at relaxng.c:6770
-Extra content for element vector: text
+RNG validity error: file ./test/relaxng/tutor7_1_3.xml line 1 element text
+Error validating list
+RNG validity error: file ./test/relaxng/tutor7_1_3.xml line 1 element text
+Element vector failed to validate content
+RNG validity error: file ./test/relaxng/tutor7_1_3.xml line 1 element text
+Element vector has extra content: text
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
index 0350cda..bf3b777 100644
--- a/result/relaxng/tutor7_2_4.err
+++ b/result/relaxng/tutor7_2_4.err
@@ -1,4 +1,6 @@
-error detected at relaxng.c:5813
-Internal: failed to validate type double
-error detected at relaxng.c:7073
-error validating list
+RNG validity error: file ./test/relaxng/tutor7_2_4.xml line 1 element vector
+failed to validate type double
+RNG validity error: file ./test/relaxng/tutor7_2_4.xml line 1 element vector
+Error validating list
+RNG validity error: file ./test/relaxng/tutor7_2_4.xml line 1 element vector
+Element vector failed to validate content
diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err
index 8ab033d..852837a 100644
--- a/result/relaxng/tutor7_3_4.err
+++ b/result/relaxng/tutor7_3_4.err
@@ -1,6 +1,8 @@
-error detected at relaxng.c:6053
+RNG validity error: file ./test/relaxng/tutor7_3_4.xml line 1 element text
 Extra data in list: 5.6
-error detected at relaxng.c:7073
-error validating list
-error detected at relaxng.c:6770
-Extra content for element path: text
+RNG validity error: file ./test/relaxng/tutor7_3_4.xml line 1 element text
+Error validating list
+RNG validity error: file ./test/relaxng/tutor7_3_4.xml line 1 element text
+Element path failed to validate content
+RNG validity error: file ./test/relaxng/tutor7_3_4.xml line 1 element text
+Element path has extra content: text
diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err
index d67a740..473c58b 100644
--- a/result/relaxng/tutor7_3_5.err
+++ b/result/relaxng/tutor7_3_5.err
@@ -1,6 +1,8 @@
-error detected at relaxng.c:5813
-Internal: failed to validate type double
-error detected at relaxng.c:7073
-error validating list
-error detected at relaxng.c:6770
-Extra content for element path: text
+RNG validity error: file ./test/relaxng/tutor7_3_5.xml line 1 element text
+failed to validate type double
+RNG validity error: file ./test/relaxng/tutor7_3_5.xml line 1 element text
+Error validating list
+RNG validity error: file ./test/relaxng/tutor7_3_5.xml line 1 element text
+Element path failed to validate content
+RNG validity error: file ./test/relaxng/tutor7_3_5.xml line 1 element text
+Element path has extra content: text
diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err
index f5f7037..2a1364d 100644
--- a/result/relaxng/tutor8_2_4.err
+++ b/result/relaxng/tutor8_2_4.err
@@ -1,4 +1,6 @@
-error detected at relaxng.c:6468
+RNG validity error: file ./test/relaxng/tutor8_2_4.xml line 5 element title
 Extra element title in interleave
-error detected at relaxng.c:6770
-Extra content for element head: title
+RNG validity error: file ./test/relaxng/tutor8_2_4.xml line 5 element title
+Element head failed to validate content
+RNG validity error: file ./test/relaxng/tutor8_2_4.xml line 5 element title
+Element head has extra content: title
diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err
index 5b063e3..71d49f8 100644
--- a/result/relaxng/tutor8_2_5.err
+++ b/result/relaxng/tutor8_2_5.err
@@ -1,4 +1,6 @@
-error detected at relaxng.c:6709
-Expecting an element, got empty
-error detected at relaxng.c:6479
+RNG validity error: file ./test/relaxng/tutor8_2_5.xml line 1 element head
+Expecting an element title, got nothing
+RNG validity error: file ./test/relaxng/tutor8_2_5.xml line 1 element head
 Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor8_2_5.xml line 1 element head
+Element head failed to validate content
diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err
index 3d57dd3..22f948a 100644
--- a/result/relaxng/tutor8_2_6.err
+++ b/result/relaxng/tutor8_2_6.err
@@ -1,4 +1,6 @@
-error detected at relaxng.c:6468
+RNG validity error: file ./test/relaxng/tutor8_2_6.xml line 4 element base
 Extra element base in interleave
-error detected at relaxng.c:6770
-Extra content for element head: base
+RNG validity error: file ./test/relaxng/tutor8_2_6.xml line 4 element base
+Element head failed to validate content
+RNG validity error: file ./test/relaxng/tutor8_2_6.xml line 4 element base
+Element head has extra content: base
diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err
index 34c0ef1..75a04d5 100644
--- a/result/relaxng/tutor9_5_2.err
+++ b/result/relaxng/tutor9_5_2.err
@@ -1,2 +1,6 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor9_5_2.xml line 2 element card
+Invalid sequence in interleave
+RNG validity error: file ./test/relaxng/tutor9_5_2.xml line 2 element card
+Element card failed to validate content
+RNG validity error: file ./test/relaxng/tutor9_5_2.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err
index 34c0ef1..6a028af 100644
--- a/result/relaxng/tutor9_5_3.err
+++ b/result/relaxng/tutor9_5_3.err
@@ -1,2 +1,4 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor9_5_3.xml line 2 element card
+Invalid attribute error for element card
+RNG validity error: file ./test/relaxng/tutor9_5_3.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err
index 34c0ef1..939fa38 100644
--- a/result/relaxng/tutor9_6_2.err
+++ b/result/relaxng/tutor9_6_2.err
@@ -1,2 +1,4 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor9_6_2.xml line 2 element card
+Element card failed to validate content
+RNG validity error: file ./test/relaxng/tutor9_6_2.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err
index 34c0ef1..f9f3483 100644
--- a/result/relaxng/tutor9_6_3.err
+++ b/result/relaxng/tutor9_6_3.err
@@ -1,2 +1,4 @@
-error detected at relaxng.c:6770
-Extra content for element addressBook: card
+RNG validity error: file ./test/relaxng/tutor9_6_3.xml line 2 element card
+Invalid attribute error for element card
+RNG validity error: file ./test/relaxng/tutor9_6_3.xml line 2 element card
+Element addressBook has extra content: card
diff --git a/test/xsdtest/xsdtest.xml b/test/xsdtest/xsdtest.xml
index 45d0be1..b8a6de9 100644
--- a/test/xsdtest/xsdtest.xml
+++ b/test/xsdtest/xsdtest.xml
@@ -22,10 +22,10 @@
 <valid>foobar</valid>
 <valid>http://www.example.com</valid>
 <valid>http://ji%6d@www.example.com</valid>
+<valid>http://www.example.co%6d</valid>
 <valid>nosuchscheme:stuff</valid>
 <invalid>foo$bar:stuff</invalid>
 <invalid>f%oobar</invalid>
-<invalid>http://www.example.co%6d</invalid>
 </datatype>
 <datatype name="integer">
 <valid>10</valid>
diff --git a/uri.c b/uri.c
index ffdad9f..70aee47 100644
--- a/uri.c
+++ b/uri.c
@@ -1463,8 +1463,10 @@
      * try first to parse it as a server string.
      */
     ret = xmlParseURIServer(uri, str);
-    if (ret == 0)
+    if ((ret == 0) && (*str != NULL) &&
+	((**str == 0) || (**str == '/') || (**str == '?')))
         return(0);
+    *str = cur;
 
     /*
      * failed, fallback to reg_name
@@ -2020,7 +2022,7 @@
 	p++;
     }
 #else
-    uri->path = (char *) xmlStrdup((const char *) path);
+    uri->path = (char *) xmlStrdup((const xmlChar *) path);
 #endif
     
     ret = xmlSaveUri(uri);
diff --git a/xmllint.c b/xmllint.c
index 8b47f74..a88de5b 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -1066,6 +1066,10 @@
 	xmlRelaxNGValidCtxtPtr ctxt;
 	int ret;
 
+	if ((timing) && (!repeat)) {
+	    startTimer();
+	}
+
 	ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
 	xmlRelaxNGSetValidErrors(ctxt,
 		(xmlRelaxNGValidityErrorFunc) fprintf,
@@ -1081,6 +1085,9 @@
 		   filename);
 	}
 	xmlRelaxNGFreeValidCtxt(ctxt);
+	if ((timing) && (!repeat)) {
+	    endTimer("Validating");
+	}
 #endif
     }
 
@@ -1470,6 +1477,9 @@
     if (relaxng != NULL) {
 	xmlRelaxNGParserCtxtPtr ctxt;
 
+	if (timing) {
+	    startTimer();
+	}
 	ctxt = xmlRelaxNGNewParserCtxt(relaxng);
 	xmlRelaxNGSetParserErrors(ctxt,
 		(xmlRelaxNGValidityErrorFunc) fprintf,
@@ -1477,6 +1487,9 @@
 		stderr);
 	relaxngschemas = xmlRelaxNGParse(ctxt);
 	xmlRelaxNGFreeParserCtxt(ctxt);
+	if (timing) {
+	    endTimer("Compiling the schemas");
+	}
     }
 #endif
     for (i = 1; i < argc ; i++) {