more work on Relax-NG augmented/updated the regression tests added a
* relaxng.c: more work on Relax-NG
* test/relaxng/* result/relaxng/*: augmented/updated the
regression tests
* xmlschemastypes.c: added a number of base type definition but not
the associated checks, those are still TODOs
Daniel
diff --git a/ChangeLog b/ChangeLog
index bad10a8..42b5e37 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Jan 27 13:29:43 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+ * relaxng.c: more work on Relax-NG
+ * test/relaxng/* result/relaxng/*: augmented/updated the
+ regression tests
+ * xmlschemastypes.c: added a number of base type definition but not
+ the associated checks, those are still TODOs
+
Sun Jan 26 17:37:06 MST 2003 John Fleck <jfleck@inkstain.net>
in docs/tutorial:
@@ -30,7 +38,7 @@
Sun Jan 26 20:47:26 CET 2003 Daniel Veillard <daniel@veillard.com>
- * xmlcatalog.c xmllint.c: applied patch for FreeBSD by
+ * xmlcatalog.c xmllint.c: applied patch for NetBSD by
Julio Merino, closing #104475
Sun Jan 26 20:38:43 CET 2003 Daniel Veillard <daniel@veillard.com>
diff --git a/configure.in b/configure.in
index eb67322..59395a7 100644
--- a/configure.in
+++ b/configure.in
@@ -647,7 +647,7 @@
RELDATE=`date +'%a %b %e %Y'`
AC_SUBST(RELDATE)
-rm -f rm COPYING.LIB COPYING
+rm -f COPYING.LIB COPYING
ln -s Copyright COPYING
AC_OUTPUT(libxml.spec Makefile include/Makefile include/libxml/Makefile doc/Makefile example/Makefile python/Makefile python/tests/Makefile include/libxml/xmlversion.h xml2-config libxml-2.0.pc xml2Conf.sh python/setup.py)
diff --git a/relaxng.c b/relaxng.c
index a104d8e..f5ac07d 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -24,6 +24,7 @@
#include <libxml/xmlschemastypes.h>
#include <libxml/xmlautomata.h>
#include <libxml/xmlregexp.h>
+#include <libxml/xmlschemastypes.h>
/*
* The Relax-NG namespace
@@ -168,10 +169,11 @@
typedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
typedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
struct _xmlRelaxNGValidState {
- xmlNodePtr node; /* the current node */
- xmlNodePtr seq; /* the sequence of children left to validate */
- int nbAttrs; /* the number of attributes */
- xmlChar *value; /* the value when operating on string */
+ xmlNodePtr node; /* the current node */
+ xmlNodePtr seq; /* the sequence of children left to validate */
+ int nbAttrs; /* the number of attributes */
+ xmlChar *value; /* the value when operating on string */
+ xmlChar *endvalue; /* the end value when operating on string */
xmlAttrPtr attrs[1]; /* the array of attributes */
};
@@ -668,8 +670,15 @@
*/
static int
xmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED,
- const xmlChar *type ATTRIBUTE_UNUSED) {
- TODO
+ const xmlChar *type) {
+ xmlSchemaTypePtr typ;
+
+ if (type == NULL)
+ return(-1);
+ typ = xmlSchemaGetPredefinedType(type,
+ BAD_CAST "http://www.w3.org/2001/XMLSchema");
+ if (typ == NULL)
+ return(0);
return(1);
}
@@ -686,10 +695,29 @@
*/
static int
xmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED,
- const xmlChar *type ATTRIBUTE_UNUSED,
- const xmlChar *value ATTRIBUTE_UNUSED) {
- TODO
- return(1);
+ const xmlChar *type,
+ const xmlChar *value) {
+ xmlSchemaTypePtr typ;
+ int ret;
+
+ /*
+ * TODO: the type should be cached ab provided back, interface subject
+ * to changes.
+ * TODO: handle facets, may require an additional interface and keep
+ * the value returned from the validation.
+ */
+ if ((type == NULL) || (value == NULL))
+ return(-1);
+ typ = xmlSchemaGetPredefinedType(type,
+ BAD_CAST "http://www.w3.org/2001/XMLSchema");
+ if (typ == NULL)
+ return(-1);
+ ret = xmlSchemaValidatePredefinedType(typ, value, NULL);
+ if (ret == 0)
+ return(1);
+ if (ret > 0)
+ return(0);
+ return(-1);
}
/**
@@ -1260,7 +1288,7 @@
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
return(NULL);
- def->type = XML_RELAXNG_ZEROORMORE;
+ def->type = XML_RELAXNG_ONEORMORE;
def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
} else if (IS_RELAXNG(node, "optional")) {
def = xmlRelaxNGNewDefine(ctxt, node);
@@ -1346,6 +1374,12 @@
def = NULL;
} else if (IS_RELAXNG(node, "value")) {
def = xmlRelaxNGParseValue(ctxt, node);
+ } else if (IS_RELAXNG(node, "list")) {
+ def = xmlRelaxNGNewDefine(ctxt, node);
+ if (def == NULL)
+ return(NULL);
+ def->type = XML_RELAXNG_LIST;
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
} else {
TODO
}
@@ -2632,6 +2666,8 @@
************************************************************************/
static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
xmlRelaxNGDefinePtr define);
+static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
+ xmlRelaxNGDefinePtr define);
/**
* xmlRelaxNGSkipIgnored:
@@ -2745,6 +2781,55 @@
}
/**
+ * xmlRelaxNGNextValue:
+ * @ctxt: a Relax-NG validation context
+ *
+ * Skip to the next value when validating within a list
+ *
+ * Returns 0 if the operation succeeded or an error code.
+ */
+static int
+xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) {
+ xmlChar *cur;
+
+ cur = ctxt->state->value;
+ if ((cur == NULL) || (ctxt->state->endvalue == NULL)) {
+ ctxt->state->value = NULL;
+ return(0);
+ }
+ while (*cur != 0) cur++;
+ while ((cur != ctxt->state->endvalue) && (*cur == 0)) cur++;
+ if (cur == ctxt->state->endvalue)
+ ctxt->state->value = NULL;
+ else
+ ctxt->state->value = cur;
+ return(0);
+}
+
+/**
+ * xmlRelaxNGValidateValueList:
+ * @ctxt: a Relax-NG validation context
+ * @defines: the list of definitions to verify
+ *
+ * Validate the given set of definitions for the current value
+ *
+ * Returns 0 if the validation succeeded or an error code.
+ */
+static int
+xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt,
+ xmlRelaxNGDefinePtr defines) {
+ int ret = 0;
+
+ while (defines != NULL) {
+ ret = xmlRelaxNGValidateValue(ctxt, defines);
+ if (ret != 0)
+ break;
+ defines = defines->next;
+ }
+ return(ret);
+}
+
+/**
* xmlRelaxNGValidateValue:
* @ctxt: a Relax-NG validation context
* @define: the definition to verify
@@ -2767,22 +2852,6 @@
break;
case XML_RELAXNG_TEXT:
break;
- case XML_RELAXNG_CHOICE: {
- xmlRelaxNGDefinePtr list = define->content;
-
- oldflags = ctxt->flags;
- ctxt->flags |= FLAGS_IGNORABLE;
-
- while (list != NULL) {
- ret = xmlRelaxNGValidateValue(ctxt, list);
- if (ret == 0) {
- break;
- }
- list = list->next;
- }
- ctxt->flags = oldflags;
- break;
- }
case XML_RELAXNG_VALUE: {
if (!xmlStrEqual(value, define->value)) {
if (define->name != NULL) {
@@ -2825,6 +2894,102 @@
}
break;
}
+ case XML_RELAXNG_DATATYPE: {
+ ret = xmlRelaxNGValidateDatatype(ctxt, value, define);
+ if (ret == 0)
+ xmlRelaxNGNextValue(ctxt);
+
+ break;
+ }
+ case XML_RELAXNG_CHOICE: {
+ xmlRelaxNGDefinePtr list = define->content;
+ xmlChar *oldvalue;
+
+ oldflags = ctxt->flags;
+ ctxt->flags |= FLAGS_IGNORABLE;
+
+ oldvalue = ctxt->state->value;
+ while (list != NULL) {
+ ret = xmlRelaxNGValidateValue(ctxt, list);
+ if (ret == 0) {
+ break;
+ }
+ ctxt->state->value = oldvalue;
+ list = list->next;
+ }
+ ctxt->flags = oldflags;
+ break;
+ }
+ case XML_RELAXNG_LIST: {
+ xmlRelaxNGDefinePtr list = define->content;
+ xmlChar *oldvalue, *oldend, *val, *cur;
+
+ oldvalue = ctxt->state->value;
+ oldend = ctxt->state->endvalue;
+
+ val = xmlStrdup(oldvalue);
+ if (val == NULL) {
+ VALID_CTXT();
+ VALID_ERROR("Internal: no state\n");
+ return(-1);
+ }
+ cur = val;
+ while (*cur != 0) {
+ if (IS_BLANK(*cur))
+ *cur = 0;
+ cur++;
+ }
+ ctxt->state->endvalue = cur;
+ cur = val;
+ while ((*cur == 0) && (cur != ctxt->state->endvalue)) cur++;
+
+ ctxt->state->value = cur;
+
+ while (list != NULL) {
+ ret = xmlRelaxNGValidateValue(ctxt, list);
+ if (ret != 0) {
+ break;
+ }
+ list = list->next;
+ }
+ if ((ret == 0) && (ctxt->state->value != NULL) &&
+ (ctxt->state->value != ctxt->state->endvalue)) {
+ VALID_CTXT();
+ VALID_ERROR("Extra data in list: %s\n", ctxt->state->value);
+ ret = -1;
+ }
+ xmlFree(val);
+ ctxt->state->value = oldvalue;
+ ctxt->state->endvalue = oldend;
+ break;
+ }
+ case XML_RELAXNG_ONEORMORE:
+ ret = xmlRelaxNGValidateValueList(ctxt, define->content);
+ if (ret != 0) {
+ break;
+ }
+ /* no break on purpose */
+ case XML_RELAXNG_ZEROORMORE: {
+ xmlChar *cur, *temp;
+
+ oldflags = ctxt->flags;
+ ctxt->flags |= FLAGS_IGNORABLE;
+ cur = ctxt->state->value;
+ temp = NULL;
+ while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
+ (temp != cur)) {
+ temp = cur;
+ ret = xmlRelaxNGValidateValueList(ctxt, define->content);
+ if (ret != 0) {
+ ctxt->state->value = temp;
+ ret = 0;
+ break;
+ }
+ cur = ctxt->state->value;
+ }
+ ctxt->flags = oldflags;
+ break;
+ }
default:
TODO
ret = -1;
@@ -3101,9 +3266,6 @@
node->name, ret);
#endif
break;
- case XML_RELAXNG_LIST:
- TODO
- break;
case XML_RELAXNG_OPTIONAL:
oldflags = ctxt->flags;
ctxt->flags |= FLAGS_IGNORABLE;
@@ -3239,7 +3401,7 @@
*/
if ((node != NULL) && (node->next != NULL)) {
VALID_CTXT();
- VALID_ERROR("The data does not cover the full element %s\n",
+ VALID_ERROR("The value does not cover the full element %s\n",
node->parent->name);
ret = -1;
}
@@ -3247,9 +3409,41 @@
xmlFree(content);
break;
}
+ case XML_RELAXNG_LIST: {
+ xmlChar *content;
+ xmlChar *oldvalue, *oldendvalue;
+ int len;
- TODO
+ content = xmlNodeGetContent(node);
+ len = xmlStrlen(content);
+ oldvalue = ctxt->state->value;
+ oldendvalue = ctxt->state->endvalue;
+ ctxt->state->value = content;
+ ctxt->state->endvalue = content + len;
+ ret = xmlRelaxNGValidateValue(ctxt, define);
+ ctxt->state->value = oldvalue;
+ ctxt->state->endvalue = oldendvalue;
+ if (ret == -1) {
+ VALID_CTXT();
+ VALID_ERROR("internal error validating list\n");
+ } else if (ret == 0) {
+ ctxt->state->seq = node->next;
+ }
+ /*
+ * TODO cover the problems with
+ * <p>12<!-- comment -->34</p>
+ * TODO detect full element coverage at compilation time.
+ */
+ if ((node != NULL) && (node->next != NULL)) {
+ VALID_CTXT();
+ VALID_ERROR("The list does not cover the full element %s\n",
+ node->parent->name);
+ ret = -1;
+ }
+ if (content != NULL)
+ xmlFree(content);
break;
+ }
}
return(ret);
}
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 6904d3b..c6fec43 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3030
-error detected at relaxng.c:3078
+error detected at relaxng.c:3195
+error detected at relaxng.c:3243
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index cb3157b..cc6c58f 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(name): -1
xmlRelaxNGValidateDefinition(): validated email : 0
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:3078
+error detected at relaxng.c:3243
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor5_1_1.err b/result/relaxng/tutor5_1_1.err
index fa62fe3..12f8f41 100644
--- a/result/relaxng/tutor5_1_1.err
+++ b/result/relaxng/tutor5_1_1.err
@@ -1,3 +1,2 @@
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1138
xmlRelaxNGValidateDefinition(): validated number : 0
diff --git a/result/relaxng/tutor5_2_1.err b/result/relaxng/tutor5_2_1.err
index b56a85a..3a6dcf1 100644
--- a/result/relaxng/tutor5_2_1.err
+++ b/result/relaxng/tutor5_2_1.err
@@ -1,7 +1,5 @@
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:672
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1135
xmlRelaxNGValidateDefinition(): validated x : 0
-Unimplemented block at relaxng.c:691
+Unimplemented block at xmlschemastypes.c:1135
xmlRelaxNGValidateDefinition(): validated y : 0
xmlRelaxNGValidateDefinition(): validated point : 0
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index b4edac2..a355b6f 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3211
+error detected at relaxng.c:3373
xmlRelaxNGValidateDefinition(): validated note : 0
xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index a0bb286..a21cc23 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(preferredFormat): -1
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3086
+error detected at relaxng.c:3251
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
index 2f65d34..150516d 100644
--- a/result/relaxng/tutor6_2_4.err
+++ b/result/relaxng/tutor6_2_4.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateDefinition(): validated name : 0
xmlRelaxNGValidateDefinition(): validated email : 0
-error detected at relaxng.c:3078
+error detected at relaxng.c:3243
xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
index a0bb286..a21cc23 100644
--- a/result/relaxng/tutor6_3_1.err
+++ b/result/relaxng/tutor6_3_1.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(preferredFormat): -1
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3086
+error detected at relaxng.c:3251
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor7_1_1 b/result/relaxng/tutor7_1_1
new file mode 100644
index 0000000..6cae548
--- /dev/null
+++ b/result/relaxng/tutor7_1_1
@@ -0,0 +1 @@
+./test/relaxng/tutor7_1_1.xml validates
diff --git a/result/relaxng/tutor7_1_1.err b/result/relaxng/tutor7_1_1.err
new file mode 100644
index 0000000..6410272
--- /dev/null
+++ b/result/relaxng/tutor7_1_1.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_1_2 b/result/relaxng/tutor7_1_2
new file mode 100644
index 0000000..6efbefe
--- /dev/null
+++ b/result/relaxng/tutor7_1_2
@@ -0,0 +1,4 @@
+Internal: failed to validate type float
+internal error validating list
+Extra content for element vector
+./test/relaxng/tutor7_1_2.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err
new file mode 100644
index 0000000..2201c4e
--- /dev/null
+++ b/result/relaxng/tutor7_1_2.err
@@ -0,0 +1,5 @@
+Unimplemented block at xmlschemastypes.c:1132
+error detected at relaxng.c:2769
+error detected at relaxng.c:3427
+error detected at relaxng.c:3243
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_3 b/result/relaxng/tutor7_1_3
new file mode 100644
index 0000000..cc8be56
--- /dev/null
+++ b/result/relaxng/tutor7_1_3
@@ -0,0 +1,4 @@
+Extra data in list: 5.6
+internal error validating list
+Extra content for element vector
+./test/relaxng/tutor7_1_3.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err
new file mode 100644
index 0000000..6fab551
--- /dev/null
+++ b/result/relaxng/tutor7_1_3.err
@@ -0,0 +1,6 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+error detected at relaxng.c:2957
+error detected at relaxng.c:3427
+error detected at relaxng.c:3243
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/result/relaxng/tutor7_1_4 b/result/relaxng/tutor7_1_4
new file mode 100644
index 0000000..81b9f58
--- /dev/null
+++ b/result/relaxng/tutor7_1_4
@@ -0,0 +1 @@
+./test/relaxng/tutor7_1_4.xml validates
diff --git a/result/relaxng/tutor7_1_4.err b/result/relaxng/tutor7_1_4.err
new file mode 100644
index 0000000..6410272
--- /dev/null
+++ b/result/relaxng/tutor7_1_4.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1132
+Unimplemented block at xmlschemastypes.c:1132
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_1 b/result/relaxng/tutor7_2_1
new file mode 100644
index 0000000..8673462
--- /dev/null
+++ b/result/relaxng/tutor7_2_1
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_1.xml validates
diff --git a/result/relaxng/tutor7_2_1.err b/result/relaxng/tutor7_2_1.err
new file mode 100644
index 0000000..fe1fa44
--- /dev/null
+++ b/result/relaxng/tutor7_2_1.err
@@ -0,0 +1,2 @@
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_2 b/result/relaxng/tutor7_2_2
new file mode 100644
index 0000000..d03cb32
--- /dev/null
+++ b/result/relaxng/tutor7_2_2
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_2.xml validates
diff --git a/result/relaxng/tutor7_2_2.err b/result/relaxng/tutor7_2_2.err
new file mode 100644
index 0000000..a0908ab
--- /dev/null
+++ b/result/relaxng/tutor7_2_2.err
@@ -0,0 +1,4 @@
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_3 b/result/relaxng/tutor7_2_3
new file mode 100644
index 0000000..baf1190
--- /dev/null
+++ b/result/relaxng/tutor7_2_3
@@ -0,0 +1 @@
+./test/relaxng/tutor7_2_3.xml validates
diff --git a/result/relaxng/tutor7_2_3.err b/result/relaxng/tutor7_2_3.err
new file mode 100644
index 0000000..829f712
--- /dev/null
+++ b/result/relaxng/tutor7_2_3.err
@@ -0,0 +1,3 @@
+Unimplemented block at xmlschemastypes.c:1135
+Unimplemented block at xmlschemastypes.c:1135
+xmlRelaxNGValidateDefinition(): validated vector : 0
diff --git a/result/relaxng/tutor7_2_4 b/result/relaxng/tutor7_2_4
new file mode 100644
index 0000000..86d3a08
--- /dev/null
+++ b/result/relaxng/tutor7_2_4
@@ -0,0 +1,3 @@
+Internal: no state
+internal error validating list
+./test/relaxng/tutor7_2_4.xml validation generated an internal error
diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err
new file mode 100644
index 0000000..951d0f6
--- /dev/null
+++ b/result/relaxng/tutor7_2_4.err
@@ -0,0 +1,3 @@
+error detected at relaxng.c:2932
+error detected at relaxng.c:3427
+xmlRelaxNGValidateDefinition(): validated vector : -1
diff --git a/test/relaxng/tutor5_1.rng b/test/relaxng/tutor5_1.rng
index bf53247..503a043 100644
--- a/test/relaxng/tutor5_1.rng
+++ b/test/relaxng/tutor5_1.rng
@@ -1,3 +1,3 @@
<element name="number" xmlns="http://relaxng.org/ns/structure/1.0">
- <data type="integer" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
+ <data type="int" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
</element>
diff --git a/test/relaxng/tutor7_1.rng b/test/relaxng/tutor7_1.rng
new file mode 100644
index 0000000..116e912
--- /dev/null
+++ b/test/relaxng/tutor7_1.rng
@@ -0,0 +1,7 @@
+<element name="vector" xmlns="http://relaxng.org/ns/structure/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <list>
+ <data type="float"/>
+ <data type="float"/>
+ </list>
+</element>
diff --git a/test/relaxng/tutor7_1_1.xml b/test/relaxng/tutor7_1_1.xml
new file mode 100644
index 0000000..3f03eea
--- /dev/null
+++ b/test/relaxng/tutor7_1_1.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4</vector>
diff --git a/test/relaxng/tutor7_1_2.xml b/test/relaxng/tutor7_1_2.xml
new file mode 100644
index 0000000..adbfdbd
--- /dev/null
+++ b/test/relaxng/tutor7_1_2.xml
@@ -0,0 +1 @@
+<vector>1.2</vector>
diff --git a/test/relaxng/tutor7_1_3.xml b/test/relaxng/tutor7_1_3.xml
new file mode 100644
index 0000000..f9eeb5c
--- /dev/null
+++ b/test/relaxng/tutor7_1_3.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4 5.6</vector>
diff --git a/test/relaxng/tutor7_1_4.xml b/test/relaxng/tutor7_1_4.xml
new file mode 100644
index 0000000..c9bda7f
--- /dev/null
+++ b/test/relaxng/tutor7_1_4.xml
@@ -0,0 +1 @@
+<vector> 1.2 3.4 </vector>
diff --git a/test/relaxng/tutor7_2.rng b/test/relaxng/tutor7_2.rng
new file mode 100644
index 0000000..a1c71d2
--- /dev/null
+++ b/test/relaxng/tutor7_2.rng
@@ -0,0 +1,8 @@
+<element name="vector" xmlns="http://relaxng.org/ns/structure/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <list>
+ <oneOrMore>
+ <data type="double"/>
+ </oneOrMore>
+ </list>
+</element>
diff --git a/test/relaxng/tutor7_2_1.xml b/test/relaxng/tutor7_2_1.xml
new file mode 100644
index 0000000..adbfdbd
--- /dev/null
+++ b/test/relaxng/tutor7_2_1.xml
@@ -0,0 +1 @@
+<vector>1.2</vector>
diff --git a/test/relaxng/tutor7_2_2.xml b/test/relaxng/tutor7_2_2.xml
new file mode 100644
index 0000000..f9eeb5c
--- /dev/null
+++ b/test/relaxng/tutor7_2_2.xml
@@ -0,0 +1 @@
+<vector>1.2 3.4 5.6</vector>
diff --git a/test/relaxng/tutor7_2_3.xml b/test/relaxng/tutor7_2_3.xml
new file mode 100644
index 0000000..5274bad
--- /dev/null
+++ b/test/relaxng/tutor7_2_3.xml
@@ -0,0 +1 @@
+<vector> 1.2 3.4 </vector>
diff --git a/test/relaxng/tutor7_2_4.xml b/test/relaxng/tutor7_2_4.xml
new file mode 100644
index 0000000..719ba5f
--- /dev/null
+++ b/test/relaxng/tutor7_2_4.xml
@@ -0,0 +1 @@
+<vector></vector>
diff --git a/test/relaxng/tutor7_3.rng b/test/relaxng/tutor7_3.rng
new file mode 100644
index 0000000..cbedaf9
--- /dev/null
+++ b/test/relaxng/tutor7_3.rng
@@ -0,0 +1,9 @@
+<element name="path" xmlns="http://relaxng.org/ns/structure/1.0"
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+ <list>
+ <oneOrMore>
+ <data type="double"/>
+ <data type="double"/>
+ </oneOrMore>
+ </list>
+</element>
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 1be67c8..52a069b 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -110,6 +110,9 @@
static int xmlSchemaTypesInitialized = 0;
static xmlHashTablePtr xmlSchemaTypesBank = NULL;
+/*
+ * Basic types
+ */
static xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
@@ -123,13 +126,28 @@
static xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
-static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
-static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeNmtoken = NULL;
static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
/*
+ * Derived types
+ */
+static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
+
+/*
* xmlSchemaInitBasicType:
* @name: the type name
*
@@ -165,6 +183,9 @@
return;
xmlSchemaTypesBank = xmlHashCreate(40);
+ /*
+ * primitive datatypes
+ */
xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string");
xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType");
xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType");
@@ -178,13 +199,27 @@
xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay");
xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay");
xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration");
- xmlSchemaTypePositiveIntegerDef = xmlSchemaInitBasicType("positiveInteger");
- xmlSchemaTypeNonNegativeIntegerDef =
- xmlSchemaInitBasicType("nonNegativeInteger");
xmlSchemaTypeNmtoken = xmlSchemaInitBasicType("NMTOKEN");
xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float");
xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double");
+ /*
+ * derived datatypes
+ */
+ xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer");;
+ xmlSchemaTypeNonPositiveIntegerDef = xmlSchemaInitBasicType("nonPositiveInteger");;
+ xmlSchemaTypeNegativeIntegerDef = xmlSchemaInitBasicType("negativeInteger");;
+ xmlSchemaTypeLongDef = xmlSchemaInitBasicType("long");;
+ xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int");;
+ xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short");;
+ xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte");;
+ xmlSchemaTypeNonNegativeIntegerDef = xmlSchemaInitBasicType("nonNegativeInteger");
+ xmlSchemaTypeUnsignedLongDef = xmlSchemaInitBasicType("unsignedLong");;
+ xmlSchemaTypeUnsignedIntDef = xmlSchemaInitBasicType("unsignedInt");;
+ xmlSchemaTypeUnsignedShortDef = xmlSchemaInitBasicType("insignedShort");;
+ xmlSchemaTypeUnsignedByteDef = xmlSchemaInitBasicType("unsignedByte");;
+ xmlSchemaTypePositiveIntegerDef = xmlSchemaInitBasicType("positiveInteger");
+
xmlSchemaTypesInitialized = 1;
}