added --schema option to run WXS schema validation tried to improve error
* xmllint.c: added --schema option to run WXS schema validation
* xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h:
tried to improve error reporting in the Schema code, some cleanup
too.
Daniel
diff --git a/ChangeLog b/ChangeLog
index 3489ded..8012ecb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon May 12 11:23:27 EDT 2003 Daniel Veillard <daniel@veillard.com>
+
+ * xmllint.c: added --schema option to run WXS schema validation
+ * xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h:
+ tried to improve error reporting in the Schema code, some cleanup
+ too.
+
Sun May 11 16:13:20 EDT 2003 Daniel Veillard <daniel@veillard.com>
* xmlschemas.c: fixed some problems in the handling of errors,
diff --git a/include/libxml/schemasInternals.h b/include/libxml/schemasInternals.h
index fb1f7ee..54e8fb3 100644
--- a/include/libxml/schemasInternals.h
+++ b/include/libxml/schemasInternals.h
@@ -116,6 +116,7 @@
int occurs;
xmlChar *defValue;
xmlSchemaTypePtr subtypes;
+ xmlNodePtr node;
};
/**
@@ -136,6 +137,7 @@
xmlSchemaAnnotPtr annot;
xmlSchemaAttributePtr attributes;
+ xmlNodePtr node;
};
diff --git a/result/schemas/attr0_0_0.err b/result/schemas/attr0_0_0.err
index d4a3b55..e69de29 100644
--- a/result/schemas/attr0_0_0.err
+++ b/result/schemas/attr0_0_0.err
@@ -1 +0,0 @@
-Unimplemented block at xmlschemastypes.c:1742
diff --git a/xmllint.c b/xmllint.c
index 46b0373..9fedb4f 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -86,6 +86,7 @@
#include <libxml/xmlreader.h>
#ifdef LIBXML_SCHEMAS_ENABLED
#include <libxml/relaxng.h>
+#include <libxml/xmlschemas.h>
#endif
#ifndef XML_XML_DEFAULT_CATALOG
@@ -108,6 +109,8 @@
#ifdef LIBXML_SCHEMAS_ENABLED
static char * relaxng = NULL;
static xmlRelaxNGPtr relaxngschemas = NULL;
+static char * schema = NULL;
+static xmlSchemaPtr wxschemas = NULL;
#endif
static int repeat = 0;
static int insert = 0;
@@ -1139,6 +1142,32 @@
if ((timing) && (!repeat)) {
endTimer("Validating");
}
+ } else if (wxschemas != NULL) {
+ xmlSchemaValidCtxtPtr ctxt;
+ int ret;
+
+ if ((timing) && (!repeat)) {
+ startTimer();
+ }
+
+ ctxt = xmlSchemaNewValidCtxt(wxschemas);
+ xmlSchemaSetValidErrors(ctxt,
+ (xmlSchemaValidityErrorFunc) fprintf,
+ (xmlSchemaValidityWarningFunc) fprintf,
+ stderr);
+ ret = xmlSchemaValidateDoc(ctxt, doc);
+ if (ret == 0) {
+ printf("%s validates\n", filename);
+ } else if (ret > 0) {
+ printf("%s fails to validate\n", filename);
+ } else {
+ printf("%s validation generated an internal error\n",
+ filename);
+ }
+ xmlSchemaFreeValidCtxt(ctxt);
+ if ((timing) && (!repeat)) {
+ endTimer("Validating");
+ }
#endif
}
@@ -1275,6 +1304,7 @@
printf("\t--chkregister : verify the node registration code\n");
#ifdef LIBXML_SCHEMAS_ENABLED
printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
+ printf("\t--schema schema : do validation against the WXS schema\n");
#endif
printf("\nLibxml project home page: http://xmlsoft.org/\n");
printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
@@ -1477,6 +1507,11 @@
i++;
relaxng = argv[i];
noent++;
+ } else if ((!strcmp(argv[i], "-schema")) ||
+ (!strcmp(argv[i], "--schema"))) {
+ i++;
+ schema = argv[i];
+ noent++;
#endif
} else {
fprintf(stderr, "Unknown option %s\n", argv[i]);
@@ -1555,6 +1590,27 @@
if (timing) {
endTimer("Compiling the schemas");
}
+ } else if ((schema != NULL) && (stream == 0)) {
+ xmlSchemaParserCtxtPtr ctxt;
+
+ if (timing) {
+ startTimer();
+ }
+ ctxt = xmlSchemaNewParserCtxt(schema);
+ xmlSchemaSetParserErrors(ctxt,
+ (xmlSchemaValidityErrorFunc) fprintf,
+ (xmlSchemaValidityWarningFunc) fprintf,
+ stderr);
+ wxschemas = xmlSchemaParse(ctxt);
+ if (wxschemas == NULL) {
+ xmlGenericError(xmlGenericErrorContext,
+ "WXS schema %s failed to compile\n", schema);
+ schema = NULL;
+ }
+ xmlSchemaFreeParserCtxt(ctxt);
+ if (timing) {
+ endTimer("Compiling the schemas");
+ }
}
#endif
for (i = 1; i < argc ; i++) {
@@ -1578,6 +1634,11 @@
i++;
continue;
}
+ if ((!strcmp(argv[i], "-schema")) ||
+ (!strcmp(argv[i], "--schema"))) {
+ i++;
+ continue;
+ }
if ((timing) && (repeat))
startTimer();
/* Remember file names. "-" means stdin. <sven@zen.org> */
@@ -1611,6 +1672,8 @@
#ifdef LIBXML_SCHEMAS_ENABLED
if (relaxngschemas != NULL)
xmlRelaxNGFree(relaxngschemas);
+ if (wxschemas != NULL)
+ xmlSchemaFree(wxschemas);
xmlRelaxNGCleanupTypes();
#endif
xmlCleanupParser();
diff --git a/xmlschemas.c b/xmlschemas.c
index 0f02f21..f2049af 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -60,6 +60,7 @@
xmlSchemaValidityErrorFunc error; /* the callback in case of errors */
xmlSchemaValidityWarningFunc warning;/* the callback in case of warning */
xmlSchemaValidError err;
+ int nberrors;
xmlSchemaPtr schema; /* The schema in use */
xmlChar *container; /* the current element, group, ... */
@@ -111,6 +112,7 @@
xmlDocPtr myDoc;
int err;
+ int nberrors;
xmlNodePtr node;
xmlNodePtr cur;
@@ -156,6 +158,7 @@
ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -202,6 +205,7 @@
ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -819,6 +823,7 @@
ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -828,6 +833,7 @@
val = xmlHashAddEntry2(schema->notaDecl, name, schema->targetNamespace,
ret);
if (val != 0) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Could not add notation %s\n",
name);
@@ -868,6 +874,7 @@
ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -877,6 +884,7 @@
val = xmlHashAddEntry3(schema->attrDecl, name,
schema->targetNamespace, ctxt->container, ret);
if (val != 0) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Could not add attribute %s\n",
name);
@@ -914,6 +922,7 @@
ret = (xmlSchemaAttributeGroupPtr) xmlMalloc(sizeof(xmlSchemaAttributeGroup));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -923,6 +932,7 @@
val = xmlHashAddEntry3(schema->attrgrpDecl, name,
schema->targetNamespace, ctxt->container, ret);
if (val != 0) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Could not add attribute group %s\n",
name);
@@ -962,6 +972,7 @@
ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -977,6 +988,7 @@
val = xmlHashAddEntry3(schema->elemDecl, name, (xmlChar *) buf,
namespace, ret);
if (val != 0) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Could not add element %s\n",
name);
@@ -1016,6 +1028,7 @@
ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
if (ret == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Out of memory\n");
return (NULL);
@@ -1025,6 +1038,7 @@
val = xmlHashAddEntry2(schema->typeDecl, name, schema->targetNamespace,
ret);
if (val != 0) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Could not add type %s\n", name);
xmlFree((char *) ret->name);
@@ -1076,6 +1090,7 @@
ns = xmlSearchNs(node->doc, node, prefix);
if (ns == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1119,6 +1134,7 @@
}
while (IS_BLANK(*cur)) cur++;
if (*cur != 0) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "invalid value for minOccurs: %s\n",
@@ -1156,6 +1172,7 @@
}
while (IS_BLANK(*cur)) cur++;
if (*cur != 0) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "invalid value for minOccurs: %s\n",
@@ -1193,6 +1210,7 @@
else if (xmlStrEqual(val, BAD_CAST"false"))
def = 0;
else {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1350,6 +1368,7 @@
facet->node = node;
value = xmlGetProp(node, (const xmlChar *) "value");
if (value == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Facet %s has no value\n", node->name);
@@ -1381,6 +1400,7 @@
} else if (IS_SCHEMA(node, "minLength")) {
facet->type = XML_SCHEMA_FACET_MINLENGTH;
} else {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Unknown facet type %s\n", node->name);
@@ -1396,6 +1416,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1441,6 +1462,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1473,6 +1495,7 @@
return (NULL);
name = xmlGetProp(node, (const xmlChar *) "name");
if (name == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Notation has no name\n");
@@ -1489,6 +1512,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1537,6 +1561,7 @@
} else if (xmlStrEqual(processContents, (const xmlChar *)"lax")) {
ret->occurs = XML_SCHEMAS_ANYATTR_LAX;
} else {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1553,6 +1578,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1592,6 +1618,7 @@
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Attribute has no name nor ref\n");
@@ -1611,6 +1638,7 @@
ret->ref = ref;
ret->refNs = refNs;
ret->typeName = xmlGetQNameProp(ctxt, node, "type", &(ret->typeNs));
+ ret->node = node;
child = node->children;
if (IS_SCHEMA(child, "annotation")) {
ret->annot = xmlSchemaParseAnnotation(ctxt, schema, child);
@@ -1621,6 +1649,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1661,6 +1690,7 @@
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1670,6 +1700,7 @@
snprintf(buf, 99, "anonattrgroup%d", ctxt->counter++ + 1);
name = xmlStrdup((xmlChar *) buf);
if (name == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"out of memory\n");
@@ -1686,6 +1717,7 @@
ret->ref = ref;
ret->refNs = refNs;
ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
+ ret->node = node;
child = node->children;
ctxt->container = name;
if (IS_SCHEMA(child, "annotation")) {
@@ -1717,6 +1749,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1759,6 +1792,7 @@
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Element has no name nor ref\n");
@@ -1805,6 +1839,7 @@
ret->value = xmlGetProp(node, BAD_CAST "default");
if ((ret->value != NULL) && (fixed != NULL)) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
ctxt->error(ctxt->userData,
"Element %s has both default and fixed\n",
@@ -1834,6 +1869,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1900,6 +1936,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1954,6 +1991,7 @@
type->subtypes = subtype;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -1994,6 +2032,7 @@
name = xmlStrdup((xmlChar *) buf);
}
if (name == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "simpleType has no name\n");
@@ -2028,6 +2067,7 @@
}
type->subtypes = subtype;
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2069,6 +2109,7 @@
ref = xmlGetQNameProp(ctxt, node, "ref", &refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "Group has no name nor ref\n");
@@ -2109,6 +2150,7 @@
if (subtype != NULL)
type->subtypes = subtype;
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2174,6 +2216,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2213,6 +2256,7 @@
if (namespace != NULL) {
check = xmlParseURI((const char *) namespace);
if (check == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2228,6 +2272,7 @@
if (schemaLocation != NULL) {
check = xmlParseURI((const char *) schemaLocation);
if (check == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2244,6 +2289,7 @@
if (schema->schemasImports == NULL) {
schema->schemasImports = xmlHashCreate(10);
if (schema->schemasImports == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2261,6 +2307,7 @@
if (schemaLocation != NULL) {
if (previous != NULL) {
if (!xmlStrEqual(schemaLocation, previous)) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2277,6 +2324,7 @@
if (schemaLocation != NULL) {
if (previous != NULL) {
if (!xmlStrEqual(schemaLocation, previous)) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2298,6 +2346,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2377,6 +2426,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2457,6 +2507,7 @@
child = child->next;
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2503,6 +2554,7 @@
type->id = xmlGetProp(node, BAD_CAST "id");
type->base = xmlGetQNameProp(ctxt, node, "base", &(type->baseNs));
if ((!simple) && (type->base == NULL)) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2575,6 +2627,7 @@
}
child = xmlSchemaParseAttrDecls(ctxt, schema, child, type);
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2621,6 +2674,7 @@
type->base = xmlGetQNameProp(ctxt, node, "base", &(type->baseNs));
if (type->base == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2651,6 +2705,7 @@
type->subtypes = subtype;
child = xmlSchemaParseAttrDecls(ctxt, schema, child, type);
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2709,6 +2764,7 @@
}
type->subtypes = subtype;
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2766,6 +2822,7 @@
}
type->subtypes = subtype;
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2807,6 +2864,7 @@
name = xmlStrdup((xmlChar *) buf);
}
if (name == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData, "complexType has no name\n");
@@ -2854,6 +2912,7 @@
child = xmlSchemaParseAttrDecls(ctxt, schema, child, type);
}
if (child != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2884,10 +2943,13 @@
xmlSchemaAnnotPtr annot;
xmlNodePtr child = NULL;
xmlChar *val;
+ int nberrors;
if ((ctxt == NULL) || (node == NULL))
return (NULL);
+ nberrors = ctxt->nberrors;
+ ctxt->nberrors = 0;
if (IS_SCHEMA(node, "schema")) {
schema = xmlSchemaNewSchema(ctxt);
if (schema == NULL)
@@ -2900,6 +2962,7 @@
if (xmlStrEqual(val, BAD_CAST "qualified"))
schema->flags |= XML_SCHEMAS_QUALIF_ELEM;
else if (!xmlStrEqual(val, BAD_CAST "unqualified")) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL)) {
ctxt->error(ctxt->userData,
@@ -2914,6 +2977,7 @@
if (xmlStrEqual(val, BAD_CAST "qualified"))
schema->flags |= XML_SCHEMAS_QUALIF_ATTR;
else if (!xmlStrEqual(val, BAD_CAST "unqualified")) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL)) {
ctxt->error(ctxt->userData,
@@ -2967,6 +3031,7 @@
xmlSchemaParseNotation(ctxt, schema, child);
child = child->next;
} else {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, schema, node, child);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -2984,6 +3049,13 @@
}
}
}
+ if (ctxt->nberrors != 0) {
+ if (schema != NULL) {
+ xmlSchemaFree(schema);
+ schema = NULL;
+ }
+ }
+ ctxt->nberrors = nberrors;
#ifdef DEBUG
if (schema == NULL)
xmlGenericError(xmlGenericErrorContext,
@@ -3472,6 +3544,7 @@
xmlSchemaElementPtr elemDecl;
if (elem->subtypes != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, elem->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -3483,6 +3556,8 @@
elem->ref, elem->refNs);
if (elemDecl == NULL) {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, elem->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: element %s ref to %s not found\n",
@@ -3494,6 +3569,7 @@
xmlSchemaTypePtr typeDecl;
if (elem->subtypes != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, elem->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -3505,6 +3581,8 @@
elem->namedTypeNs);
if (typeDecl == NULL) {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, elem->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: element %s type %s not found\n",
@@ -3549,6 +3627,7 @@
baseType = xmlSchemaGetType(ctxt->schema, typeDecl->base,
typeDecl->baseNs);
if (baseType == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: type %s base type %s not found\n",
@@ -3584,6 +3663,7 @@
baseType = xmlSchemaGetType(ctxt->schema, typeDecl->base,
typeDecl->baseNs);
if (baseType == NULL) {
+ ctxt->nberrors++;
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: type %s base type %s not found\n",
@@ -3611,6 +3691,7 @@
base = xmlSchemaGetType(ctxt->schema, typeDecl->base,
typeDecl->baseNs);
if (base == NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL, typeDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
@@ -3777,6 +3858,7 @@
if (facet->val == NULL) {
/* error code */
if (ctxt != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL,
facet->node, NULL);
ctxt->error(ctxt->userData,
@@ -3803,6 +3885,7 @@
facet->value);
if (tmp != 0) {
if (ctxt != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL,
facet->node, NULL);
ctxt->error(ctxt->userData,
@@ -3819,6 +3902,7 @@
if (facet->regexp == NULL) {
/* error code */
if (ctxt != NULL) {
+ ctxt->nberrors++;
ctxt->error(ctxt->userData,
"Schemas: type %s facet regexp %s invalid\n",
name, facet->value);
@@ -3839,6 +3923,7 @@
if (tmp != 0) {
/* error code */
if (ctxt != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL,
facet->node, NULL);
ctxt->error(ctxt->userData,
@@ -3860,6 +3945,7 @@
facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
} else {
if (ctxt != NULL) {
+ ctxt->nberrors++;
xmlSchemaErrorContext(ctxt, NULL,
facet->node, NULL);
ctxt->error(ctxt->userData,
@@ -3923,6 +4009,8 @@
ref = xmlHashLookup2(ctxt->schema->attrgrpDecl, attrgrpDecl->ref,
attrgrpDecl->refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, attrgrpDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: attribute group %s reference %s not found\n",
@@ -3932,6 +4020,8 @@
xmlSchemaAttrGrpFixup(ref, ctxt, NULL);
attrgrpDecl->attributes = ref->attributes;
} else {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, attrgrpDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: attribute %s has no attributes nor reference\n",
@@ -3962,6 +4052,8 @@
type = xmlSchemaGetType(ctxt->schema, attrDecl->typeName,
attrDecl->typeNs);
if (type == NULL) {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, attrDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: attribute %s type %s not found\n",
@@ -3974,6 +4066,8 @@
ref = xmlHashLookup2(ctxt->schema->attrDecl, attrDecl->ref,
attrDecl->refNs);
if (ref == NULL) {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, attrDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: attribute %s reference %s not found\n",
@@ -3983,6 +4077,8 @@
xmlSchemaAttrFixup(ref, ctxt, NULL);
attrDecl->subtypes = ref->subtypes;
} else {
+ ctxt->nberrors++;
+ xmlSchemaErrorContext(ctxt, NULL, attrDecl->node, NULL);
if ((ctxt != NULL) && (ctxt->error != NULL))
ctxt->error(ctxt->userData,
"Schemas: attribute %s has no type nor reference\n",
@@ -4007,12 +4103,15 @@
xmlSchemaPtr ret = NULL;
xmlDocPtr doc;
xmlNodePtr root, cur, delete;
+ int nberrors;
xmlSchemaInitTypes();
if (ctxt == NULL)
return (NULL);
+ nberrors = ctxt->nberrors;
+ ctxt->nberrors = 0;
ctxt->counter = 0;
ctxt->container = NULL;
@@ -4022,6 +4121,7 @@
if (ctxt->URL != NULL) {
doc = xmlParseFile((const char *) ctxt->URL);
if (doc == NULL) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"xmlSchemaParse: could not load %s\n", ctxt->URL);
@@ -4030,6 +4130,7 @@
} else if (ctxt->buffer != NULL) {
doc = xmlParseMemory(ctxt->buffer, ctxt->size);
if (doc == NULL) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"xmlSchemaParse: could not parse schemas\n");
@@ -4038,6 +4139,7 @@
doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
} else {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"xmlSchemaParse: nothing to parse\n");
@@ -4049,6 +4151,7 @@
*/
root = xmlDocGetRootElement(doc);
if (root == NULL) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "xmlSchemaParse: %s is empty\n",
ctxt->URL);
@@ -4156,6 +4259,10 @@
*/
xmlHashScan(ret->attrgrpDecl, (xmlHashScanner) xmlSchemaAttrGrpFixup, ctxt);
+ if (ctxt->nberrors != 0) {
+ xmlSchemaFree(ret);
+ ret = NULL;
+ }
return (ret);
}
@@ -4262,6 +4369,7 @@
if (tmp != 0) {
ret = tmp;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Failed to validate type with facet %s\n",
@@ -4312,6 +4420,7 @@
ret = xmlSchemaValPredefTypeNode(type, value, &(ctxt->value),
ctxt->cur);
if (ret != 0) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Failed to validate basic type %s\n", type->name);
@@ -4353,6 +4462,7 @@
base = type->subtypes;
if (base == NULL) {
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
+ ctxt->nberrors++;
if (ctxt->error != NULL) {
xmlSchemaErrorContext(NULL, ctxt->schema, type->node, NULL);
ctxt->error(ctxt->userData,
@@ -4455,6 +4565,7 @@
if (ctxt->attr[i].state == XML_SCHEMAS_ATTR_UNKNOWN) {
ret = 1;
ctxt->err = XML_SCHEMAS_ERR_ATTRUNKNOWN;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Attribute %s on %s is unknown\n",
@@ -4627,6 +4738,7 @@
type = ctxt->type;
if ((ctxt == NULL) || (type == NULL)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4639,6 +4751,7 @@
*/
ret = xmlSchemaValidateCheckNodeList(child);
if (ret < 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4646,6 +4759,7 @@
node->name);
return (-1);
} else if (ret == 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_NOTSIMPLE;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4681,6 +4795,7 @@
type = ctxt->type;
if ((ctxt == NULL) || (type == NULL)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4693,6 +4808,7 @@
*/
ret = xmlSchemaValidateCheckNodeList(child);
if (ret < 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4700,6 +4816,7 @@
node->name);
return(-1);
} else if (ret == 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_NOTSIMPLE;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4719,6 +4836,7 @@
(!xmlStrEqual(attr->name, BAD_CAST"schemasLocation")) &&
(!xmlStrEqual(attr->name, BAD_CAST"noNamespaceSchemaLocation")))) {
ctxt->err = XML_SCHEMAS_ERR_INVALIDATTR;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Element %s: attribute %s should not be present\n",
@@ -4758,6 +4876,7 @@
type = ctxt->type;
if ((ctxt == NULL) || (type == NULL)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4767,6 +4886,7 @@
}
if (child == NULL) {
if (type->minOccurs > 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_MISSING;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4780,6 +4900,7 @@
* Verify the element matches
*/
if (!xmlStrEqual(child->name, type->name)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_WRONGELEM;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4818,11 +4939,13 @@
"====> %s : %d\n", node->name, ret);
#endif
if (ret == 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_ELEMCONT;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s content check failed\n",
node->name);
} else if (ret < 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_ELEMCONT;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s content check failure\n",
@@ -4871,6 +4994,7 @@
type = ctxt->type;
if ((ctxt == NULL) || (type == NULL)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4896,6 +5020,7 @@
TODO
break;
case XML_ELEMENT_NODE:
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INVALIDELEM;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4916,6 +5041,7 @@
#ifdef LIBXML_DOCB_ENABLED
case XML_DOCB_DOCUMENT_NODE:
#endif
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INVALIDELEM;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -4938,6 +5064,7 @@
if (value != NULL)
xmlFree(value);
if (ret != 0) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Element %s: failed to validate basic type %s\n",
@@ -4972,6 +5099,7 @@
switch (type->contentType) {
case XML_SCHEMA_CONTENT_EMPTY:
if (child != NULL) {
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Element %s is supposed to be empty\n",
@@ -5076,6 +5204,7 @@
*/
if (decl->ref != NULL) {
if (decl->refDecl == NULL) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -5211,6 +5340,7 @@
* 3.3.4 : 2
*/
if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_ISABSTRACT;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s is abstract\n", elem->name);
@@ -5224,6 +5354,7 @@
/* 3.3.4: 3.2 */
if (xmlStrEqual(nil, BAD_CAST "true")) {
if (elem->children != NULL) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_NOTEMPTY;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s is not empty\n",
@@ -5232,6 +5363,7 @@
}
if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
(elemDecl->value != NULL)) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_HAVEDEFAULT;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -5244,6 +5376,7 @@
/* 3.3.4: 3.1 */
if (nil != NULL) {
ctxt->err = XML_SCHEMAS_ERR_NOTNILLABLE;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Element %s with xs:nil but not nillable\n",
@@ -5321,6 +5454,7 @@
}
ctxt->cur = (xmlNodePtr) attributes;
if (attributes->subtypes == NULL) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_INTERNAL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -5332,6 +5466,7 @@
ret = xmlSchemaValidateSimpleValue(ctxt, attributes->subtypes,
value);
if (ret != 0) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_ATTRINVALID;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
@@ -5374,6 +5509,7 @@
* 3.3.4 : 1
*/
if (elemDecl == NULL) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_UNDECLAREDELEM;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s not declared\n",
@@ -5381,6 +5517,7 @@
return(ctxt->err);
}
if (elemDecl->subtypes == NULL) {
+ ctxt->nberrors++;
ctxt->err = XML_SCHEMAS_ERR_NOTYPE;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s has no type\n",
@@ -5415,11 +5552,13 @@
#endif
if (ret == 0) {
ctxt->err = XML_SCHEMAS_ERR_ELEMCONT;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s content check failed\n",
elem->name);
} else if (ret < 0) {
ctxt->err = XML_SCHEMAS_ERR_ELEMCONT;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s content check failed\n",
elem->name);
@@ -5460,6 +5599,7 @@
root = xmlDocGetRootElement(doc);
if (root == NULL) {
ctxt->err = XML_SCHEMAS_ERR_NOROOT;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "document has no root\n");
return(ctxt->err);
@@ -5472,11 +5612,13 @@
root->name, NULL, NULL);
if (elemDecl == NULL) {
ctxt->err = XML_SCHEMAS_ERR_UNDECLAREDELEM;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Element %s not declared\n",
root->name);
} else if ((elemDecl->flags & XML_SCHEMAS_ELEM_TOPLEVEL) == 0) {
ctxt->err = XML_SCHEMAS_ERR_NOTTOPLEVEL;
+ ctxt->nberrors++;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData, "Root element %s not toplevel\n",
root->name);
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 831721a..44ecab9 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -1739,7 +1739,13 @@
case XML_SCHEMAS_ID:
ret = xmlValidateNCName(value, 1);
if ((ret == 0) && (val != NULL)) {
- TODO;
+ v = xmlSchemaNewValue(XML_SCHEMAS_ID);
+ if (v != NULL) {
+ v->value.str = xmlStrdup(value);
+ *val = v;
+ } else {
+ goto error;
+ }
}
if ((ret == 0) && (node != NULL) &&
(node->type == XML_ATTRIBUTE_NODE)) {