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

* relaxng.c: more work on Relax-NG
* test/relaxng/* result/relaxng/*: augmented/updated the
  regression tests
Daniel
diff --git a/ChangeLog b/ChangeLog
index bbe98d7..9974d09 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Jan 26 20:38:43 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c: more work on Relax-NG
+	* test/relaxng/* result/relaxng/*: augmented/updated the 
+	  regression tests
+
 Sun Jan 26 01:49:58 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* relaxng.c: more work on Relax-NG
diff --git a/relaxng.c b/relaxng.c
index 2391f72..a104d8e 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -653,6 +653,8 @@
  * 			Type library hooks				*
  * 									*
  ************************************************************************/
+static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
+	                            const xmlChar *str);
 
 /**
  * xmlRelaxNGSchemaTypeHave:
@@ -767,8 +769,31 @@
 	                     const xmlChar *type ATTRIBUTE_UNUSED,
 	                     const xmlChar *value1 ATTRIBUTE_UNUSED,
 			     const xmlChar *value2 ATTRIBUTE_UNUSED) {
-    TODO
-    return(1);
+    int ret = -1;
+
+    if (xmlStrEqual(type, BAD_CAST "string")) {
+	ret = xmlStrEqual(value1, value2);
+    } else if (xmlStrEqual(type, BAD_CAST "token")) {
+	if (!xmlStrEqual(value1, value2)) {
+	    xmlChar *nval, *nvalue;
+
+	    /*
+	     * TODO: trivial optimizations are possible by
+	     * computing at compile-time
+	     */
+	    nval = xmlRelaxNGNormalize(NULL, value1);
+	    nvalue = xmlRelaxNGNormalize(NULL, value2);
+
+	    if ((nval == NULL) || (nvalue == NULL) ||
+		(!xmlStrEqual(nval, nvalue)))
+		ret = -1;
+	    if (nval != NULL)
+		xmlFree(nval);
+	    if (nvalue != NULL)
+		xmlFree(nvalue);
+	}
+    }
+    return(ret);
 }
  
 static int xmlRelaxNGTypeInitialized = 0;
@@ -2656,8 +2681,13 @@
 
     ret = (xmlChar *) xmlMalloc((len + 1) * sizeof(xmlChar));
     if (ret == NULL) {
-	VALID_CTXT();
-	VALID_ERROR("xmlRelaxNGNormalize: out of memory\n");
+	if (ctxt != NULL) {
+	    VALID_CTXT();
+	    VALID_ERROR("xmlRelaxNGNormalize: out of memory\n");
+	} else {
+	    xmlGenericError(xmlGenericErrorContext,
+		"xmlRelaxNGNormalize: out of memory\n");
+	}
         return(NULL);
     }
     p = ret;
@@ -2756,7 +2786,24 @@
 	case XML_RELAXNG_VALUE: {
 	    if (!xmlStrEqual(value, define->value)) {
 		if (define->name != NULL) {
-		    TODO /* value validation w.r.t. the type */
+		    xmlRelaxNGTypeLibraryPtr lib;
+		    
+		    lib = (xmlRelaxNGTypeLibraryPtr) define->data;
+		    if ((lib != NULL) && (lib->comp != NULL))
+			ret = lib->comp(lib->data, define->name, value,
+				        define->value);
+		    else
+			ret = -1;
+		    if (ret < 0) {
+			VALID_CTXT();
+			VALID_ERROR("Internal: failed to compare type %s\n",
+				    define->name);
+			return(-1);
+		    } else if (ret == 1) {
+			ret = 0;
+		    } else {
+			ret = -1;
+		    }
 		} else {
 		    xmlChar *nval, *nvalue;
 
@@ -2767,7 +2814,8 @@
 		    nval = xmlRelaxNGNormalize(ctxt, define->value);
 		    nvalue = xmlRelaxNGNormalize(ctxt, value);
 
-		    if (!xmlStrEqual(nval, nvalue))
+		    if ((nval == NULL) || (nvalue == NULL) ||
+			(!xmlStrEqual(nval, nvalue)))
 			ret = -1;
 		    if (nval != NULL)
 			xmlFree(nval);
@@ -3036,7 +3084,7 @@
 	    for (i = 0;i < state->nbAttrs;i++) {
 		if (state->attrs[i] != NULL) {
 		    VALID_CTXT();
-		    VALID_ERROR("Extra attribute %s for element %s\n",
+		    VALID_ERROR("Invalid attribute %s for element %s\n",
 				state->attrs[i]->name, node->name);
 		    ret = -1;
 		}
@@ -3169,7 +3217,37 @@
 		xmlFree(content);
 	    break;
 	}
-        case XML_RELAXNG_VALUE:
+        case XML_RELAXNG_VALUE: {
+	    xmlChar *content;
+	    xmlChar *oldvalue;
+
+	    content = xmlNodeGetContent(node);
+	    oldvalue = ctxt->state->value;
+	    ctxt->state->value = content;
+	    ret = xmlRelaxNGValidateValue(ctxt, define);
+	    ctxt->state->value = oldvalue;
+	    if (ret == -1) {
+		VALID_CTXT();
+		VALID_ERROR("internal error validating %s\n", define->name);
+	    } 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 data does not cover the full element %s\n",
+			    node->parent->name);
+		ret = -1;
+	    }
+	    if (content != NULL)
+		xmlFree(content);
+	    break;
+	}
+
 	    TODO
 	    break;
     }
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 48ac0c4..6904d3b 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:2982
 error detected at relaxng.c:3030
+error detected at relaxng.c:3078
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index 9c72d17..cb3157b 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:3030
+error detected at relaxng.c:3078
 xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor5_1_1.err b/result/relaxng/tutor5_1_1.err
index e9fa2d9..fa62fe3 100644
--- a/result/relaxng/tutor5_1_1.err
+++ b/result/relaxng/tutor5_1_1.err
@@ -1,3 +1,3 @@
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:691
 xmlRelaxNGValidateDefinition(): validated number : 0
diff --git a/result/relaxng/tutor5_2_1.err b/result/relaxng/tutor5_2_1.err
index ac9beb0..b56a85a 100644
--- a/result/relaxng/tutor5_2_1.err
+++ b/result/relaxng/tutor5_2_1.err
@@ -1,7 +1,7 @@
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:691
 xmlRelaxNGValidateDefinition(): validated x : 0
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:691
 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 5f30338..b4edac2 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3163
+error detected at relaxng.c:3211
 xmlRelaxNGValidateDefinition(): validated note : 0
 xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3 b/result/relaxng/tutor6_1_3
index 2dea674..56aa11c 100644
--- a/result/relaxng/tutor6_1_3
+++ b/result/relaxng/tutor6_1_3
@@ -1,2 +1,2 @@
-Extra attribute preferredFormat for element card
+Invalid attribute preferredFormat for element card
 ./test/relaxng/tutor6_1_3.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index 68f183f..a0bb286 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:3038
+error detected at relaxng.c:3086
 xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_1_4 b/result/relaxng/tutor6_1_4
new file mode 100644
index 0000000..d9b2291
--- /dev/null
+++ b/result/relaxng/tutor6_1_4
@@ -0,0 +1 @@
+./test/relaxng/tutor6_1_4.xml validates
diff --git a/result/relaxng/tutor6_1_4.err b/result/relaxng/tutor6_1_4.err
new file mode 100644
index 0000000..6e45621
--- /dev/null
+++ b/result/relaxng/tutor6_1_4.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateAttribute(preferredFormat): 0
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_1_5 b/result/relaxng/tutor6_1_5
new file mode 100644
index 0000000..f601d7e
--- /dev/null
+++ b/result/relaxng/tutor6_1_5
@@ -0,0 +1 @@
+./test/relaxng/tutor6_1_5.xml validates
diff --git a/result/relaxng/tutor6_1_5.err b/result/relaxng/tutor6_1_5.err
new file mode 100644
index 0000000..6e45621
--- /dev/null
+++ b/result/relaxng/tutor6_1_5.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateAttribute(preferredFormat): 0
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_1 b/result/relaxng/tutor6_2_1
new file mode 100644
index 0000000..d07807b
--- /dev/null
+++ b/result/relaxng/tutor6_2_1
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_1.xml validates
diff --git a/result/relaxng/tutor6_2_1.err b/result/relaxng/tutor6_2_1.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_2 b/result/relaxng/tutor6_2_2
new file mode 100644
index 0000000..df10075
--- /dev/null
+++ b/result/relaxng/tutor6_2_2
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_2.xml validates
diff --git a/result/relaxng/tutor6_2_2.err b/result/relaxng/tutor6_2_2.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_2.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_3 b/result/relaxng/tutor6_2_3
new file mode 100644
index 0000000..17602d3
--- /dev/null
+++ b/result/relaxng/tutor6_2_3
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_3.xml validates
diff --git a/result/relaxng/tutor6_2_3.err b/result/relaxng/tutor6_2_3.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_3.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_4 b/result/relaxng/tutor6_2_4
new file mode 100644
index 0000000..4d52fa1
--- /dev/null
+++ b/result/relaxng/tutor6_2_4
@@ -0,0 +1,2 @@
+Extra content for element preferredFormat
+./test/relaxng/tutor6_2_4.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
new file mode 100644
index 0000000..2f65d34
--- /dev/null
+++ b/result/relaxng/tutor6_2_4.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+error detected at relaxng.c:3078
+xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
+xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1 b/result/relaxng/tutor6_3_1
new file mode 100644
index 0000000..8a9225c
--- /dev/null
+++ b/result/relaxng/tutor6_3_1
@@ -0,0 +1,2 @@
+Invalid attribute preferredFormat for element card
+./test/relaxng/tutor6_3_1.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
new file mode 100644
index 0000000..a0bb286
--- /dev/null
+++ b/result/relaxng/tutor6_3_1.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateAttribute(preferredFormat): -1
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+error detected at relaxng.c:3086
+xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/test/relaxng/tutor6_1_4.xml b/test/relaxng/tutor6_1_4.xml
new file mode 100644
index 0000000..0ad64dd
--- /dev/null
+++ b/test/relaxng/tutor6_1_4.xml
@@ -0,0 +1 @@
+<card name="John Smith" email="js@example.com" preferredFormat="  html  "/>
diff --git a/test/relaxng/tutor6_1_5.xml b/test/relaxng/tutor6_1_5.xml
new file mode 100644
index 0000000..c5d22bd
--- /dev/null
+++ b/test/relaxng/tutor6_1_5.xml
@@ -0,0 +1,2 @@
+<card name="John Smith" email="js@example.com" preferredFormat="html"/>
+
diff --git a/test/relaxng/tutor6_2_1.xml b/test/relaxng/tutor6_2_1.xml
new file mode 100644
index 0000000..5064bf2
--- /dev/null
+++ b/test/relaxng/tutor6_2_1.xml
@@ -0,0 +1,5 @@
+<card>
+  <name>John Smith</name>
+  <email>js@example.com</email>
+  <preferredFormat>text</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_2.xml b/test/relaxng/tutor6_2_2.xml
new file mode 100644
index 0000000..57da2e8
--- /dev/null
+++ b/test/relaxng/tutor6_2_2.xml
@@ -0,0 +1,5 @@
+<card>
+  <name>John Smith</name>
+  <email>js@example.com</email>
+  <preferredFormat>html</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_3.xml b/test/relaxng/tutor6_2_3.xml
new file mode 100644
index 0000000..acca979
--- /dev/null
+++ b/test/relaxng/tutor6_2_3.xml
@@ -0,0 +1,5 @@
+<card>
+  <name>John Smith</name>
+  <email>js@example.com</email>
+  <preferredFormat>  html  </preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_4.xml b/test/relaxng/tutor6_2_4.xml
new file mode 100644
index 0000000..c3f723b
--- /dev/null
+++ b/test/relaxng/tutor6_2_4.xml
@@ -0,0 +1,5 @@
+<card>
+  <name>John Smith</name>
+  <email>js@example.com</email>
+  <preferredFormat>error</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_3_1.xml b/test/relaxng/tutor6_3_1.xml
new file mode 100644
index 0000000..0ad64dd
--- /dev/null
+++ b/test/relaxng/tutor6_3_1.xml
@@ -0,0 +1 @@
+<card name="John Smith" email="js@example.com" preferredFormat="  html  "/>