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/xmlschemas.c b/xmlschemas.c
index 6c9e2f4..55cdef5 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -4167,6 +4167,101 @@
ctxt->userData = ctx;
}
+/**
+ * xmlSchemaFacetTypeToString:
+ * @type: the facet type
+ *
+ * Convert the xmlSchemaTypeType to a char string.
+ *
+ * Returns the char string representation of the facet type if the
+ * type is a facet and an "Internal Error" string otherwise.
+ */
+static const char *
+xmlSchemaFacetTypeToString(xmlSchemaTypeType type)
+{
+ switch (type) {
+ case XML_SCHEMA_FACET_PATTERN:
+ return ("pattern");
+ case XML_SCHEMA_FACET_MAXEXCLUSIVE:
+ return ("maxExclusive");
+ case XML_SCHEMA_FACET_MAXINCLUSIVE:
+ return ("maxInclusive");
+ case XML_SCHEMA_FACET_MINEXCLUSIVE:
+ return ("minExclusive");
+ case XML_SCHEMA_FACET_MININCLUSIVE:
+ return ("minInclusive");
+ case XML_SCHEMA_FACET_WHITESPACE:
+ return ("whiteSpace");
+ case XML_SCHEMA_FACET_ENUMERATION:
+ return ("enumeration");
+ case XML_SCHEMA_FACET_LENGTH:
+ return ("length");
+ case XML_SCHEMA_FACET_MAXLENGTH:
+ return ("maxLength");
+ case XML_SCHEMA_FACET_MINLENGTH:
+ return ("minLength");
+ case XML_SCHEMA_FACET_TOTALDIGITS:
+ return ("totalDigits");
+ case XML_SCHEMA_FACET_FRACTIONDIGITS:
+ return ("fractionDigits");
+ default:
+ break;
+ }
+ return ("Internal Error");
+}
+
+/**
+ * xmlSchemaValidateFacets:
+ * @ctxt: a schema validation context
+ * @base: the base type
+ * @facets: the list of facets to check
+ * @value: the lexical repr of the value to validate
+ * @val: the precomputed value
+ *
+ * Check a value against all facet conditions
+ *
+ * Returns 0 if the element is schemas valid, a positive error code
+ * number otherwise and -1 in case of internal or API error.
+ */
+static int
+xmlSchemaValidateFacets(xmlSchemaValidCtxtPtr ctxt,
+ xmlSchemaTypePtr base,
+ xmlSchemaFacetPtr facets,
+ xmlChar *value) {
+ int ret = 0;
+ int tmp = 0;
+ xmlSchemaTypeType type;
+ xmlSchemaFacetPtr facet = facets;
+
+ while (facet != NULL) {
+ type = facet->type;
+ if (type == XML_SCHEMA_FACET_ENUMERATION) {
+ tmp = 1;
+
+ while (facet != NULL) {
+ tmp = xmlSchemaValidateFacet(base, facet, value, ctxt->value);
+ if (tmp == 0) {
+ return 0;
+ }
+ facet = facet->next;
+ }
+ } else
+ tmp = xmlSchemaValidateFacet(base, facet, value, ctxt->value);
+
+ if (tmp != 0) {
+ ret = tmp;
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Failed to validate type with facet %s\n",
+ xmlSchemaFacetTypeToString(type));
+ ctxt->err = XML_SCHEMAS_ERR_FACET;
+ }
+ if (facet != NULL)
+ facet = facet->next;
+ }
+ return (ret);
+}
+
/************************************************************************
* *
* Simple type validation *
@@ -4203,10 +4298,15 @@
ctxt->value = NULL;
}
ret = xmlSchemaValidatePredefinedType(type, value, &(ctxt->value));
+ if (ret != 0) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Failed to validate basic type %s\n", type->name);
+ ctxt->err = XML_SCHEMAS_ERR_VALUE;
+ }
} else if (type->type == XML_SCHEMA_TYPE_RESTRICTION) {
xmlSchemaTypePtr base;
xmlSchemaFacetPtr facet;
- int tmp;
base = type->baseType;
if (base != NULL) {
@@ -4220,29 +4320,7 @@
if (ctxt->schema != NULL) {
if (ret == 0) {
facet = type->facets;
- if ((type->type == XML_SCHEMA_TYPE_RESTRICTION) &&
- (facet != NULL) &&
- (facet->type == XML_SCHEMA_FACET_ENUMERATION)) {
- while (facet != NULL) {
- ret = 1;
-
- tmp = xmlSchemaValidateFacet(base, facet, value,
- ctxt->value);
- if (tmp == 0) {
- ret = 0;
- break;
- }
- facet = facet->next;
- }
- } else {
- while (facet != NULL) {
- tmp = xmlSchemaValidateFacet(base, facet, value,
- ctxt->value);
- if (tmp != 0)
- ret = tmp;
- facet = facet->next;
- }
- }
+ ret = xmlSchemaValidateFacets(ctxt, base, facet, value);
}
}
} else if (type->type == XML_SCHEMA_TYPE_SIMPLE) {
@@ -4391,7 +4469,7 @@
xmlNodePtr child;
xmlSchemaTypePtr type, base;
xmlChar *value;
- int ret = 0, tmp;
+ int ret = 0;
child = ctxt->node;
type = ctxt->type;
@@ -4413,13 +4491,7 @@
}
if (ret == 0) {
facet = type->facets;
- while (facet != NULL) {
- tmp = xmlSchemaValidateFacet(base, facet, value,
- ctxt->value);
- if (tmp != 0)
- ret = tmp;
- facet = facet->next;
- }
+ ret = xmlSchemaValidateFacets(ctxt, base, facet, value);
}
break;
}
@@ -4853,9 +4925,10 @@
if (value != NULL)
xmlFree(value);
if (ret != 0) {
- ctxt->error(ctxt->userData,
- "Element %s: failed to validate basic type %s\n",
- node->name, type->name);
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Element %s: failed to validate basic type %s\n",
+ node->name, type->name);
ctxt->err = XML_SCHEMAS_ERR_VALUE;
}
return(ret);