diff --git a/ChangeLog b/ChangeLog
index f83fa1c..dae25b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Mar 18 12:36:22 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c: fixed error msg cleanup deallocation
+	* xmlschemastypes.c: added a function to handle lists of
+	  atomic types, added support for IDREFS
+
 Tue Mar 18 01:28:15 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* relaxng.c valid.c xmlschemastypes.c: added Datatype ID
diff --git a/relaxng.c b/relaxng.c
index 8249a96..0fd8b40 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -1879,6 +1879,32 @@
 }
 
 /**
+ * xmlRelaxNGPopErrors:
+ * @ctxt:  the validation context
+ * @level:  the error level in the stack
+ *
+ * pop and discard all errors until the given level is reached
+ */
+static void
+xmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level) {
+    int i;
+    xmlRelaxNGValidErrorPtr err;
+
+    for (i = level;i < ctxt->errNr;i++) {
+	err = &ctxt->errTab[i];
+	if (err->flags & ERROR_IS_DUP) {
+	    if (err->arg1 != NULL)
+		xmlFree((xmlChar *)err->arg1);
+	    err->arg1 = NULL;
+	    if (err->arg2 != NULL)
+		xmlFree((xmlChar *)err->arg2);
+	    err->arg2 = NULL;
+	    err->flags = 0;
+	}
+    }
+    ctxt->errNr = level;
+}
+/**
  * xmlRelaxNGDumpValidError:
  * @ctxt:  the validation context
  *
@@ -6925,7 +6951,7 @@
 		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
 		    xmlRelaxNGDumpValidError(ctxt);
 	    } else {
-		ctxt->errNr = 0;
+		if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
 	    }
 	    if (ret == 0)
 		xmlRelaxNGNextValue(ctxt);
@@ -7030,7 +7056,7 @@
 		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
 		    xmlRelaxNGDumpValidError(ctxt);
 	    } else {
-		ctxt->errNr = 0;
+		if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
 	    }
 	    break;
 	}
@@ -7498,7 +7524,7 @@
 	cur = cur->prev;
     }
     if (ret == 0) {
-	ctxt->errNr = errNr;
+	if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
     }
 
     xmlFree(list);
@@ -7632,7 +7658,7 @@
 	    if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
 		xmlRelaxNGDumpValidError(ctxt);
 	} else {
-	    ctxt->errNr = 0;
+	    if (ctxt->errNr > 0) xmlRelaxNGPopErrors(ctxt, 0);
 	}
 	ret = 0;
 	ctxt->flags = oldflags;
@@ -7836,7 +7862,7 @@
 		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
 		    xmlRelaxNGDumpValidError(ctxt);
 	    } else {
-		ctxt->errNr = errNr;
+		if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
 	    }
 
 #ifdef DEBUG
@@ -8057,7 +8083,7 @@
 		if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
 		    xmlRelaxNGDumpValidError(ctxt);
 	    } else if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
-		ctxt->errNr = errNr;
+		if (ctxt->errNr > errNr) xmlRelaxNGPopErrors(ctxt, errNr);
 	    }
 	    break;
 	}
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index a477bcc..0508699 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -1057,6 +1057,73 @@
 
 
 /**
+ * xmlSchemaValAtomicListNode:
+ * @type: the predefined atomic type for a token in the list
+ * @value: the list value to check
+ * @ret:  the return computed value
+ * @node:  the node containing the value
+ *
+ * Check that a value conforms to the lexical space of the predefined
+ * list type. if true a value is computed and returned in @ret.
+ *
+ * Returns 0 if this validates, a positive error code number otherwise
+ *         and -1 in case of internal or API error.
+ */
+static int
+xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
+	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
+    xmlChar *val, *cur, *endval;
+    int nb_values = 0;
+    int tmp;
+
+    if (value == NULL) {
+	return(-1);
+    }
+    val = xmlStrdup(value);
+    if (val == NULL) {
+	return(-1);
+    }
+    cur = val;
+    /*
+     * Split the list
+     */
+    while (IS_BLANK(*cur)) cur++;
+    while (*cur != 0) {
+	if (IS_BLANK(*cur)) {
+	    *cur = 0;
+	    cur++;
+	    while (IS_BLANK(*cur)) *cur++ = 0;
+	} else {
+	    nb_values++;
+	    cur++;
+	    while ((*cur != 0) && (!IS_BLANK(*cur))) cur++;
+	}
+    }
+    if (nb_values == 0) {
+	if (ret != NULL) {
+	    TODO
+	}
+	xmlFree(val);
+	return(0);
+    }
+    endval = cur;
+    cur = val;
+    while ((*cur == 0) && (cur != endval)) cur++;
+    while (cur != endval) {
+	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
+	if (tmp != 0)
+	    break;
+	while (*cur != 0) cur++;
+	while ((*cur == 0) && (cur != endval)) cur++;
+    }
+    xmlFree(val);
+    if (ret != NULL) {
+	TODO
+    }
+    return(tmp);
+}
+
+/**
  * xmlSchemaValPredefTypeNode:
  * @type: the predefined type
  * @value: the value to check
@@ -1425,6 +1492,16 @@
 	    attr->atype = XML_ATTRIBUTE_IDREF;
 	}
 	return(ret);
+    } else if (type == xmlSchemaTypeIdrefsDef) {
+	ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
+		                         value, val, node);
+	if ((ret == 0) && (node != NULL) &&
+	    (node->type == XML_ATTRIBUTE_NODE)) {
+	    xmlAttrPtr attr = (xmlAttrPtr) node;
+
+	    attr->atype = XML_ATTRIBUTE_IDREFS;
+	}
+	return(ret);
     } else if (type == xmlSchemaTypeIdDef) {
 	ret = xmlValidateNCName(value, 1);
 	if ((ret == 0) && (val != NULL)) {
