applied patch from Kasimier to fix some Relax-NG datatype facet problem
* xmlschemas.c: applied patch from Kasimier to fix some Relax-NG
datatype facet problem with recent changes.
Daniel
diff --git a/xmlschemas.c b/xmlschemas.c
index 1429f51..59cfee0 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -8373,40 +8373,61 @@
case XML_SCHEMA_FACET_MININCLUSIVE:
case XML_SCHEMA_FACET_MINEXCLUSIVE:
case XML_SCHEMA_FACET_MAXINCLUSIVE:
- case XML_SCHEMA_FACET_MAXEXCLUSIVE:{
+ case XML_SCHEMA_FACET_MAXEXCLUSIVE:
+ case XML_SCHEMA_FACET_ENUMERATION: {
/*
* Okay we need to validate the value
* at that point.
*/
xmlSchemaValidCtxtPtr vctxt;
xmlSchemaTypePtr base;
-
+
+ /* 4.3.5.5 Constraints on enumeration Schema Components
+ * Schema Component Constraint: enumeration valid restriction
+ * It is an ·error· if any member of {value} is not in the
+ * ·value space· of {base type definition}.
+ *
+ * minInclusive, maxInclusive, minExclusive, maxExclusive:
+ * The value ·must· be in the
+ * ·value space· of the ·base type·.
+ */
+ /*
+ * This function is intended to deliver a compiled value
+ * on the facet. In XML Schemas the type holding a facet,
+ * cannot be a built-in type. Thus to ensure that other API
+ * calls (relaxng) do work, if the given type is a built-in
+ * type, we will assume that the given built-in type *is
+ * already* the base type.
+ */
+ if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
+ base = typeDecl->baseType;
+ if (base == NULL) {
+ xmlSchemaPErr(ctxt, typeDecl->node,
+ XML_SCHEMAS_ERR_INTERNAL,
+ "Internal error: xmlSchemaCheckFacet, "
+ "the type \"%s\" has no base type.\n",
+ typeDecl->name, NULL);
+ return (-1);
+ }
+ } else
+ base = typeDecl;
/*
* TODO: Try to avoid creating a new context.
*/
vctxt = xmlSchemaNewValidCtxt(NULL);
- if (vctxt == NULL)
- break;
- /* xmlSchemaValidateSimpleValue(vctxt, typeDecl,
- facet->value);
- */
- /* The value ·must· be in the
- * ·value space· of the ·base type·.
- */
- base = typeDecl->baseType;
- if (base == NULL) {
+ if (vctxt == NULL) {
xmlSchemaPErr(ctxt, typeDecl->node,
XML_SCHEMAS_ERR_INTERNAL,
"Internal error: xmlSchemaCheckFacet, "
- "the type \"%s\" has no base type.\n",
+ "creating a new validation context.\n",
typeDecl->name, NULL);
- return (-1);
+ return (-1);
}
vctxt->type = base;
- xmlSchemaValidateSimpleTypeValue(vctxt, facet->value, 0, 1);
- facet->val = vctxt->value;
- vctxt->value = NULL;
- if (facet->val == NULL) {
+ ret = xmlSchemaValidateSimpleTypeValue(vctxt, facet->value, 0, 1);
+ facet->val = vctxt->value;
+ vctxt->value = NULL;
+ if (ret > 0) {
/* error code */
if (ctxt != NULL) {
xmlSchemaPErrExt(ctxt, facet->node,
@@ -8419,24 +8440,38 @@
NULL, NULL);
}
ret = -1;
- }
- xmlSchemaFreeValidCtxt(vctxt);
+ } else if (ret < 0) {
+ xmlSchemaPErrExt(ctxt, facet->node,
+ XML_SCHEMAS_ERR_INTERNAL,
+ NULL, NULL, NULL,
+ "Internal error: xmlSchemaCheckFacet, "
+ "failed to validate the value \"%s\" name of the "
+ "facet \"%s\" against the base type \"%s\".\n",
+ facet->value,
+ BAD_CAST xmlSchemaFacetTypeToString(facet->type),
+ base->name, NULL, NULL);
+ ret = -1;
+ }
+ xmlSchemaFreeValidCtxt(vctxt);
break;
}
+ /*
+ * Removed, since added to the case above.
+ *
case XML_SCHEMA_FACET_ENUMERATION:{
- /*
+ *
* Okay we need to validate the value
* at that point.
- */
+ *
xmlSchemaValidCtxtPtr vctxt;
int tmp;
xmlSchemaTypePtr base;
- /* 4.3.5.5 Constraints on enumeration Schema Components
+ * 4.3.5.5 Constraints on enumeration Schema Components
* Schema Component Constraint: enumeration valid restriction
* It is an ·error· if any member of {value} is not in the
* ·value space· of {base type definition}.
- */
+ *
vctxt = xmlSchemaNewValidCtxt(NULL);
if (vctxt == NULL)
break;
@@ -8451,9 +8486,9 @@
}
vctxt->type = base;
tmp = xmlSchemaValidateSimpleTypeValue(vctxt, facet->value, 0, 1);
- /* tmp = xmlSchemaValidateSimpleValue(vctxt, typeDecl,
+ * tmp = xmlSchemaValidateSimpleValue(vctxt, typeDecl,
facet->value);
- */
+ *
if (tmp != 0) {
if (ctxt != NULL) {
xmlSchemaPErr(ctxt, facet->node,
@@ -8467,6 +8502,7 @@
xmlSchemaFreeValidCtxt(vctxt);
break;
}
+ */
case XML_SCHEMA_FACET_PATTERN:
facet->regexp = xmlRegexpCompile(facet->value);
if (facet->regexp == NULL) {