update from Charles Bozeman for date and duration types updated too Daniel

* xmlschemas.c xmlschemastypes.c include/libxml/xmlschemas.h:
  update from Charles Bozeman for date and duration types
* test/schemas/date_0.* test/schemas/dur_0.*
  result/schemas/date_0.* result/schemas/dur_0.*: updated too
Daniel
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 4a659a3..29b069b 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -903,19 +903,42 @@
 	if (ret != 0)
 	    goto error;
 
-	if (*cur != '-') {
-	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
-	    goto error;
-	}
-	if (type == XML_SCHEMAS_GMONTH)
-	    goto error;
-	/* it should be an xs:gMonthDay */
-	cur++;
-	ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
-	if (ret != 0)
-	    goto error;
+        /*
+         * a '-' char could indicate this type is xs:gMonthDay or
+         * a negative time zone offset. Check for xs:gMonthDay first.
+         * Also the first three char's of a negative tzo (-MM:SS) can
+         * appear to be a valid day; so even if the day portion
+         * of the xs:gMonthDay verifies, we must insure it was not
+         * a tzo.
+         */
+        if (*cur == '-') {
+            const xmlChar *rewnd = cur;
+            cur++;
 
-	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
+  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
+            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
+
+                /*
+                 * we can use the VALID_MDAY macro to validate the month
+                 * and day because the leap year test will flag year zero
+                 * as a leap year (even though zero is an invalid year).
+                 */
+                if (VALID_MDAY((&(dt->value.date)))) {
+
+	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
+
+                    goto error;
+                }
+            }
+
+            /*
+             * not xs:gMonthDay so rewind and check if just xs:gMonth
+             * with an optional time zone.
+             */
+            cur = rewnd;
+        }
+
+	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
 
 	goto error;
     }
@@ -981,9 +1004,37 @@
     dt->type = XML_SCHEMAS_DATETIME;
 
 done:
-#if 0
-    if ((type != XML_SCHEMAS_UNKNOWN) && (type != XML_SCHEMAS_DATETIME))
-	goto error;
+#if 1
+    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
+        goto error;
+#else
+    /*
+     * insure the parsed type is equal to or less significant (right
+     * truncated) than the desired type.
+     */
+    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
+
+        /* time only matches time */
+        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
+            goto error;
+
+        if ((type == XML_SCHEMAS_DATETIME) &&
+            ((dt->type != XML_SCHEMAS_DATE) ||
+             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
+             (dt->type != XML_SCHEMAS_GYEAR)))
+            goto error;
+
+        if ((type == XML_SCHEMAS_DATE) &&
+            ((dt->type != XML_SCHEMAS_GYEAR) ||
+             (dt->type != XML_SCHEMAS_GYEARMONTH)))
+            goto error;
+
+        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
+            goto error;
+
+        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
+            goto error;
+    }
 #endif
 
     if (val != NULL)
@@ -1018,6 +1069,10 @@
     xmlSchemaValPtr dur;
     int isneg = 0;
     unsigned int seq = 0;
+    double         num;
+    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
+    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
+    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
 
     if (duration == NULL)
 	return -1;
@@ -1039,10 +1094,6 @@
 	return -1;
 
     while (*cur != 0) {
-        double         num;
-        int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
-        const xmlChar  desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'};
-        const double   multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
 
         /* input string should be empty or invalid date/time item */
         if (seq >= sizeof(desig))
@@ -1328,7 +1379,7 @@
 	               xmlSchemaValPtr *val, xmlNodePtr node, int flags) {
     xmlSchemaValPtr v;
     xmlChar *norm = NULL;
-    int ret;
+    int ret = 0;
 
     if (xmlSchemaTypesInitialized == 0)
 	return(-1);