more work on XML Schemas datatypes and facets support. Currently only

* relaxng.c xmlschemastypes.c: more work on XML Schemas datatypes
  and facets support. Currently only schemas with binHex or
  base64 don't compile. A few error left in the test suite:
  found 1035 test instances: 919 success 23 failures
  most are gdate or gdateyear failing check, and a few cases where
  James clark tests results are strange.
* valid.c: allow to reuse the Notation checking routine without
  having a validation context.
* SAX.c: removed a #if 0
Daniel
diff --git a/ChangeLog b/ChangeLog
index 91befc0..78e0f45 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Sun Mar 30 23:04:18 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+	* relaxng.c xmlschemastypes.c: more work on XML Schemas datatypes
+	  and facets support. Currently only schemas with binHex or
+	  base64 don't compile. A few error left in the test suite:
+	  found 1035 test instances: 919 success 23 failures
+	  most are gdate or gdateyear failing check, and a few cases where
+	  James clark tests results are strange.
+	* valid.c: allow to reuse the Notation checking routine without
+	  having a validation context.
+	* SAX.c: removed a #if 0
+
 Sat Mar 29 17:35:05 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* xinclude.c: forgot to apply one check from #106931 patch
diff --git a/SAX.c b/SAX.c
index 6e3cba1..1b3f1f5 100644
--- a/SAX.c
+++ b/SAX.c
@@ -661,18 +661,6 @@
 	    "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
             name, publicId, systemId, notationName);
 #endif
-#if 0
-    Done in xmlValidateDtdFinal now.
-    if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc) {
-	int ret;
-	ret = xmlValidateNotationUse(&ctxt->vctxt, ctxt->myDoc,
-	                                      notationName);
-	if (ret == 0) {
-	    ctxt->wellFormed = 0;
-	    ctxt->valid = 0;
-	}
-    }
-#endif
     if (ctxt->inSubset == 1) {
 	ent = xmlAddDocEntity(ctxt->myDoc, name,
 			XML_EXTERNAL_GENERAL_UNPARSED_ENTITY,
diff --git a/relaxng.c b/relaxng.c
index f28869b..568e6a7 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -445,7 +445,10 @@
  */
 typedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar *type,
 	                              const xmlChar *value1,
-				      const xmlChar *value2);
+				      xmlNodePtr ctxt1,
+				      void *comp1,
+				      const xmlChar *value2,
+				      xmlNodePtr ctxt2);
 typedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary;
 typedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr;
 struct _xmlRelaxNGTypeLibrary {
@@ -779,6 +782,14 @@
     if (define == NULL)
         return;
 
+    if ((define->type == XML_RELAXNG_VALUE) &&
+	(define->attrs != NULL)) {
+	xmlRelaxNGTypeLibraryPtr lib;
+
+	lib = (xmlRelaxNGTypeLibraryPtr) define->data;
+	if ((lib != NULL) && (lib->freef != NULL))
+	    lib->freef(lib->data, (void *) define->attrs);
+    }
     if ((define->data != NULL) &&
 	(define->type == XML_RELAXNG_INTERLEAVE))
 	xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data);
@@ -2336,9 +2347,12 @@
  */
 static int
 xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED,
-	                    const xmlChar *type ATTRIBUTE_UNUSED,
-	                    const xmlChar *value1 ATTRIBUTE_UNUSED,
-			    const xmlChar *value2 ATTRIBUTE_UNUSED) {
+	                    const xmlChar *type,
+	                    const xmlChar *value1,
+			    xmlNodePtr ctxt1,
+			    void *comp1,
+			    const xmlChar *value2,
+			    xmlNodePtr ctxt2) {
     int ret;
     xmlSchemaTypePtr typ;
     xmlSchemaValPtr res1 = NULL, res2 = NULL;
@@ -2349,12 +2363,16 @@
 	       BAD_CAST "http://www.w3.org/2001/XMLSchema");
     if (typ == NULL)
 	return(-1);
-    ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, NULL);
-    if (ret != 0)
-	return(-1);
-    if (res1 == NULL)
-	return(-1);
-    ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, NULL);
+    if (comp1 == NULL) {
+	ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
+	if (ret != 0)
+	    return(-1);
+	if (res1 == NULL)
+	    return(-1);
+    } else {
+	res1 = (xmlSchemaValPtr) comp1;
+    }
+    ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
     if (ret != 0) {
 	xmlSchemaFreeValue(res1);
 	return(-1);
@@ -2364,7 +2382,8 @@
 	return(-1);
     }
     ret = xmlSchemaCompareValues(res1, res2);
-    xmlSchemaFreeValue(res1);
+    if (res1 != (xmlSchemaValPtr) comp1)
+	xmlSchemaFreeValue(res1);
     xmlSchemaFreeValue(res2);
     if (ret == -2)
 	return(-1);
@@ -2437,9 +2456,12 @@
  */
 static int
 xmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED,
-	                     const xmlChar *type ATTRIBUTE_UNUSED,
-	                     const xmlChar *value1 ATTRIBUTE_UNUSED,
-			     const xmlChar *value2 ATTRIBUTE_UNUSED) {
+	                     const xmlChar *type,
+	                     const xmlChar *value1,
+			     xmlNodePtr ctxt1 ATTRIBUTE_UNUSED,
+			     void *comp1 ATTRIBUTE_UNUSED,
+			     const xmlChar *value2,
+			     xmlNodePtr ctxt2 ATTRIBUTE_UNUSED) {
     int ret = -1;
 
     if (xmlStrEqual(type, BAD_CAST "string")) {
@@ -2850,7 +2872,7 @@
     xmlRelaxNGTypeLibraryPtr lib;
     xmlChar *type;
     xmlChar *library;
-    int tmp;
+    int success = 0;
 
     def = xmlRelaxNGNewDefine(ctxt, node);
     if (def == NULL)
@@ -2892,8 +2914,8 @@
 			    library);
 		ctxt->nbErrors++;
 	    } else {
-		tmp = lib->have(lib->data, def->name);
-		if (tmp != 1) {
+		success = lib->have(lib->data, def->name);
+		if (success != 1) {
 		    if (ctxt->error != NULL)
 			ctxt->error(ctxt->userData,
 		    "Error type '%s' is not exported by type library '%s'\n",
@@ -2912,13 +2934,27 @@
 	    ctxt->error(ctxt->userData,
 		"Expecting a single text value for <value>content\n");
 	ctxt->nbErrors++;
-    } else {
+    } else if (def != NULL) {
 	def->value = xmlNodeGetContent(node);
 	if (def->value == NULL) {
 	    if (ctxt->error != NULL)
 		ctxt->error(ctxt->userData,
 			    "Element <value> has no content\n");
 	    ctxt->nbErrors++;
+	} else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) {
+	    void *val = NULL;
+
+	    success = lib->check(lib->data, def->name, def->value, &val, node);
+	    if (success != 1) {
+		if (ctxt->error != NULL)
+		    ctxt->error(ctxt->userData,
+			"Value '%s' is not acceptable for type '%s'\n",
+			        def->value, def->name);
+		ctxt->nbErrors++;
+	    } else {
+		if (val != NULL)
+		    def->attrs = val;
+	    }
 	}
     }
     /* TODO check ahead of time that the value is okay per the type */
@@ -5355,7 +5391,7 @@
 	    cur->parent = parent;
 	    if (cur->content != NULL)
 		xmlRelaxNGSimplify(ctxt, cur->content, cur);
-	    if (cur->attrs != NULL)
+	    if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL))
 		xmlRelaxNGSimplify(ctxt, cur->attrs, cur);
 	    if (cur->nameClass != NULL)
 		xmlRelaxNGSimplify(ctxt, cur->nameClass, cur);
@@ -7232,10 +7268,12 @@
 		    xmlRelaxNGTypeLibraryPtr lib;
 		    
 		    lib = (xmlRelaxNGTypeLibraryPtr) define->data;
-		    if ((lib != NULL) && (lib->comp != NULL))
-			ret = lib->comp(lib->data, define->name, value,
-				        define->value);
-		    else
+		    if ((lib != NULL) && (lib->comp != NULL)) {
+			ret = lib->comp(lib->data, define->name,
+				        define->value, define->node,
+					(void *) define->attrs,
+					value, ctxt->state->node);
+		    } else
 			ret = -1;
 		    if (ret < 0) {
 			VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, define->name);
diff --git a/valid.c b/valid.c
index ee2e678..84d63b1 100644
--- a/valid.c
+++ b/valid.c
@@ -2977,7 +2977,7 @@
     if ((notaDecl == NULL) && (doc->extSubset != NULL))
 	notaDecl = xmlGetDtdNotationDesc(doc->extSubset, notationName);
 
-    if (notaDecl == NULL) {
+    if ((notaDecl == NULL) && (ctxt != NULL)) {
 	VERROR(ctxt->userData, "NOTATION %s is not declared\n",
 	       notationName);
 	return(0);
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index c871479..ba96984 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -117,19 +117,29 @@
 typedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
 struct _xmlSchemaValDecimal {
     /* would use long long but not portable */
-    unsigned long base;
+    unsigned long lo;
+    unsigned long mi;
+    unsigned long hi;
     unsigned int extra;
     unsigned int sign:1;
     int frac:7;
     int total:8;
 };
 
+typedef struct _xmlSchemaValQName xmlSchemaValQName;
+typedef xmlSchemaValQName *xmlSchemaValQNamePtr;
+struct _xmlSchemaValQName {
+    xmlChar *name;
+    xmlChar *uri;
+};
+
 struct _xmlSchemaVal {
     xmlSchemaValType type;
     union {
 	xmlSchemaValDecimal     decimal;
         xmlSchemaValDate        date;
         xmlSchemaValDuration    dur;
+	xmlSchemaValQName	qname;
 	float			f;
 	double			d;
 	int			b;
@@ -188,6 +198,7 @@
 static xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
 
@@ -293,7 +304,7 @@
     xmlSchemaTypeUnsignedIntDef =
         xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT);;
     xmlSchemaTypeUnsignedShortDef =
-        xmlSchemaInitBasicType("insignedShort", XML_SCHEMAS_USHORT);;
+        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT);;
     xmlSchemaTypeUnsignedByteDef =
         xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE);;
     xmlSchemaTypePositiveIntegerDef =
@@ -314,6 +325,8 @@
                                                     XML_SCHEMAS_ENTITY);
     xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
                                                       XML_SCHEMAS_ENTITIES);
+    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
+                                                    XML_SCHEMAS_NOTATION);
     xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
                                                   XML_SCHEMAS_NAME);
     xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
@@ -379,7 +392,6 @@
         case XML_SCHEMAS_NMTOKEN:
         case XML_SCHEMAS_NMTOKENS:
         case XML_SCHEMAS_NAME:
-        case XML_SCHEMAS_QNAME:
         case XML_SCHEMAS_NCNAME:
         case XML_SCHEMAS_ID:
         case XML_SCHEMAS_IDREF:
@@ -391,6 +403,12 @@
 	    if (value->value.str != NULL)
 		xmlFree(value->value.str);
 	    break;
+        case XML_SCHEMAS_QNAME:
+	    if (value->value.qname.uri != NULL)
+		xmlFree(value->value.qname.uri);
+	    if (value->value.qname.name != NULL)
+		xmlFree(value->value.qname.name);
+	    break;
 	default:
 	    break;
     }
@@ -1241,6 +1259,56 @@
 }
 
 /**
+ * xmlSchemaParseUInt:
+ * @str: pointer to the string R/W
+ * @llo: pointer to the low result
+ * @lmi: pointer to the mid result
+ * @lhi: pointer to the high result
+ *
+ * Parse an unsigned long into 3 fields.
+ *
+ * Returns the number of chars parsed or -1 if overflow of the capacity
+ */
+static int
+xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
+	           unsigned long *lmi, unsigned long *lhi) {
+    unsigned long lo = 0, mi = 0, hi = 0;
+    const xmlChar *tmp, *cur = *str;
+    int ret = 0, i = 0;
+
+    while (*cur == '0') {
+	ret++;
+	cur++;
+    }
+    tmp = cur;
+    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
+	i++;tmp++;ret++;
+    }
+    if (i > 24) {
+	*str = tmp;
+	return(-1);
+    }
+    while (i > 16) {
+	hi = hi * 10 + (*cur++ - '0');
+	i--;
+    }
+    while (i > 8) {
+	mi = mi * 10 + (*cur++ - '0');
+	i--;
+    }
+    while (i > 0) {
+	lo = lo * 10 + (*cur++ - '0');
+	i--;
+    }
+
+    *str = cur;
+    *llo = lo;
+    *lmi = mi;
+    *lhi = hi;
+    return(ret);
+}
+
+/**
  * xmlSchemaValAtomicType:
  * @type: the predefined type
  * @value: the value to check
@@ -1319,7 +1387,7 @@
 	    if (val != NULL) {
 		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
 		if (v != NULL) {
-		    v->value.decimal.base = base;
+		    v->value.decimal.lo = base;
 		    v->value.decimal.sign = neg;
 		    v->value.decimal.frac = frac;
 		    v->value.decimal.total = frac + len;
@@ -1561,12 +1629,49 @@
 		TODO;
 	    }
 	    goto done;
-        case XML_SCHEMAS_QNAME:
+        case XML_SCHEMAS_QNAME: {
+	    xmlChar *uri = NULL;
+	    xmlChar *local = NULL;
+
 	    ret = xmlValidateQName(value, 1);
+	    if ((ret == 0) && (node != NULL)) {
+		xmlChar *prefix;
+		local = xmlSplitQName2(value, &prefix);
+		if (prefix != NULL) {
+		    xmlNsPtr ns;
+
+		    ns = xmlSearchNs(node->doc, node, prefix);
+		    if (ns == NULL)
+			ret = 1;
+		    else if (val != NULL)
+			uri = xmlStrdup(ns->href);
+		}
+		if ((local != NULL) && ((val == NULL) || (ret != 0)))
+		    xmlFree(local);
+		if (prefix != NULL)
+		    xmlFree(prefix);
+	    }
 	    if ((ret == 0) && (val != NULL)) {
-		TODO;
+		v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
+		if (v != NULL) {
+		    if (local != NULL)
+			v->value.qname.name = local;
+		    else
+			v->value.qname.name = xmlStrdup(value);
+		    if (uri != NULL)
+			v->value.qname.uri = uri;
+		    
+		    *val = v;
+		} else {
+		    if (local != NULL)
+			xmlFree(local);
+		    if (uri != NULL)
+			xmlFree(uri);
+		    goto error;
+		}
 	    }
 	    goto done;
+	}
         case XML_SCHEMAS_NCNAME:
 	    ret = xmlValidateNCName(value, 1);
 	    if ((ret == 0) && (val != NULL)) {
@@ -1687,9 +1792,58 @@
 		attr->atype = XML_ATTRIBUTE_ENTITIES;
 	    }
 	    goto done;
-        case XML_SCHEMAS_NOTATION:
-	    TODO;
-	    break;
+        case XML_SCHEMAS_NOTATION: {
+	    xmlChar *uri = NULL;
+	    xmlChar *local = NULL;
+
+	    ret = xmlValidateQName(value, 1);
+	    if ((ret == 0) && (node != NULL)) {
+		xmlChar *prefix;
+		local = xmlSplitQName2(value, &prefix);
+		if (prefix != NULL) {
+		    xmlNsPtr ns;
+
+		    ns = xmlSearchNs(node->doc, node, prefix);
+		    if (ns == NULL)
+			ret = 1;
+		    else if (val != NULL)
+			uri = xmlStrdup(ns->href);
+		}
+		if ((local != NULL) && ((val == NULL) || (ret != 0)))
+		    xmlFree(local);
+		if (prefix != NULL)
+		    xmlFree(prefix);
+	    }
+	    if ((node == NULL) || (node->doc == NULL))
+		ret = 3;
+	    if (ret == 0) {
+		ret = xmlValidateNotationUse(NULL, node->doc, value);
+		if (ret == 1)
+		    ret = 0;
+		else
+		    ret = 1;
+	    }
+	    if ((ret == 0) && (val != NULL)) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
+		if (v != NULL) {
+		    if (local != NULL)
+			v->value.qname.name = local;
+		    else
+			v->value.qname.name = xmlStrdup(value);
+		    if (uri != NULL)
+			v->value.qname.uri = uri;
+		    
+		    *val = v;
+		} else {
+		    if (local != NULL)
+			xmlFree(local);
+		    if (uri != NULL)
+			xmlFree(uri);
+		    goto error;
+		}
+	    }
+	    goto done;
+	}
         case XML_SCHEMAS_ANYURI: {
 	    xmlURIPtr uri;
 
@@ -1702,140 +1856,68 @@
 	    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_INTEGER:
+        case XML_SCHEMAS_PINTEGER:
+        case XML_SCHEMAS_NPINTEGER:
         case XML_SCHEMAS_NINTEGER:
-	    TODO;
-	    break;
         case XML_SCHEMAS_NNINTEGER: {
 	    const xmlChar *cur = value;
-	    unsigned long base = 0;
-	    int total = 0;
+	    unsigned long lo, mi, hi;
 	    int sign = 0;
 	    if (cur == NULL)
 		goto return1;
 	    if (*cur == '-') {
 		sign = 1;
 		cur++;
-	    }
-	    while ((*cur >= '0') && (*cur <= '9')) {
-		base = base * 10 + (*cur - '0');
-		total++;
+	    } else if (*cur == '+')
 		cur++;
-	    }
+	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
+	    if (ret == 0)
+	        goto return1;
 	    if (*cur != 0)
 		goto return1;
-	    if ((sign == 1) && (base != 0))
-		goto return1;
-	    if (val != NULL) {
-		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
+	    if (type->flags == XML_SCHEMAS_NPINTEGER) {
+		if ((sign == 0) &&
+		    ((hi != 0) || (mi != 0) || (lo != 0)))
+		    goto return1;
+	    } else if (type->flags == XML_SCHEMAS_PINTEGER) {
+		if (sign == 1)
+		    goto return1;
+		if ((hi == 0) && (mi == 0) && (lo == 0))
+		    goto return1;
+	    } else if (type->flags == XML_SCHEMAS_NINTEGER) {
+		if (sign == 0)
+		    goto return1;
+		if ((hi == 0) && (mi == 0) && (lo == 0))
+		    goto return1;
+	    } else if (type->flags == XML_SCHEMAS_NNINTEGER) {
+		if ((sign == 1) &&
+		    ((hi != 0) || (mi != 0) || (lo != 0)))
+		    goto return1;
+	    }
+	    /*
+	     * We can store a value only if no overflow occured
+	     */
+	    if ((ret > 0) && (val != NULL)) {
+		v = xmlSchemaNewValue(type->flags);
 		if (v != NULL) {
-		    v->value.decimal.base = base;
-		    v->value.decimal.sign = 0;
+		    v->value.decimal.lo = lo;
+		    v->value.decimal.mi = lo;
+		    v->value.decimal.hi = lo;
+		    v->value.decimal.sign = sign;
 		    v->value.decimal.frac = 0;
-		    v->value.decimal.total = total;
+		    v->value.decimal.total = cur - value;
 		    *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_LONG:
+        case XML_SCHEMAS_BYTE:
+        case XML_SCHEMAS_SHORT:
         case XML_SCHEMAS_INT: {
 	    const xmlChar *cur = value;
-	    unsigned long base = 0;
+	    unsigned long lo, mi, hi;
 	    int total = 0;
 	    int sign = 0;
 	    if (cur == NULL)
@@ -1845,23 +1927,56 @@
 		cur++;
 	    } else if (*cur == '+')
 		cur++;
-	    while (*cur == '0') {
-		total++;
-		cur++;
-	    }
-	    while ((*cur >= '0') && (*cur <= '9')) {
-		base = base * 10 + (*cur - '0');
-		total++;
-		cur++;
-	    }
+	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
+	    if (ret <= 0)
+	        goto return1;
 	    if (*cur != 0)
 		goto return1;
-	    if ((sign == 1) && (total == 0))
-		goto return1;
+	    if (type->flags == XML_SCHEMAS_LONG) {
+		if (hi >= 922) {
+		    if (hi > 922)
+			goto return1;
+		    if (mi >= 33720368) {
+			if (mi > 33720368)
+			    goto return1;
+		        if ((sign == 0) && (lo > 54775807))
+			    goto return1;
+		        if ((sign == 1) && (lo > 54775808))
+			    goto return1;
+		    }
+		}
+	    } else if (type->flags == XML_SCHEMAS_INT) {
+		if (hi != 0)
+		    goto return1;
+		if (mi >= 21) {
+		    if (mi > 21)
+			goto return1;
+		    if ((sign == 0) && (lo > 47483647))
+			goto return1;
+		    if ((sign == 1) && (lo > 47483648))
+			goto return1;
+		}
+	    } else if (type->flags == XML_SCHEMAS_SHORT) {
+		if ((mi != 0) || (hi != 0))
+		    goto return1;
+		if ((sign == 1) && (lo > 32768))
+		    goto return1;
+		if ((sign == 0) && (lo > 32767))
+		    goto return1;
+	    } else if (type->flags == XML_SCHEMAS_BYTE) {
+		if ((mi != 0) || (hi != 0))
+		    goto return1;
+		if ((sign == 1) && (lo > 128))
+		    goto return1;
+		if ((sign == 0) && (lo > 127))
+		    goto return1;
+	    }
 	    if (val != NULL) {
-		v = xmlSchemaNewValue(XML_SCHEMAS_INT);
+		v = xmlSchemaNewValue(type->flags);
 		if (v != NULL) {
-		    v->value.decimal.base = base;
+		    v->value.decimal.lo = lo;
+		    v->value.decimal.mi = lo;
+		    v->value.decimal.hi = lo;
 		    v->value.decimal.sign = sign;
 		    v->value.decimal.frac = 0;
 		    v->value.decimal.total = total;
@@ -1871,26 +1986,64 @@
 	    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;
+        case XML_SCHEMAS_UBYTE: {
+	    const xmlChar *cur = value;
+	    unsigned long lo, mi, hi;
+	    int total = 0;
+	    if (cur == NULL)
+		goto return1;
+	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
+	    if (ret <= 0)
+	        goto return1;
+	    if (*cur != 0)
+		goto return1;
+	    if (type->flags == XML_SCHEMAS_ULONG) {
+		if (hi >= 1844) {
+		    if (hi > 1844)
+			goto return1;
+		    if (mi >= 67440737) {
+			if (mi > 67440737)
+			    goto return1;
+			if (lo > 9551615)
+			    goto return1;
+		    }
+		}
+	    } else if (type->flags == XML_SCHEMAS_UINT) {
+		if (hi != 0)
+		    goto return1;
+		if (mi >= 42) {
+		    if (mi > 42)
+			goto return1;
+		    if (lo > 94967295)
+			goto return1;
+		}
+	    } else if (type->flags == XML_SCHEMAS_USHORT) {
+		if ((mi != 0) || (hi != 0))
+		    goto return1;
+		if (lo > 65535)
+		    goto return1;
+	    } else if (type->flags == XML_SCHEMAS_UBYTE) {
+		if ((mi != 0) || (hi != 0))
+		    goto return1;
+		if (lo > 255)
+		    goto return1;
+	    }
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(type->flags);
+		if (v != NULL) {
+		    v->value.decimal.lo = lo;
+		    v->value.decimal.mi = mi;
+		    v->value.decimal.hi = hi;
+		    v->value.decimal.sign = 0;
+		    v->value.decimal.frac = 0;
+		    v->value.decimal.total = total;
+		    *val = v;
+		}
+	    }
+	    goto return0;
+	}
     }
 
 done:
@@ -1960,21 +2113,38 @@
 xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
 {
     xmlSchemaValPtr swp;
-    int order = 1;
+    int order = 1, p;
     unsigned long tmp;
 
-    if ((x->value.decimal.sign) && (x->value.decimal.base != 0)) {
-	if ((y->value.decimal.sign) && (y->value.decimal.base != 0))
+    if ((x->value.decimal.sign) && 
+	((x->value.decimal.lo != 0) ||
+	 (x->value.decimal.mi != 0) ||
+	 (x->value.decimal.hi != 0))) {
+	if ((y->value.decimal.sign) &&
+	    ((y->value.decimal.lo != 0) ||
+	     (y->value.decimal.mi != 0) ||
+	     (y->value.decimal.hi != 0)))
 	    order = -1;
 	else
 	    return (-1);
-    } else if ((y->value.decimal.sign) && (y->value.decimal.base != 0)) {
+    } else if ((y->value.decimal.sign) &&
+	       ((y->value.decimal.lo != 0) ||
+		(y->value.decimal.mi != 0) ||
+		(y->value.decimal.hi != 0))) {
         return (1);
     }
     if (x->value.decimal.frac == y->value.decimal.frac) {
-        if (x->value.decimal.base < y->value.decimal.base)
+	if (x->value.decimal.hi < y->value.decimal.hi)
+	    return (-order);
+	if (x->value.decimal.hi < y->value.decimal.hi)
+	    return (order);
+	if (x->value.decimal.mi < y->value.decimal.mi)
+	    return (-order);
+	if (x->value.decimal.mi < y->value.decimal.mi)
+	    return (order);
+        if (x->value.decimal.lo < y->value.decimal.lo)
             return (-order);
-        if (x->value.decimal.base > y->value.decimal.base)
+        if (x->value.decimal.lo > y->value.decimal.lo)
 	    return(order);
 	return(0);
     }
@@ -1984,19 +2154,16 @@
         x = swp;
         order = -order;
     }
-    tmp =
-        x->value.decimal.base / powten[x->value.decimal.frac -
-                                       y->value.decimal.frac];
-    if (tmp > y->value.decimal.base)
+    p = powten[x->value.decimal.frac - y->value.decimal.frac];
+    tmp = x->value.decimal.lo / p;
+    if (tmp > y->value.decimal.lo)
         return (order);
-    if (tmp < y->value.decimal.base)
+    if (tmp < y->value.decimal.lo)
         return (-order);
-    tmp =
-        y->value.decimal.base * powten[x->value.decimal.frac -
-                                       y->value.decimal.frac];
-    if (x->value.decimal.base < tmp)
+    tmp = y->value.decimal.lo * p;
+    if (x->value.decimal.lo < tmp)
         return (-order);
-    if (x->value.decimal.base == tmp)
+    if (x->value.decimal.lo == tmp)
         return (0);
     return (order);
 }
@@ -2791,7 +2958,6 @@
         case XML_SCHEMAS_LANGUAGE:
         case XML_SCHEMAS_NMTOKEN:
         case XML_SCHEMAS_NAME:
-        case XML_SCHEMAS_QNAME:
         case XML_SCHEMAS_NCNAME:
         case XML_SCHEMAS_ID:
         case XML_SCHEMAS_IDREF:
@@ -2812,7 +2978,14 @@
                 (y->type == XML_SCHEMAS_ANYURI))
                 return (xmlSchemaCompareNormStrings(x, y));
             return (-2);
-
+        case XML_SCHEMAS_QNAME:
+            if (y->type == XML_SCHEMAS_QNAME) {
+		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
+		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
+		    return(0);
+		return(2);
+	    }
+	    return (-2);
         case XML_SCHEMAS_FLOAT:
         case XML_SCHEMAS_DOUBLE:
             if ((y->type == XML_SCHEMAS_FLOAT) ||
@@ -2969,7 +3142,8 @@
 	    unsigned int len = 0;
 
 	    if ((facet->val == NULL) ||
-		(facet->val->type != XML_SCHEMAS_DECIMAL) ||
+		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
+		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
 		(facet->val->value.decimal.frac != 0)) {
 		return(-1);
 	    }
@@ -2991,13 +3165,13 @@
 		    TODO
 	    }
 	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
-		if (len != facet->val->value.decimal.base)
+		if (len != facet->val->value.decimal.lo)
 		    return(1);
 	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
-		if (len < facet->val->value.decimal.base)
+		if (len < facet->val->value.decimal.lo)
 		    return(1);
 	    } else {
-		if (len > facet->val->value.decimal.base)
+		if (len > facet->val->value.decimal.lo)
 		    return(1);
 	    }
 	    break;