forgot to apply one check from #106931 patch more work on XML Schemas

* xinclude.c: forgot to apply one check from #106931 patch
* xmlschemastypes.c: more work on XML Schemas datatypes
Daniel
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 925eb22..c871479 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -1120,6 +1120,58 @@
 }
 
 /**
+ * xmlSchemaCollapseString:
+ * @value: a value
+ *
+ * Removes and normalize white spaces in the string
+ *
+ * Returns the new string or NULL if no change was required.
+ */
+static xmlChar *
+xmlSchemaCollapseString(const xmlChar *value) {
+    const xmlChar *start = value, *end, *f;
+    xmlChar *g;
+    int col = 0;
+
+    if (value == NULL) return(NULL);
+    while ((*start != 0) && (IS_BLANK(*start))) start++;
+    end = start;
+    while (*end != 0) {
+	if ((*end == ' ') && (IS_BLANK(end[1]))) {
+	    col = end - start;
+	    break;
+	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
+	    col = end - start;
+	    break;
+	}
+	end++;
+    }
+    if (col == 0) {
+	f = end;
+	end--;
+	while ((end > start) && (IS_BLANK(*end))) end--;
+	end++;
+	if ((start == value) && (f == end)) return(NULL);
+	return(xmlStrndup(start, end - start));
+    }
+    start = xmlStrdup(start);
+    if (start == NULL) return(NULL);
+    g = (xmlChar *) (start + col);
+    end = g;
+    while (*end != 0) {
+	if (IS_BLANK(*end)) {
+	    end++;
+	    while (IS_BLANK(*end)) end++;
+	    if (*end != 0)
+		*g++ = ' ';
+	} else
+	    *g++ = *end++;
+    }
+    *g = 0;
+    return((xmlChar *) start);
+}
+
+/**
  * xmlSchemaValAtomicListNode:
  * @type: the predefined atomic type for a token in the list
  * @value: the list value to check
@@ -1189,6 +1241,676 @@
 }
 
 /**
+ * xmlSchemaValAtomicType:
+ * @type: the predefined type
+ * @value: the value to check
+ * @val:  the return computed value
+ * @node:  the node containing the value
+ * flags:  flags to control the vlidation
+ *
+ * Check that a value conforms to the lexical space of the atomic type.
+ * if true a value is computed and returned in @val.
+ *
+ * Returns 0 if this validates, a positive error code number otherwise
+ *         and -1 in case of internal or API error.
+ */
+static int
+xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value,
+	               xmlSchemaValPtr *val, xmlNodePtr node, int flags) {
+    xmlSchemaValPtr v;
+    xmlChar *norm = NULL;
+    int ret;
+
+    if (xmlSchemaTypesInitialized == 0)
+	return(-1);
+    if (type == NULL)
+	return(-1);
+
+    if (val != NULL)
+	*val = NULL;
+    if ((flags == 0) && (value != NULL)) {
+	if ((type->flags != XML_SCHEMAS_STRING) &&
+	    (type->flags != XML_SCHEMAS_NORMSTRING)) {
+	    norm = xmlSchemaCollapseString(value);
+	    if (norm != NULL)
+		value = norm;
+	}
+    }
+
+    switch (type->flags) {
+        case XML_SCHEMAS_UNKNOWN:
+	    if (type == xmlSchemaTypeAnyTypeDef)
+		goto return0;
+	    goto error;
+        case XML_SCHEMAS_STRING:
+	    goto return0;
+        case XML_SCHEMAS_NORMSTRING:
+	    TODO
+	    goto return0;
+        case XML_SCHEMAS_DECIMAL: {
+	    const xmlChar *cur = value, *tmp;
+	    int frac = 0, len, neg = 0;
+	    unsigned long base = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '+')
+		cur++;
+	    else if (*cur == '-') {
+		neg = 1;
+		cur++;
+	    }
+	    tmp = cur;
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		cur++;
+	    }
+	    len = cur - tmp;
+	    if (*cur == '.') {
+		cur++;
+		tmp = cur;
+		while ((*cur >= '0') && (*cur <= '9')) {
+		    base = base * 10 + (*cur - '0');
+		    cur++;
+		}
+		frac = cur - tmp;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = neg;
+		    v->value.decimal.frac = frac;
+		    v->value.decimal.total = frac + len;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_TIME:
+        case XML_SCHEMAS_GDAY:
+        case XML_SCHEMAS_GMONTH:
+        case XML_SCHEMAS_GMONTHDAY:
+        case XML_SCHEMAS_GYEAR:
+        case XML_SCHEMAS_GYEARMONTH:
+        case XML_SCHEMAS_DATE:
+        case XML_SCHEMAS_DATETIME:
+	    ret = xmlSchemaValidateDates(type, value, val);
+	    break;
+        case XML_SCHEMAS_DURATION:
+	    ret = xmlSchemaValidateDuration(type, value, val);
+	    break;
+        case XML_SCHEMAS_FLOAT:
+        case XML_SCHEMAS_DOUBLE: {
+	    const xmlChar *cur = value;
+	    int neg = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
+		cur += 3;
+		if (*cur != 0)
+		    goto return1;
+		if (val != NULL) {
+		    if (type == xmlSchemaTypeFloatDef) {
+			v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
+			if (v != NULL) {
+			    v->value.f = (float) xmlXPathNAN;
+			} else {
+			    xmlSchemaFreeValue(v);
+			    goto error;
+			}
+		    } else {
+			v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
+			if (v != NULL) {
+			    v->value.d = xmlXPathNAN;
+			} else {
+			    xmlSchemaFreeValue(v);
+			    goto error;
+			}
+		    }
+		    *val = v;
+		}
+		goto return0;
+	    }
+	    if (*cur == '-') {
+		neg = 1;
+		cur++;
+	    }
+	    if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
+		cur += 3;
+		if (*cur != 0)
+		    goto return1;
+		if (val != NULL) {
+		    if (type == xmlSchemaTypeFloatDef) {
+			v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
+			if (v != NULL) {
+			    if (neg)
+				v->value.f = (float) xmlXPathNINF;
+			    else
+				v->value.f = (float) xmlXPathPINF;
+			} else {
+			    xmlSchemaFreeValue(v);
+			    goto error;
+			}
+		    } else {
+			v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
+			if (v != NULL) {
+			    if (neg)
+				v->value.d = xmlXPathNINF;
+			    else
+				v->value.d = xmlXPathPINF;
+			} else {
+			    xmlSchemaFreeValue(v);
+			    goto error;
+			}
+		    }
+		    *val = v;
+		}
+		goto return0;
+	    }
+	    if ((neg == 0) && (*cur == '+'))
+		cur++;
+	    if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
+		goto return1;
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		cur++;
+	    }
+	    if (*cur == '.') {
+		cur++;
+		while ((*cur >= '0') && (*cur <= '9')) 
+		    cur++;
+	    }
+	    if ((*cur == 'e') || (*cur == 'E')) {
+		cur++;
+		if ((*cur == '-') || (*cur == '+'))
+		    cur++;
+		while ((*cur >= '0') && (*cur <= '9')) 
+		    cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if (val != NULL) {
+		if (type == xmlSchemaTypeFloatDef) {
+		    v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
+		    if (v != NULL) {
+			if (sscanf((const char *)value, "%f", &(v->value.f))==1) {
+			    *val = v;
+			} else {
+			    xmlGenericError(xmlGenericErrorContext,
+				    "failed to scanf float %s\n", value);
+			    xmlSchemaFreeValue(v);
+			    goto return1;
+			}
+		    } else {
+			goto error;
+		    }
+		} else {
+		    v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
+		    if (v != NULL) {
+			if (sscanf((const char *)value, "%lf", &(v->value.d))==1) {
+			    *val = v;
+			} else {
+			    xmlGenericError(xmlGenericErrorContext,
+				    "failed to scanf double %s\n", value);
+			    xmlSchemaFreeValue(v);
+			    goto return1;
+			}
+		    } else {
+			goto error;
+		    }
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_BOOLEAN: {
+	    const xmlChar *cur = value;
+
+	    if ((cur[0] == '0') && (cur[1] == 0))
+		ret = 0;
+	    else if ((cur[0] == '1') && (cur[1] == 0))
+		ret = 1;
+	    else if ((cur[0] == 't') && (cur[1] == 'r') && (cur[2] == 'u') &&
+		     (cur[3] == 'e') && (cur[4] == 0))
+		ret = 1;
+	    else if ((cur[0] == 'f') && (cur[1] == 'a') && (cur[2] == 'l') &&
+		     (cur[3] == 's') && (cur[4] == 'e') && (cur[5] == 0))
+		ret = 0;
+	    else 
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
+		if (v != NULL) {
+		    v->value.b = ret;
+		    *val = v;
+		} else {
+		    goto error;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_TOKEN: {
+	    const xmlChar *cur = value;
+
+	    if (IS_BLANK(*cur))
+		goto return1;
+
+	    while (*cur != 0) {
+		if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
+		    goto return1;
+		} else if (*cur == ' ') {
+		    cur++;
+		    if (*cur == 0)
+			goto return1;
+		    if (*cur == ' ')
+			goto return1;
+		} else {
+		    cur++;
+		}
+	    }
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
+		if (v != NULL) {
+		    v->value.str = xmlStrdup(value);
+		    *val = v;
+		} else {
+		    goto error;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_LANGUAGE:
+	    if (xmlCheckLanguageID(value) == 1) {
+		if (val != NULL) {
+		    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
+		    if (v != NULL) {
+			v->value.str = xmlStrdup(value);
+			*val = v;
+		    } else {
+			goto error;
+		    }
+		}
+		goto return0;
+	    }
+	    goto return1;
+        case XML_SCHEMAS_NMTOKEN:
+	    if (xmlValidateNMToken(value, 1) == 0) {
+		if (val != NULL) {
+		    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
+		    if (v != NULL) {
+			v->value.str = xmlStrdup(value);
+			*val = v;
+		    } else {
+			goto error;
+		    }
+		}
+		goto return0;
+	    }
+	    goto return1;
+        case XML_SCHEMAS_NMTOKENS:
+	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
+					     value, val, node);
+	    if (ret > 0)
+		ret = 0;
+	    else
+		ret = 1;
+	    goto done;
+        case XML_SCHEMAS_NAME:
+	    ret = xmlValidateName(value, 1);
+	    if ((ret == 0) && (val != NULL)) {
+		TODO;
+	    }
+	    goto done;
+        case XML_SCHEMAS_QNAME:
+	    ret = xmlValidateQName(value, 1);
+	    if ((ret == 0) && (val != NULL)) {
+		TODO;
+	    }
+	    goto done;
+        case XML_SCHEMAS_NCNAME:
+	    ret = xmlValidateNCName(value, 1);
+	    if ((ret == 0) && (val != NULL)) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
+		if (v != NULL) {
+		    v->value.str = xmlStrdup(value);
+		    *val = v;
+		} else {
+		    goto error;
+		}
+	    }
+	    goto done;
+        case XML_SCHEMAS_ID:
+	    ret = xmlValidateNCName(value, 1);
+	    if ((ret == 0) && (val != NULL)) {
+		TODO;
+	    }
+	    if ((ret == 0) && (node != NULL) &&
+		(node->type == XML_ATTRIBUTE_NODE)) {
+		xmlAttrPtr attr = (xmlAttrPtr) node;
+		/*
+		 * NOTE: the IDness might have already be declared in the DTD
+		 */
+		if (attr->atype != XML_ATTRIBUTE_ID) {
+		    xmlIDPtr res;
+		    xmlChar *strip;
+
+		    strip = xmlSchemaStrip(value);
+		    if (strip != NULL) {
+			res = xmlAddID(NULL, node->doc, strip, attr);
+			xmlFree(strip);
+		    } else
+			res = xmlAddID(NULL, node->doc, value, attr);
+		    if (res == NULL) {
+			ret = 2;
+		    } else {
+			attr->atype = XML_ATTRIBUTE_ID;
+		    }
+		}
+	    }
+	    goto done;
+        case XML_SCHEMAS_IDREF:
+	    ret = xmlValidateNCName(value, 1);
+	    if ((ret == 0) && (val != NULL)) {
+		TODO;
+	    }
+	    if ((ret == 0) && (node != NULL) &&
+		(node->type == XML_ATTRIBUTE_NODE)) {
+		xmlAttrPtr attr = (xmlAttrPtr) node;
+		xmlChar *strip;
+
+		strip = xmlSchemaStrip(value);
+		if (strip != NULL) {
+		    xmlAddRef(NULL, node->doc, strip, attr);
+		    xmlFree(strip);
+		} else
+		    xmlAddRef(NULL, node->doc, value, attr);
+		attr->atype = XML_ATTRIBUTE_IDREF;
+	    }
+	    goto done;
+        case XML_SCHEMAS_IDREFS:
+	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
+					     value, val, node);
+	    if (ret < 0)
+		ret = 2;
+	    else
+		ret = 0;
+	    if ((ret == 0) && (node != NULL) &&
+		(node->type == XML_ATTRIBUTE_NODE)) {
+		xmlAttrPtr attr = (xmlAttrPtr) node;
+
+		attr->atype = XML_ATTRIBUTE_IDREFS;
+	    }
+	    goto done;
+        case XML_SCHEMAS_ENTITY: {
+	    xmlChar *strip;
+	    ret = xmlValidateNCName(value, 1);
+	    if ((node == NULL) || (node->doc == NULL))
+		ret = 3;
+	    if (ret == 0) {
+		xmlEntityPtr ent;
+
+		strip = xmlSchemaStrip(value);
+		if (strip != NULL) {
+		    ent = xmlGetDocEntity(node->doc, strip);
+		    xmlFree(strip);
+		} else {
+		    ent = xmlGetDocEntity(node->doc, value);
+		}
+		if ((ent == NULL) ||
+		    (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
+		    ret = 4;
+	    }
+	    if ((ret == 0) && (val != NULL)) {
+		TODO;
+	    }
+	    if ((ret == 0) && (node != NULL) &&
+		(node->type == XML_ATTRIBUTE_NODE)) {
+		xmlAttrPtr attr = (xmlAttrPtr) node;
+
+		attr->atype = XML_ATTRIBUTE_ENTITY;
+	    }
+	    goto done;
+	}
+        case XML_SCHEMAS_ENTITIES:
+	    if ((node == NULL) || (node->doc == NULL))
+		goto return3;
+	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
+					     value, val, node);
+	    if (ret <= 0)
+		ret = 1;
+	    else
+		ret = 0;
+	    if ((ret == 0) && (node != NULL) &&
+		(node->type == XML_ATTRIBUTE_NODE)) {
+		xmlAttrPtr attr = (xmlAttrPtr) node;
+
+		attr->atype = XML_ATTRIBUTE_ENTITIES;
+	    }
+	    goto done;
+        case XML_SCHEMAS_NOTATION:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_ANYURI: {
+	    xmlURIPtr uri;
+
+	    uri = xmlParseURI((const char *) value);
+	    if (uri == NULL)
+		goto return1;
+	    if (val != NULL) {
+		TODO;
+	    }
+	    xmlFreeURI(uri);
+	    goto return0;
+	}
+        case XML_SCHEMAS_INTEGER: {
+	    const xmlChar *cur = value;
+	    unsigned long base = 0;
+	    int total = 0;
+	    int sign = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '-') {
+		sign = 1;
+		cur++;
+	    } else if (*cur == '+')
+		cur++;
+	    while (*cur == '0') {
+		total++;
+		cur++;
+	    }
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		total++;
+		cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if ((sign == 1) && (total == 0))
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_INTEGER);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = sign;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_NPINTEGER: {
+	    const xmlChar *cur = value;
+	    unsigned long base = 0;
+	    int total = 0;
+	    int sign = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '-') {
+		sign = 1;
+		cur++;
+	    }
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		total++;
+		cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if ((sign != 1) && (base != 0))
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = 0;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_NINTEGER:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_NNINTEGER: {
+	    const xmlChar *cur = value;
+	    unsigned long base = 0;
+	    int total = 0;
+	    int sign = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '-') {
+		sign = 1;
+		cur++;
+	    }
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		total++;
+		cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if ((sign == 1) && (base != 0))
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = 0;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_PINTEGER: {
+	    const xmlChar *cur = value;
+	    unsigned long base = 0;
+	    int total = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '+')
+		cur++;
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		total++;
+		cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = 0;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_INT: {
+	    const xmlChar *cur = value;
+	    unsigned long base = 0;
+	    int total = 0;
+	    int sign = 0;
+	    if (cur == NULL)
+		goto return1;
+	    if (*cur == '-') {
+		sign = 1;
+		cur++;
+	    } else if (*cur == '+')
+		cur++;
+	    while (*cur == '0') {
+		total++;
+		cur++;
+	    }
+	    while ((*cur >= '0') && (*cur <= '9')) {
+		base = base * 10 + (*cur - '0');
+		total++;
+		cur++;
+	    }
+	    if (*cur != 0)
+		goto return1;
+	    if ((sign == 1) && (total == 0))
+		goto return1;
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_INT);
+		if (v != NULL) {
+		    v->value.decimal.base = base;
+		    v->value.decimal.sign = sign;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
+        case XML_SCHEMAS_UINT:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_LONG:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_ULONG:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_SHORT:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_USHORT:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_BYTE:
+	    TODO;
+	    break;
+        case XML_SCHEMAS_UBYTE:
+	    TODO;
+	    break;
+    }
+
+done:
+    if (norm != NULL) xmlFree(norm);
+    return(ret);
+return3:
+    if (norm != NULL) xmlFree(norm);
+    return(3);
+return1:
+    if (norm != NULL) xmlFree(norm);
+    return(1);
+return0:
+    if (norm != NULL) xmlFree(norm);
+    return(0);
+error:
+    if (norm != NULL) xmlFree(norm);
+    return(-1);
+}
+
+/**
  * xmlSchemaValPredefTypeNode:
  * @type: the predefined type
  * @value: the value to check
@@ -1204,589 +1926,7 @@
 int
 xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
 	                   xmlSchemaValPtr *val, xmlNodePtr node) {
-    xmlSchemaValPtr v;
-    int ret;
-
-    if (xmlSchemaTypesInitialized == 0)
-	return(-1);
-    if (type == NULL)
-	return(-1);
-
-    if (val != NULL)
-	*val = NULL;
-    if (type == xmlSchemaTypeStringDef) { 
-	return(0);
-    } else if (type == xmlSchemaTypeAnyTypeDef) {
-	return(0);
-    } else if (type == xmlSchemaTypeAnySimpleTypeDef) {
-	return(0);
-    } else if (type == xmlSchemaTypeNmtokenDef) {
-	if (xmlValidateNMToken(value, 1) == 0) {
-	    if (val != NULL) {
-		v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
-		if (v != NULL) {
-		    v->value.str = xmlStrdup(value);
-		    *val = v;
-		} else {
-		    return(-1);
-		}
-	    }
-	    return(0);
-	}
-	return(1);
-    } else if (type == xmlSchemaTypeNmtokensDef) {
-	ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
-		                         value, val, node);
-	if (ret > 0)
-	    ret = 0;
-	else
-	    ret = 1;
-	return(ret);
-    } else if (type == xmlSchemaTypeDecimalDef) {
-	const xmlChar *cur = value, *tmp;
-	int frac = 0, len, neg = 0;
-	unsigned long base = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '+')
-	    cur++;
-	else if (*cur == '-') {
-	    neg = 1;
-	    cur++;
-	}
-	tmp = cur;
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    cur++;
-	}
-	len = cur - tmp;
-	if (*cur == '.') {
-	    cur++;
-	    tmp = cur;
-	    while ((*cur >= '0') && (*cur <= '9')) {
-		base = base * 10 + (*cur - '0');
-		cur++;
-	    }
-	    frac = cur - tmp;
-	}
-	if (*cur != 0)
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = neg;
-		v->value.decimal.frac = frac;
-		v->value.decimal.total = frac + len;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeDurationDef) {
-        return xmlSchemaValidateDuration(type, value, val);
-    } else if ((type == xmlSchemaTypeDatetimeDef) ||
-               (type == xmlSchemaTypeTimeDef) ||
-               (type == xmlSchemaTypeDateDef) ||
-               (type == xmlSchemaTypeGYearDef) ||
-               (type == xmlSchemaTypeGYearMonthDef) ||
-               (type == xmlSchemaTypeGMonthDef) ||
-               (type == xmlSchemaTypeGMonthDayDef) ||
-               (type == xmlSchemaTypeGDayDef))         {
-        return xmlSchemaValidateDates(type, value, val);
-    } else if (type == xmlSchemaTypePositiveIntegerDef) {
-	const xmlChar *cur = value;
-	unsigned long base = 0;
-	int total = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '+')
-	    cur++;
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    total++;
-	    cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = 0;
-		v->value.decimal.frac = 0;
-		v->value.decimal.total = total;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeNonNegativeIntegerDef) {
-	const xmlChar *cur = value;
-	unsigned long base = 0;
-	int total = 0;
-	int sign = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '-') {
-	    sign = 1;
-	    cur++;
-	}
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    total++;
-	    cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if ((sign == 1) && (base != 0))
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = 0;
-		v->value.decimal.frac = 0;
-		v->value.decimal.total = total;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeNonPositiveIntegerDef) {
-	const xmlChar *cur = value;
-	unsigned long base = 0;
-	int total = 0;
-	int sign = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '-') {
-	    sign = 1;
-	    cur++;
-	}
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    total++;
-	    cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if ((sign != 1) && (base != 0))
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = 0;
-		v->value.decimal.frac = 0;
-		v->value.decimal.total = total;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeIntDef) {
-	const xmlChar *cur = value;
-	unsigned long base = 0;
-	int total = 0;
-	int sign = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '-') {
-	    sign = 1;
-	    cur++;
-	} else if (*cur == '+')
-	    cur++;
-	while (*cur == '0') {
-	    total++;
-	    cur++;
-	}
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    total++;
-	    cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if ((sign == 1) && (total == 0))
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_INT);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = sign;
-		v->value.decimal.frac = 0;
-		v->value.decimal.total = total;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeIntegerDef) {
-	const xmlChar *cur = value;
-	unsigned long base = 0;
-	int total = 0;
-	int sign = 0;
-	if (cur == NULL)
-	    return(1);
-	if (*cur == '-') {
-	    sign = 1;
-	    cur++;
-	} else if (*cur == '+')
-	    cur++;
-	while (*cur == '0') {
-	    total++;
-	    cur++;
-	}
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    base = base * 10 + (*cur - '0');
-	    total++;
-	    cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if ((sign == 1) && (total == 0))
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_INTEGER);
-	    if (v != NULL) {
-		v->value.decimal.base = base;
-		v->value.decimal.sign = sign;
-		v->value.decimal.frac = 0;
-		v->value.decimal.total = total;
-		*val = v;
-	    }
-	}
-	return(0);
-    } else if ((type == xmlSchemaTypeFloatDef) ||
-	       (type == xmlSchemaTypeDoubleDef)) {
-	const xmlChar *cur = value;
-	int neg = 0;
-	if (cur == NULL)
-	    return(1);
-	if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
-	    cur += 3;
-	    if (*cur != 0)
-		return(1);
-	    if (val != NULL) {
-		if (type == xmlSchemaTypeFloatDef) {
-		    v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
-		    if (v != NULL) {
-			v->value.f = (float) xmlXPathNAN;
-		    } else {
-			xmlSchemaFreeValue(v);
-			return(-1);
-		    }
-		} else {
-		    v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
-		    if (v != NULL) {
-			v->value.d = xmlXPathNAN;
-		    } else {
-			xmlSchemaFreeValue(v);
-			return(-1);
-		    }
-		}
-		*val = v;
-	    }
-	    return(0);
-	}
-	if (*cur == '+')
-	    cur++;
-	else if (*cur == '-') {
-	    neg = 1;
-	    cur++;
-	}
-	if (cur[0] == 0)
-	    return(1);
-	if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
-	    cur += 3;
-	    if (*cur != 0)
-		return(1);
-	    if (val != NULL) {
-		if (type == xmlSchemaTypeFloatDef) {
-		    v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
-		    if (v != NULL) {
-			if (neg)
-			    v->value.f = (float) xmlXPathNINF;
-			else
-			    v->value.f = (float) xmlXPathPINF;
-		    } else {
-			xmlSchemaFreeValue(v);
-			return(-1);
-		    }
-		} else {
-		    v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
-		    if (v != NULL) {
-			if (neg)
-			    v->value.d = xmlXPathNINF;
-			else
-			    v->value.d = xmlXPathPINF;
-		    } else {
-			xmlSchemaFreeValue(v);
-			return(-1);
-		    }
-		}
-		*val = v;
-	    }
-	    return(0);
-	}
-	while ((*cur >= '0') && (*cur <= '9')) {
-	    cur++;
-	}
-	if (*cur == '.') {
-	    cur++;
-	    while ((*cur >= '0') && (*cur <= '9')) 
-		cur++;
-	}
-	if ((*cur == 'e') || (*cur == 'E')) {
-	    cur++;
-	    if (*cur == '-')
-		cur++;
-	    while ((*cur >= '0') && (*cur <= '9')) 
-		cur++;
-	}
-	if (*cur != 0)
-	    return(1);
-	if (val != NULL) {
-	    if (type == xmlSchemaTypeFloatDef) {
-		v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
-		if (v != NULL) {
-		    if (sscanf((const char *)value, "%f", &(v->value.f))==1) {
-			*val = v;
-		    } else {
-			xmlGenericError(xmlGenericErrorContext,
-				"failed to scanf float %s\n", value);
-			xmlSchemaFreeValue(v);
-			return(1);
-		    }
-		} else {
-		    return(-1);
-		}
-	    } else {
-		v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
-		if (v != NULL) {
-		    if (sscanf((const char *)value, "%lf", &(v->value.d))==1) {
-			*val = v;
-		    } else {
-			xmlGenericError(xmlGenericErrorContext,
-				"failed to scanf double %s\n", value);
-			xmlSchemaFreeValue(v);
-			return(1);
-		    }
-		} else {
-		    return(-1);
-		}
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeNameDef) {
-	ret = xmlValidateName(value, 1);
-	if ((ret == 0) && (val != NULL)) {
-	    TODO;
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeQNameDef) {
-	ret = xmlValidateQName(value, 1);
-	if ((ret == 0) && (val != NULL)) {
-	    TODO;
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeNCNameDef) {
-	ret = xmlValidateNCName(value, 1);
-	if ((ret == 0) && (val != NULL)) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
-	    if (v != NULL) {
-		v->value.str = xmlStrdup(value);
-		*val = v;
-	    } else {
-		return(-1);
-	    }
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeAnyURIDef) {
-	xmlURIPtr uri;
-
-	uri = xmlParseURI((const char *) value);
-	if (uri == NULL)
-	    return(1);
-	if (val != NULL) {
-	    TODO;
-	}
-	xmlFreeURI(uri);
-	return(0);
-    } else if (type == xmlSchemaTypeBooleanDef) {
-	const xmlChar *cur = value;
-
-	if ((cur[0] == '0') && (cur[1] == 0))
-	    ret = 0;
-	else if ((cur[0] == '1') && (cur[1] == 0))
-	    ret = 1;
-	else if ((cur[0] == 't') && (cur[1] == 'r') && (cur[2] == 'u') &&
-	         (cur[3] == 'e') && (cur[4] == 0))
-	    ret = 1;
-	else if ((cur[0] == 'f') && (cur[1] == 'a') && (cur[2] == 'l') &&
-	         (cur[3] == 's') && (cur[4] == 'e') && (cur[5] == 0))
-	    ret = 0;
-	else 
-	    return(1);
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
-	    if (v != NULL) {
-		v->value.b = ret;
-		*val = v;
-	    } else {
-		return(-1);
-	    }
-	}
-	return(0);
-    } else if (type == xmlSchemaTypeIdrefDef) {
-	ret = xmlValidateNCName(value, 1);
-	if ((ret == 0) && (val != NULL)) {
-	    TODO;
-	}
-	if ((ret == 0) && (node != NULL) &&
-	    (node->type == XML_ATTRIBUTE_NODE)) {
-	    xmlAttrPtr attr = (xmlAttrPtr) node;
-	    xmlChar *strip;
-
-	    strip = xmlSchemaStrip(value);
-	    if (strip != NULL) {
-		xmlAddRef(NULL, node->doc, strip, attr);
-		xmlFree(strip);
-	    } else
-		xmlAddRef(NULL, node->doc, value, attr);
-	    attr->atype = XML_ATTRIBUTE_IDREF;
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeIdrefsDef) {
-	ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
-		                         value, val, node);
-	if (ret < 0)
-	    ret = 2;
-	else
-	    ret = 0;
-	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)) {
-	    TODO;
-	}
-	if ((ret == 0) && (node != NULL) &&
-	    (node->type == XML_ATTRIBUTE_NODE)) {
-	    xmlAttrPtr attr = (xmlAttrPtr) node;
-	    /*
-	     * NOTE: the IDness might have already be declared in the DTD
-	     */
-	    if (attr->atype != XML_ATTRIBUTE_ID) {
-		xmlIDPtr res;
-		xmlChar *strip;
-
-		strip = xmlSchemaStrip(value);
-		if (strip != NULL) {
-		    res = xmlAddID(NULL, node->doc, strip, attr);
-		    xmlFree(strip);
-		} else
-		    res = xmlAddID(NULL, node->doc, value, attr);
-		if (res == NULL) {
-		    ret = 2;
-		} else {
-		    attr->atype = XML_ATTRIBUTE_ID;
-		}
-	    }
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeEntitiesDef) {
-	if ((node == NULL) || (node->doc == NULL))
-	    return(3);
-	ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
-		                         value, val, node);
-	if (ret <= 0)
-	    ret = 1;
-	else
-	    ret = 0;
-	if ((ret == 0) && (node != NULL) &&
-	    (node->type == XML_ATTRIBUTE_NODE)) {
-	    xmlAttrPtr attr = (xmlAttrPtr) node;
-
-	    attr->atype = XML_ATTRIBUTE_ENTITIES;
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeEntityDef) {
-	xmlChar *strip;
-	ret = xmlValidateNCName(value, 1);
-	if ((node == NULL) || (node->doc == NULL))
-	    ret = 3;
-	if (ret == 0) {
-	    xmlEntityPtr ent;
-
-	    strip = xmlSchemaStrip(value);
-	    if (strip != NULL) {
-		ent = xmlGetDocEntity(node->doc, strip);
-		xmlFree(strip);
-	    } else {
-		ent = xmlGetDocEntity(node->doc, value);
-	    }
-	    if ((ent == NULL) ||
-		(ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
-		ret = 4;
-	}
-	if ((ret == 0) && (val != NULL)) {
-	    TODO;
-	}
-	if ((ret == 0) && (node != NULL) &&
-	    (node->type == XML_ATTRIBUTE_NODE)) {
-	    xmlAttrPtr attr = (xmlAttrPtr) node;
-
-	    attr->atype = XML_ATTRIBUTE_ENTITY;
-	}
-	return(ret);
-    } else if (type == xmlSchemaTypeLanguageDef) {
-	if (xmlCheckLanguageID(value) == 1) {
-	    if (val != NULL) {
-		v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
-		if (v != NULL) {
-		    v->value.str = xmlStrdup(value);
-		    *val = v;
-		} else {
-		    return(-1);
-		}
-	    }
-	    return(0);
-	}
-	return(1);
-    } else if (type == xmlSchemaTypeTokenDef) {
-	const xmlChar *cur = value;
-
-	if (IS_BLANK(*cur))
-	    return(1);
-
-	while (*cur != 0) {
-	    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
-		return(1);
-	    } else if (*cur == ' ') {
-		cur++;
-		if (*cur == 0)
-		    return(1);
-		if (*cur == ' ')
-		    return(1);
-	    } else {
-		cur++;
-	    }
-	}
-	if (val != NULL) {
-	    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
-	    if (v != NULL) {
-		v->value.str = xmlStrdup(value);
-		*val = v;
-	    } else {
-		return(-1);
-	    }
-	}
-	return(0);
-    }
-    TODO
-    return(0);
+    return(xmlSchemaValAtomicType(type, value, val, node, 0));
 }
 
 /**
@@ -2502,6 +2642,79 @@
 }
 
 /**
+ * xmlSchemaCompareFloats:
+ * @x:  a first float or double value
+ * @y:  a second float or double value
+ *
+ * Compare 2 values
+ *
+ * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
+ * case of error
+ */
+static int
+xmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
+    double d1, d2;
+
+    if ((x == NULL) || (y == NULL))
+	return(-2);
+
+    /*
+     * Cast everything to doubles.
+     */
+    if (x->type == XML_SCHEMAS_DOUBLE)
+	d1 = x->value.d;
+    else if (x->type == XML_SCHEMAS_FLOAT)
+	d1 = x->value.f;
+    else
+	return(-2);
+
+    if (y->type == XML_SCHEMAS_DOUBLE)
+	d2 = y->value.d;
+    else if (y->type == XML_SCHEMAS_FLOAT)
+	d2 = y->value.f;
+    else
+	return(-2);
+
+    /*
+     * Check for special cases.
+     */
+    if (xmlXPathIsNaN(d1)) {
+	if (xmlXPathIsNaN(d2))
+	    return(0);
+	return(1);
+    }
+    if (xmlXPathIsNaN(d2))
+	return(-1);
+    if (d1 == xmlXPathPINF) {
+	if (d2 == xmlXPathPINF)
+	    return(0);
+        return(1);
+    }
+    if (d2 == xmlXPathPINF)
+        return(-1);
+    if (d1 == xmlXPathNINF) {
+	if (d2 == xmlXPathNINF)
+	    return(0);
+        return(-1);
+    }
+    if (d2 == xmlXPathNINF)
+        return(1);
+
+    /*
+     * basic tests, the last one we should have equality, but
+     * portability is more important than speed and handling
+     * NaN or Inf in a portable way is always a challenge, so ...
+     */
+    if (d1 < d2)
+	return(-1);
+    if (d1 > d2)
+	return(1);
+    if (d1 == d2)
+	return(0);
+    return(2);
+}
+
+/**
  * xmlSchemaCompareValues:
  * @x:  a first value
  * @y:  a second value
@@ -2602,11 +2815,21 @@
 
         case XML_SCHEMAS_FLOAT:
         case XML_SCHEMAS_DOUBLE:
+            if ((y->type == XML_SCHEMAS_FLOAT) ||
+                (y->type == XML_SCHEMAS_DOUBLE))
+                return (xmlSchemaCompareFloats(x, y));
+            return (-2);
 	    TODO
 	    break;
         case XML_SCHEMAS_BOOLEAN:
-	    TODO
-	    break;
+            if (y->type == XML_SCHEMAS_BOOLEAN) {
+		if (x->value.b == y->value.b)
+		    return(0);
+		if (x->value.b == 0)
+		    return(-1);
+		return(1);
+	    }
+	    return (-2);
         case XML_SCHEMAS_STRING:
         case XML_SCHEMAS_IDREFS:
         case XML_SCHEMAS_ENTITIES:
@@ -2783,6 +3006,7 @@
 	    TODO
     }
     return(0);
+
 }
 
 #endif /* LIBXML_SCHEMAS_ENABLED */