more work on Relax-NG augmented/updated the regression tests added a

* relaxng.c: more work on Relax-NG
* test/relaxng/* result/relaxng/*: augmented/updated the
  regression tests
* xmlschemastypes.c: added a number of base type definition but not
  the associated checks, those are still TODOs
Daniel
diff --git a/ChangeLog b/ChangeLog
index bad10a8..42b5e37 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Jan 27 13:29:43 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c: more work on Relax-NG
+	* test/relaxng/* result/relaxng/*: augmented/updated the 
+	  regression tests
+	* xmlschemastypes.c: added a number of base type definition but not
+	  the associated checks, those are still TODOs
+
 Sun Jan 26 17:37:06 MST 2003 John Fleck <jfleck@inkstain.net>
 
 	in docs/tutorial:
@@ -30,7 +38,7 @@
 
 Sun Jan 26 20:47:26 CET 2003 Daniel Veillard <daniel@veillard.com>
 
-	* xmlcatalog.c xmllint.c: applied patch for FreeBSD by
+	* xmlcatalog.c xmllint.c: applied patch for NetBSD by
 	  Julio Merino, closing #104475
 
 Sun Jan 26 20:38:43 CET 2003 Daniel Veillard <daniel@veillard.com>
diff --git a/configure.in b/configure.in
index eb67322..59395a7 100644
--- a/configure.in
+++ b/configure.in
@@ -647,7 +647,7 @@
 RELDATE=`date +'%a %b %e %Y'`
 AC_SUBST(RELDATE)
 
-rm -f rm COPYING.LIB COPYING
+rm -f COPYING.LIB COPYING
 ln -s Copyright COPYING
 
 AC_OUTPUT(libxml.spec Makefile include/Makefile include/libxml/Makefile doc/Makefile example/Makefile python/Makefile python/tests/Makefile include/libxml/xmlversion.h xml2-config libxml-2.0.pc xml2Conf.sh python/setup.py)
diff --git a/relaxng.c b/relaxng.c
index a104d8e..f5ac07d 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -24,6 +24,7 @@
 #include <libxml/xmlschemastypes.h>
 #include <libxml/xmlautomata.h>
 #include <libxml/xmlregexp.h>
+#include <libxml/xmlschemastypes.h>
 
 /*
  * The Relax-NG namespace
@@ -168,10 +169,11 @@
 typedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
 typedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
 struct _xmlRelaxNGValidState {
-    xmlNodePtr node;		/* the current node */
-    xmlNodePtr  seq;		/* the sequence of children left to validate */
-    int     nbAttrs;		/* the number of attributes */
-    xmlChar  *value;		/* the value when operating on string */
+    xmlNodePtr   node;		/* the current node */
+    xmlNodePtr    seq;		/* the sequence of children left to validate */
+    int       nbAttrs;		/* the number of attributes */
+    xmlChar    *value;		/* the value when operating on string */
+    xmlChar *endvalue;		/* the end value when operating on string */
     xmlAttrPtr attrs[1];	/* the array of attributes */
 };
 
@@ -668,8 +670,15 @@
  */
 static int
 xmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED,
-	                 const xmlChar *type ATTRIBUTE_UNUSED) {
-    TODO
+	                 const xmlChar *type) {
+    xmlSchemaTypePtr typ;
+
+    if (type == NULL)
+	return(-1);
+    typ = xmlSchemaGetPredefinedType(type, 
+	       BAD_CAST "http://www.w3.org/2001/XMLSchema");
+    if (typ == NULL)
+	return(0);
     return(1);
 }
 
@@ -686,10 +695,29 @@
  */
 static int
 xmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED,
-	                  const xmlChar *type ATTRIBUTE_UNUSED,
-			  const xmlChar *value ATTRIBUTE_UNUSED) {
-    TODO
-    return(1);
+	                  const xmlChar *type,
+			  const xmlChar *value) {
+    xmlSchemaTypePtr typ;
+    int ret;
+
+    /*
+     * TODO: the type should be cached ab provided back, interface subject
+     * to changes.
+     * TODO: handle facets, may require an additional interface and keep
+     * the value returned from the validation.
+     */
+    if ((type == NULL) || (value == NULL))
+	return(-1);
+    typ = xmlSchemaGetPredefinedType(type, 
+	       BAD_CAST "http://www.w3.org/2001/XMLSchema");
+    if (typ == NULL)
+	return(-1);
+    ret = xmlSchemaValidatePredefinedType(typ, value, NULL);
+    if (ret == 0)
+	return(1);
+    if (ret > 0)
+	return(0);
+    return(-1);
 }
 
 /**
@@ -1260,7 +1288,7 @@
 	def = xmlRelaxNGNewDefine(ctxt, node);
 	if (def == NULL)
 	    return(NULL);
-	def->type = XML_RELAXNG_ZEROORMORE;
+	def->type = XML_RELAXNG_ONEORMORE;
 	def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
     } else if (IS_RELAXNG(node, "optional")) {
 	def = xmlRelaxNGNewDefine(ctxt, node);
@@ -1346,6 +1374,12 @@
 	def = NULL;
     } else if (IS_RELAXNG(node, "value")) {
 	def = xmlRelaxNGParseValue(ctxt, node);
+    } else if (IS_RELAXNG(node, "list")) {
+	def = xmlRelaxNGNewDefine(ctxt, node);
+	if (def == NULL)
+	    return(NULL);
+	def->type = XML_RELAXNG_LIST;
+	def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
     } else {
 	TODO
     }
@@ -2632,6 +2666,8 @@
  ************************************************************************/
 static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, 
 	                                xmlRelaxNGDefinePtr define);
+static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, 
+	                           xmlRelaxNGDefinePtr define);
 
 /**
  * xmlRelaxNGSkipIgnored:
@@ -2745,6 +2781,55 @@
 }
 
 /**
+ * xmlRelaxNGNextValue:
+ * @ctxt:  a Relax-NG validation context
+ *
+ * Skip to the next value when validating within a list
+ *
+ * Returns 0 if the operation succeeded or an error code.
+ */
+static int
+xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) {
+    xmlChar *cur;
+
+    cur = ctxt->state->value;
+    if ((cur == NULL) || (ctxt->state->endvalue == NULL)) {
+	ctxt->state->value = NULL;
+	return(0);
+    }
+    while (*cur != 0) cur++;
+    while ((cur != ctxt->state->endvalue) && (*cur == 0)) cur++;
+    if (cur == ctxt->state->endvalue)
+	ctxt->state->value = NULL;
+    else
+	ctxt->state->value = cur;
+    return(0);
+}
+
+/**
+ * xmlRelaxNGValidateValueList:
+ * @ctxt:  a Relax-NG validation context
+ * @defines:  the list of definitions to verify
+ *
+ * Validate the given set of definitions for the current value
+ *
+ * Returns 0 if the validation succeeded or an error code.
+ */
+static int
+xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, 
+	                xmlRelaxNGDefinePtr defines) {
+    int ret = 0;
+
+    while (defines != NULL) {
+	ret = xmlRelaxNGValidateValue(ctxt, defines);
+	if (ret != 0)
+	    break;
+	defines = defines->next;
+    }
+    return(ret);
+}
+
+/**
  * xmlRelaxNGValidateValue:
  * @ctxt:  a Relax-NG validation context
  * @define:  the definition to verify
@@ -2767,22 +2852,6 @@
 	    break;
 	case XML_RELAXNG_TEXT:
 	    break;
-	case XML_RELAXNG_CHOICE: {
-	    xmlRelaxNGDefinePtr list = define->content;
-
-	    oldflags = ctxt->flags;
-	    ctxt->flags |= FLAGS_IGNORABLE;
-
-	    while (list != NULL) {
-		ret = xmlRelaxNGValidateValue(ctxt, list);
-		if (ret == 0) {
-		    break;
-		}
-		list = list->next;
-	    }
-	    ctxt->flags = oldflags;
-	    break;
-	}
 	case XML_RELAXNG_VALUE: {
 	    if (!xmlStrEqual(value, define->value)) {
 		if (define->name != NULL) {
@@ -2825,6 +2894,102 @@
 	    }
 	    break;
 	}
+	case XML_RELAXNG_DATATYPE: {
+	    ret = xmlRelaxNGValidateDatatype(ctxt, value, define);
+	    if (ret == 0)
+		xmlRelaxNGNextValue(ctxt);
+	    
+	    break;
+	}
+	case XML_RELAXNG_CHOICE: {
+	    xmlRelaxNGDefinePtr list = define->content;
+	    xmlChar *oldvalue;
+
+	    oldflags = ctxt->flags;
+	    ctxt->flags |= FLAGS_IGNORABLE;
+
+	    oldvalue = ctxt->state->value;
+	    while (list != NULL) {
+		ret = xmlRelaxNGValidateValue(ctxt, list);
+		if (ret == 0) {
+		    break;
+		}
+		ctxt->state->value = oldvalue;
+		list = list->next;
+	    }
+	    ctxt->flags = oldflags;
+	    break;
+	}
+	case XML_RELAXNG_LIST: {
+	    xmlRelaxNGDefinePtr list = define->content;
+	    xmlChar *oldvalue, *oldend, *val, *cur;
+
+	    oldvalue = ctxt->state->value;
+	    oldend = ctxt->state->endvalue;
+
+	    val = xmlStrdup(oldvalue);
+	    if (val == NULL) {
+		VALID_CTXT();
+		VALID_ERROR("Internal: no state\n");
+		return(-1);
+	    }
+	    cur = val;
+	    while (*cur != 0) {
+		if (IS_BLANK(*cur))
+		    *cur = 0;
+		cur++;
+	    }
+	    ctxt->state->endvalue = cur;
+	    cur = val;
+	    while ((*cur == 0) && (cur != ctxt->state->endvalue)) cur++;
+
+	    ctxt->state->value = cur;
+
+	    while (list != NULL) {
+		ret = xmlRelaxNGValidateValue(ctxt, list);
+		if (ret != 0) {
+		    break;
+		}
+		list = list->next;
+	    }
+	    if ((ret == 0) && (ctxt->state->value != NULL) &&
+		(ctxt->state->value != ctxt->state->endvalue)) {
+		VALID_CTXT();
+		VALID_ERROR("Extra data in list: %s\n", ctxt->state->value);
+		ret = -1;
+	    }
+	    xmlFree(val);
+	    ctxt->state->value = oldvalue;
+	    ctxt->state->endvalue = oldend;
+	    break;
+        }
+        case XML_RELAXNG_ONEORMORE:
+	    ret = xmlRelaxNGValidateValueList(ctxt, define->content);
+	    if (ret != 0) {
+		break;
+	    }
+	    /* no break on purpose */
+        case XML_RELAXNG_ZEROORMORE: {
+            xmlChar *cur, *temp;
+
+	    oldflags = ctxt->flags;
+	    ctxt->flags |= FLAGS_IGNORABLE;
+	    cur = ctxt->state->value;
+	    temp = NULL;
+	    while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
+		   (temp != cur)) {
+		temp = cur;
+		ret = xmlRelaxNGValidateValueList(ctxt, define->content);
+		if (ret != 0) {
+		    ctxt->state->value = temp;
+		    ret = 0;
+		    break;
+		}
+		cur = ctxt->state->value;
+	    }
+	    ctxt->flags = oldflags;
+	    break;
+	}
 	default:
 	    TODO
 	    ret = -1;
@@ -3101,9 +3266,6 @@
 		            node->name, ret);
 #endif
 	    break;
-        case XML_RELAXNG_LIST:
-	    TODO
-	    break;
         case XML_RELAXNG_OPTIONAL:
 	    oldflags = ctxt->flags;
 	    ctxt->flags |= FLAGS_IGNORABLE;
@@ -3239,7 +3401,7 @@
 	     */
 	    if ((node != NULL) && (node->next != NULL)) {
 		VALID_CTXT();
-		VALID_ERROR("The data does not cover the full element %s\n",
+		VALID_ERROR("The value does not cover the full element %s\n",
 			    node->parent->name);
 		ret = -1;
 	    }
@@ -3247,9 +3409,41 @@
 		xmlFree(content);
 	    break;
 	}
+        case XML_RELAXNG_LIST: {
+	    xmlChar *content;
+	    xmlChar *oldvalue, *oldendvalue;
+	    int len;
 
-	    TODO
+	    content = xmlNodeGetContent(node);
+	    len = xmlStrlen(content);
+	    oldvalue = ctxt->state->value;
+	    oldendvalue = ctxt->state->endvalue;
+	    ctxt->state->value = content;
+	    ctxt->state->endvalue = content + len;
+	    ret = xmlRelaxNGValidateValue(ctxt, define);
+	    ctxt->state->value = oldvalue;
+	    ctxt->state->endvalue = oldendvalue;
+	    if (ret == -1) {
+		VALID_CTXT();
+		VALID_ERROR("internal error validating list\n");
+	    } else if (ret == 0) {
+		ctxt->state->seq = node->next;
+	    }
+	    /*
+	     * TODO cover the problems with
+	     * <p>12<!-- comment -->34</p>
+	     * TODO detect full element coverage at compilation time.
+	     */
+	    if ((node != NULL) && (node->next != NULL)) {
+		VALID_CTXT();
+		VALID_ERROR("The list does not cover the full element %s\n",
+			    node->parent->name);
+		ret = -1;
+	    }
+	    if (content != NULL)
+		xmlFree(content);
 	    break;
+        }
     }
     return(ret);
 }
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 6904d3b..c6fec43 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3030
-error detected at relaxng.c:3078
+error detected at relaxng.c:3195
+error detected at relaxng.c:3243
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index cb3157b..cc6c58f 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(name): -1
 xmlRelaxNGValidateDefinition(): validated email : 0
 xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:3078
+error detected at relaxng.c:3243
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor5_1_1.err b/result/relaxng/tutor5_1_1.err
index fa62fe3..12f8f41 100644
--- a/result/relaxng/tutor5_1_1.err
+++ b/result/relaxng/tutor5_1_1.err
@@ -1,3 +1,2 @@
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1138
 xmlRelaxNGValidateDefinition(): validated number : 0
diff --git a/result/relaxng/tutor5_2_1.err b/result/relaxng/tutor5_2_1.err
index b56a85a..3a6dcf1 100644
--- a/result/relaxng/tutor5_2_1.err
+++ b/result/relaxng/tutor5_2_1.err
@@ -1,7 +1,5 @@
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1135
 xmlRelaxNGValidateDefinition(): validated x : 0
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1135
 xmlRelaxNGValidateDefinition(): validated y : 0
 xmlRelaxNGValidateDefinition(): validated point : 0
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index b4edac2..a355b6f 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3211
+error detected at relaxng.c:3373
 xmlRelaxNGValidateDefinition(): validated note : 0
 xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index a0bb286..a21cc23 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(preferredFormat): -1
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3086
+error detected at relaxng.c:3251
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 2f65d34..150516d 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateDefinition(): validated name : 0
 xmlRelaxNGValidateDefinition(): validated email : 0
-error detected at relaxng.c:3078
+error detected at relaxng.c:3243
 xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index a0bb286..a21cc23 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,5 +1,5 @@
 xmlRelaxNGValidateAttribute(preferredFormat): -1
 xmlRelaxNGValidateAttribute(email): 0
 xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3086
+error detected at relaxng.c:3251
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor7_1_1 b/result/relaxng/tutor7_1_1
new file mode 100644
index 0000000..6cae548
--- /dev/null
+++ b/result/relaxng/tutor7_1_1
@@ -0,0 +1 @@
+./test/relaxng/tutor7_1_1.xml validates
diff --git a/result/relaxng/tutor7_1_1.err b/result/relaxng/tutor7_1_1.err
new file mode 100644
index 0000000..6410272
--- /dev/null
+++ b/result/relaxng/tutor7_1_1.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_1_2 b/result/relaxng/tutor7_1_2
new file mode 100644
index 0000000..6efbefe
--- /dev/null
+++ b/result/relaxng/tutor7_1_2
@@ -0,0 +1,4 @@
+Internal: failed to validate type float
+internal error validating list
+Extra content for element vector
+./test/relaxng/tutor7_1_2.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
new file mode 100644
index 0000000..2201c4e
--- /dev/null
+++ b/result/relaxng/tutor7_1_2.err
@@ -0,0 +1,5 @@
+Unimplemented block at xmlschemastypes.c:1132
+error detected at relaxng.c:2769
+error detected at relaxng.c:3427
+error detected at relaxng.c:3243
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_3 b/result/relaxng/tutor7_1_3
new file mode 100644
index 0000000..cc8be56
--- /dev/null
+++ b/result/relaxng/tutor7_1_3
@@ -0,0 +1,4 @@
+Extra data in list: 5.6
+internal error validating list
+Extra content for element vector
+./test/relaxng/tutor7_1_3.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
new file mode 100644
index 0000000..6fab551
--- /dev/null
+++ b/result/relaxng/tutor7_1_3.err
@@ -0,0 +1,6 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+error detected at relaxng.c:2957
+error detected at relaxng.c:3427
+error detected at relaxng.c:3243
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_4 b/result/relaxng/tutor7_1_4
new file mode 100644
index 0000000..81b9f58
--- /dev/null
+++ b/result/relaxng/tutor7_1_4
@@ -0,0 +1 @@
+./test/relaxng/tutor7_1_4.xml validates
diff --git a/result/relaxng/tutor7_1_4.err b/result/relaxng/tutor7_1_4.err
new file mode 100644
index 0000000..6410272
--- /dev/null
+++ b/result/relaxng/tutor7_1_4.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_1 b/result/relaxng/tutor7_2_1
new file mode 100644
index 0000000..8673462
--- /dev/null
+++ b/result/relaxng/tutor7_2_1
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_1.xml validates
diff --git a/result/relaxng/tutor7_2_1.err b/result/relaxng/tutor7_2_1.err
new file mode 100644
index 0000000..fe1fa44
--- /dev/null
+++ b/result/relaxng/tutor7_2_1.err
@@ -0,0 +1,2 @@
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_2 b/result/relaxng/tutor7_2_2
new file mode 100644
index 0000000..d03cb32
--- /dev/null
+++ b/result/relaxng/tutor7_2_2
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_2.xml validates
diff --git a/result/relaxng/tutor7_2_2.err b/result/relaxng/tutor7_2_2.err
new file mode 100644
index 0000000..a0908ab
--- /dev/null
+++ b/result/relaxng/tutor7_2_2.err
@@ -0,0 +1,4 @@
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_3 b/result/relaxng/tutor7_2_3
new file mode 100644
index 0000000..baf1190
--- /dev/null
+++ b/result/relaxng/tutor7_2_3
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_3.xml validates
diff --git a/result/relaxng/tutor7_2_3.err b/result/relaxng/tutor7_2_3.err
new file mode 100644
index 0000000..829f712
--- /dev/null
+++ b/result/relaxng/tutor7_2_3.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_4 b/result/relaxng/tutor7_2_4
new file mode 100644
index 0000000..86d3a08
--- /dev/null
+++ b/result/relaxng/tutor7_2_4
@@ -0,0 +1,3 @@
+Internal: no state
+internal error validating list
+./test/relaxng/tutor7_2_4.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
new file mode 100644
index 0000000..951d0f6
--- /dev/null
+++ b/result/relaxng/tutor7_2_4.err
@@ -0,0 +1,3 @@
+error detected at relaxng.c:2932
+error detected at relaxng.c:3427
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/test/relaxng/tutor5_1.rng b/test/relaxng/tutor5_1.rng
index bf53247..503a043 100644
--- a/test/relaxng/tutor5_1.rng
+++ b/test/relaxng/tutor5_1.rng
@@ -1,3 +1,3 @@
 <element name="number" xmlns="http://relaxng.org/ns/structure/1.0">
-  <data type="integer" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
+  <data type="int" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
 </element>
diff --git a/test/relaxng/tutor7_1.rng b/test/relaxng/tutor7_1.rng
new file mode 100644
index 0000000..116e912
--- /dev/null
+++ b/test/relaxng/tutor7_1.rng
@@ -0,0 +1,7 @@
+<element name="vector" xmlns="http://relaxng.org/ns/structure/1.0"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <list>
+    <data type="float"/>
+    <data type="float"/>
+  </list>
+</element>
diff --git a/test/relaxng/tutor7_1_1.xml b/test/relaxng/tutor7_1_1.xml
new file mode 100644
index 0000000..3f03eea
--- /dev/null
+++ b/test/relaxng/tutor7_1_1.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4</vector>
diff --git a/test/relaxng/tutor7_1_2.xml b/test/relaxng/tutor7_1_2.xml
new file mode 100644
index 0000000..adbfdbd
--- /dev/null
+++ b/test/relaxng/tutor7_1_2.xml
@@ -0,0 +1 @@
+<vector>1.2</vector>
diff --git a/test/relaxng/tutor7_1_3.xml b/test/relaxng/tutor7_1_3.xml
new file mode 100644
index 0000000..f9eeb5c
--- /dev/null
+++ b/test/relaxng/tutor7_1_3.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4 5.6</vector>
diff --git a/test/relaxng/tutor7_1_4.xml b/test/relaxng/tutor7_1_4.xml
new file mode 100644
index 0000000..c9bda7f
--- /dev/null
+++ b/test/relaxng/tutor7_1_4.xml
@@ -0,0 +1 @@
+<vector>  1.2 3.4 </vector>
diff --git a/test/relaxng/tutor7_2.rng b/test/relaxng/tutor7_2.rng
new file mode 100644
index 0000000..a1c71d2
--- /dev/null
+++ b/test/relaxng/tutor7_2.rng
@@ -0,0 +1,8 @@
+<element name="vector" xmlns="http://relaxng.org/ns/structure/1.0"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <list>
+    <oneOrMore>
+      <data type="double"/>
+    </oneOrMore>
+  </list>
+</element>
diff --git a/test/relaxng/tutor7_2_1.xml b/test/relaxng/tutor7_2_1.xml
new file mode 100644
index 0000000..adbfdbd
--- /dev/null
+++ b/test/relaxng/tutor7_2_1.xml
@@ -0,0 +1 @@
+<vector>1.2</vector>
diff --git a/test/relaxng/tutor7_2_2.xml b/test/relaxng/tutor7_2_2.xml
new file mode 100644
index 0000000..f9eeb5c
--- /dev/null
+++ b/test/relaxng/tutor7_2_2.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4 5.6</vector>
diff --git a/test/relaxng/tutor7_2_3.xml b/test/relaxng/tutor7_2_3.xml
new file mode 100644
index 0000000..5274bad
--- /dev/null
+++ b/test/relaxng/tutor7_2_3.xml
@@ -0,0 +1 @@
+<vector>  1.2   3.4   </vector>
diff --git a/test/relaxng/tutor7_2_4.xml b/test/relaxng/tutor7_2_4.xml
new file mode 100644
index 0000000..719ba5f
--- /dev/null
+++ b/test/relaxng/tutor7_2_4.xml
@@ -0,0 +1 @@
+<vector></vector>
diff --git a/test/relaxng/tutor7_3.rng b/test/relaxng/tutor7_3.rng
new file mode 100644
index 0000000..cbedaf9
--- /dev/null
+++ b/test/relaxng/tutor7_3.rng
@@ -0,0 +1,9 @@
+<element name="path" xmlns="http://relaxng.org/ns/structure/1.0"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+  <list>
+    <oneOrMore>
+      <data type="double"/>
+      <data type="double"/>
+    </oneOrMore>
+  </list>
+</element>
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 1be67c8..52a069b 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -110,6 +110,9 @@
 static int xmlSchemaTypesInitialized = 0;
 static xmlHashTablePtr xmlSchemaTypesBank = NULL;
 
+/*
+ * Basic types
+ */
 static xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
@@ -123,13 +126,28 @@
 static xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
-static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
-static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeNmtoken = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
 
 /*
+ * Derived types
+ */
+static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
+
+/*
  * xmlSchemaInitBasicType:
  * @name:  the type name
  *
@@ -165,6 +183,9 @@
 	return;
     xmlSchemaTypesBank = xmlHashCreate(40);
     
+    /*
+     * primitive datatypes
+     */
     xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string");
     xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType");
     xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType");
@@ -178,13 +199,27 @@
     xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay");
     xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay");
     xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration");
-    xmlSchemaTypePositiveIntegerDef = xmlSchemaInitBasicType("positiveInteger");
-    xmlSchemaTypeNonNegativeIntegerDef =
-	xmlSchemaInitBasicType("nonNegativeInteger");
     xmlSchemaTypeNmtoken = xmlSchemaInitBasicType("NMTOKEN");
     xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float");
     xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double");
 
+    /*
+     * derived datatypes
+     */
+    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer");;
+    xmlSchemaTypeNonPositiveIntegerDef = xmlSchemaInitBasicType("nonPositiveInteger");;
+    xmlSchemaTypeNegativeIntegerDef = xmlSchemaInitBasicType("negativeInteger");;
+    xmlSchemaTypeLongDef = xmlSchemaInitBasicType("long");;
+    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int");;
+    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short");;
+    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte");;
+    xmlSchemaTypeNonNegativeIntegerDef = xmlSchemaInitBasicType("nonNegativeInteger");
+    xmlSchemaTypeUnsignedLongDef = xmlSchemaInitBasicType("unsignedLong");;
+    xmlSchemaTypeUnsignedIntDef = xmlSchemaInitBasicType("unsignedInt");;
+    xmlSchemaTypeUnsignedShortDef = xmlSchemaInitBasicType("insignedShort");;
+    xmlSchemaTypeUnsignedByteDef = xmlSchemaInitBasicType("unsignedByte");;
+    xmlSchemaTypePositiveIntegerDef = xmlSchemaInitBasicType("positiveInteger");
+
     xmlSchemaTypesInitialized = 1;
 }