preparing release 1.5.8 changed some preprocessor block applied patch from

* configure.in doc/*: preparing release 1.5.8
* nanohttp.c: changed some preprocessor block
* xmlschemastypes.c: applied patch from Charles Bozeman adding
  hexBinary schema datatype and adding support for totalDigits and
  fractionDigits facets.
Daniel
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 44ecab9..006dd90 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -82,7 +82,8 @@
     XML_SCHEMAS_SHORT,
     XML_SCHEMAS_USHORT,
     XML_SCHEMAS_BYTE,
-    XML_SCHEMAS_UBYTE
+    XML_SCHEMAS_UBYTE,
+    XML_SCHEMAS_HEXBINARY
 } xmlSchemaValType;
 
 static unsigned long powten[10] = {
@@ -169,6 +170,7 @@
 static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
 static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
 
 /*
@@ -278,6 +280,8 @@
                                                      XML_SCHEMAS_BOOLEAN);
     xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
                                                     XML_SCHEMAS_ANYURI);
+    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
+                                                     XML_SCHEMAS_HEXBINARY);
 
     /*
      * derived datatypes
@@ -1914,6 +1918,67 @@
 	    xmlFreeURI(uri);
 	    goto return0;
 	}
+        case XML_SCHEMAS_HEXBINARY: {
+	    const xmlChar *tmp, *cur = value;
+            int total, i = 0;
+            unsigned long lo = 0, mi = 0, hi = 0;
+	    unsigned long *base;
+
+            tmp = cur;
+            while (((*tmp >= '0') && (*tmp <= '9')) ||
+                   ((*tmp >= 'A') && (*tmp <= 'F')) ||
+                   ((*tmp >= 'a') && (*tmp <= 'f'))) {
+	        i++;tmp++;
+            }
+
+	    if (*tmp != 0)
+		goto return1;
+            if (i > 24)
+		goto return1;
+            if ((i % 2) != 0)
+		goto return1;
+
+            total = i / 2;		/* number of octets */
+
+	    if (i >= 16)
+	        base = &hi;
+	    else if (i >= 8)
+	        base = &mi;
+	    else
+	        base = &lo;
+
+            while (i > 0) {
+                if ((*cur >= '0') && (*cur <= '9')) {
+                    *base = *base * 16 + (*cur - '0');
+                } else if ((*cur >= 'A') && (*cur <= 'F')) {
+                    *base = *base * 16 + (*cur - 'A') + 10;
+                } else if ((*cur >= 'a') && (*cur <= 'f')) {
+                    *base = *base * 16 + (*cur - 'a') + 10;
+                } else
+            	    break;
+
+                cur++;
+                i--;
+		if (i == 16)
+		    base = &mi;
+		else if (i == 8)
+		    base = &lo;
+            }
+
+	    if (val != NULL) {
+		v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
+		if (v != NULL) {
+		    v->value.decimal.lo = lo;
+		    v->value.decimal.mi = mi;
+		    v->value.decimal.hi = hi;
+		    v->value.decimal.total = total;
+		    *val = v;
+		} else {
+		    goto error;
+		}
+	    }
+	    goto return0;
+        }
         case XML_SCHEMAS_INTEGER:
         case XML_SCHEMAS_PINTEGER:
         case XML_SCHEMAS_NPINTEGER:
@@ -3061,6 +3126,10 @@
 		return(1);
 	    }
 	    return (-2);
+        case XML_SCHEMAS_HEXBINARY:
+            if (y->type == XML_SCHEMAS_HEXBINARY)
+                return (xmlSchemaCompareDecimals(x, y));
+            return (-2);
         case XML_SCHEMAS_STRING:
         case XML_SCHEMAS_IDREFS:
         case XML_SCHEMAS_ENTITIES:
@@ -3205,22 +3274,26 @@
 		(facet->val->value.decimal.frac != 0)) {
 		return(-1);
 	    }
-	    switch (base->flags) {
-		case XML_SCHEMAS_IDREF:
-		case XML_SCHEMAS_NORMSTRING:
-		case XML_SCHEMAS_TOKEN:
-		case XML_SCHEMAS_LANGUAGE:
-		case XML_SCHEMAS_NMTOKEN:
-		case XML_SCHEMAS_NAME:
-		case XML_SCHEMAS_NCNAME:
-		case XML_SCHEMAS_ID:
-		    len = xmlSchemaNormLen(value);
-		    break;
-		case XML_SCHEMAS_STRING:
-		    len = xmlUTF8Strlen(value);
-		    break;
-		default:
-		    TODO
+	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
+	        len = val->value.decimal.total;
+	    else { 
+	        switch (base->flags) {
+	    	    case XML_SCHEMAS_IDREF:
+		    case XML_SCHEMAS_NORMSTRING:
+		    case XML_SCHEMAS_TOKEN:
+		    case XML_SCHEMAS_LANGUAGE:
+		    case XML_SCHEMAS_NMTOKEN:
+		    case XML_SCHEMAS_NAME:
+		    case XML_SCHEMAS_NCNAME:
+		    case XML_SCHEMAS_ID:
+		        len = xmlSchemaNormLen(value);
+		        break;
+		    case XML_SCHEMAS_STRING:
+		        len = xmlUTF8Strlen(value);
+		        break;
+		    default:
+		        TODO
+	        }
 	    }
 	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
 		if (len != facet->val->value.decimal.lo)
@@ -3234,6 +3307,41 @@
 	    }
 	    break;
 	}
+	case XML_SCHEMA_FACET_TOTALDIGITS:
+	case XML_SCHEMA_FACET_FRACTIONDIGITS:
+
+	    if ((facet->val == NULL) ||
+		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
+		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
+		(facet->val->value.decimal.frac != 0)) {
+		return(-1);
+	    }
+	    if ((val == NULL) ||
+		((val->type != XML_SCHEMAS_DECIMAL) &&
+		 (val->type != XML_SCHEMAS_INTEGER) &&
+		 (val->type != XML_SCHEMAS_NPINTEGER) &&
+		 (val->type != XML_SCHEMAS_NINTEGER) &&
+		 (val->type != XML_SCHEMAS_NNINTEGER) &&
+		 (val->type != XML_SCHEMAS_PINTEGER) &&
+		 (val->type != XML_SCHEMAS_INT) &&
+		 (val->type != XML_SCHEMAS_UINT) &&
+		 (val->type != XML_SCHEMAS_LONG) &&
+		 (val->type != XML_SCHEMAS_ULONG) &&
+		 (val->type != XML_SCHEMAS_SHORT) &&
+		 (val->type != XML_SCHEMAS_USHORT) &&
+		 (val->type != XML_SCHEMAS_BYTE) &&
+		 (val->type != XML_SCHEMAS_UBYTE))) {
+		return(-1);
+	    }
+	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
+	        if (val->value.decimal.total > facet->val->value.decimal.lo)
+	            return(1);
+
+	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
+	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
+		    return(1);
+	    }
+	    break;
 	default:
 	    TODO
     }