fixed error msg cleanup deallocation added a function to handle lists of

* relaxng.c: fixed error msg cleanup deallocation
* xmlschemastypes.c: added a function to handle lists of
  atomic types, added support for IDREFS
Daniel
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)) {