aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--include/libxml/valid.h9
-rw-r--r--include/libxml/xmlautomata.h3
-rw-r--r--include/libxml/xmlregexp.h9
-rw-r--r--testAutomata.c1
-rw-r--r--valid.c34
-rw-r--r--xmlschemastypes.c36
7 files changed, 86 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 683ab2d7..84744dd9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Sep 17 12:38:08 CEST 2002 Daniel Veillard <daniel@veillard.com>
+
+ * xmlschemastypes.c: incomplete steps for real/double support
+ * testAutomata.c include/libxml/xmlautomata.h
+ include/libxml/xmlregexp.h: avoiding a compilation problem
+ * valid.c include/libxml/valid.h: starting the work toward using
+ the regexps for actual DTD validation
+
Fri Sep 13 16:46:14 CEST 2002 Daniel Veillard <daniel@veillard.com>
* hash.c: cosmetic cleanup
diff --git a/include/libxml/valid.h b/include/libxml/valid.h
index 3d2f5087..5535dd9e 100644
--- a/include/libxml/valid.h
+++ b/include/libxml/valid.h
@@ -298,6 +298,15 @@ int xmlValidateNameValue (const xmlChar *value);
int xmlValidateNamesValue (const xmlChar *value);
int xmlValidateNmtokenValue (const xmlChar *value);
int xmlValidateNmtokensValue(const xmlChar *value);
+
+#ifdef LIBXML_REGEXP_ENABLED
+/*
+ * Validation based on the regexp support
+ */
+int xmlValidBuildContentModel(xmlValidCtxtPtr ctxt,
+ xmlElementPtr elem);
+
+#endif /* LIBXML_REGEXP_ENABLED */
#ifdef __cplusplus
}
#endif
diff --git a/include/libxml/xmlautomata.h b/include/libxml/xmlautomata.h
index e32ff762..950d2907 100644
--- a/include/libxml/xmlautomata.h
+++ b/include/libxml/xmlautomata.h
@@ -14,8 +14,9 @@
#else
#include <libxml/xmlversion.h>
#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
+#include <libxml/tree.h>
+#ifdef LIBXML_AUTOMATA_ENABLED
#include <libxml/xmlregexp.h>
#ifdef __cplusplus
diff --git a/include/libxml/xmlregexp.h b/include/libxml/xmlregexp.h
index e4b9afe6..b66d4d95 100644
--- a/include/libxml/xmlregexp.h
+++ b/include/libxml/xmlregexp.h
@@ -16,7 +16,6 @@
#endif
#ifdef LIBXML_REGEXP_ENABLED
-#include <libxml/tree.h>
#ifdef __cplusplus
extern "C" {
@@ -39,6 +38,14 @@ typedef xmlRegexp *xmlRegexpPtr;
typedef struct _xmlRegExecCtxt xmlRegExecCtxt;
typedef xmlRegExecCtxt *xmlRegExecCtxtPtr;
+#ifdef __cplusplus
+}
+#endif
+#include <libxml/tree.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/*
* The POSIX like API
*/
diff --git a/testAutomata.c b/testAutomata.c
index 8e657863..77e29e59 100644
--- a/testAutomata.c
+++ b/testAutomata.c
@@ -10,6 +10,7 @@
#include "libxml.h"
#ifdef LIBXML_AUTOMATA_ENABLED
+#include <libxml/tree.h>
#include <libxml/xmlautomata.h>
static int scanNumber(char **ptr) {
diff --git a/valid.c b/valid.c
index 4578e144..adab5afc 100644
--- a/valid.c
+++ b/valid.c
@@ -366,7 +366,7 @@ xmlAttributePtr xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem);
*
* Generate the automata sequence needed for that type
*
- * Returns 0 if successful or -1 in case of error.
+ * Returns 1 if successful or 0 in case of error.
*/
static int
xmlValidBuildAContentModel(xmlElementContentPtr content,
@@ -375,13 +375,13 @@ xmlValidBuildAContentModel(xmlElementContentPtr content,
if (content == NULL) {
VERROR(ctxt->userData,
"Found unexpected type = NULL in %s content model\n", name);
- return(-1);
+ return(0);
}
switch (content->type) {
case XML_ELEMENT_CONTENT_PCDATA:
VERROR(ctxt->userData, "ContentModel found PCDATA for element %s\n",
name);
- return(-1);
+ return(0);
break;
case XML_ELEMENT_CONTENT_ELEMENT: {
xmlAutomataStatePtr oldstate = ctxt->state;
@@ -479,9 +479,9 @@ xmlValidBuildAContentModel(xmlElementContentPtr content,
default:
VERROR(ctxt->userData, "ContentModel broken for element %s\n",
name);
- return(-1);
+ return(0);
}
- return(0);
+ return(1);
}
/**
* xmlValidBuildContentModel:
@@ -491,31 +491,32 @@ xmlValidBuildAContentModel(xmlElementContentPtr content,
* (Re)Build the automata associated to the content model of this
* element
*
- * Returns 0 in case of success, -1 in case of error
+ * Returns 1 in case of success, 0 in case of error
*/
int
xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) {
xmlAutomataStatePtr start;
if ((ctxt == NULL) || (elem == NULL))
- return(-1);
+ return(0);
if (elem->type != XML_ELEMENT_DECL)
- return(-1);
- if (elem->etype != XML_ELEMENT_TYPE_ELEMENT)
return(0);
+ if (elem->etype != XML_ELEMENT_TYPE_ELEMENT)
+ return(1);
/* TODO: should we rebuild in this case ? */
if (elem->contModel != NULL)
- return(0);
+ return(1);
ctxt->am = xmlNewAutomata();
if (ctxt->am == NULL) {
VERROR(ctxt->userData, "Cannot create automata for element %s\n",
elem->name);
- return(-1);
+ return(0);
}
start = ctxt->state = xmlAutomataGetInitState(ctxt->am);
xmlValidBuildAContentModel(elem->content, ctxt, elem->name);
xmlAutomataSetFinalState(ctxt->am, ctxt->state);
+ elem->contModel = xmlAutomataCompile(ctxt->am);
if (!xmlAutomataIsDeterminist(ctxt->am)) {
VERROR(ctxt->userData, "Content model of %s is not determinist:\n",
elem->name);
@@ -524,7 +525,7 @@ xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) {
ctxt->state = NULL;
xmlFreeAutomata(ctxt->am);
ctxt->am = NULL;
- return(0);
+ return(1);
}
#endif /* LIBXML_REGEXP_ENABLED */
@@ -918,6 +919,10 @@ xmlFreeElement(xmlElementPtr elem) {
xmlFree((xmlChar *) elem->name);
if (elem->prefix != NULL)
xmlFree((xmlChar *) elem->prefix);
+#ifdef LIBXML_REGEXP_ENABLED
+ if (elem->contModel != NULL)
+ xmlRegFreeRegexp(elem->contModel);
+#endif
xmlFree(elem);
}
@@ -3513,6 +3518,11 @@ xmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
if (elem == NULL) return(1);
+#ifdef LIBXML_REGEXP_ENABLED
+ /* Build the regexp associated to the content model */
+ ret = xmlValidBuildContentModel(ctxt, elem);
+#endif
+
/* No Duplicate Types */
if (elem->etype == XML_ELEMENT_TYPE_MIXED) {
xmlElementContentPtr cur, next;
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 06150252..dc159a23 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -51,6 +51,8 @@ typedef enum {
XML_SCHEMAS_DATE,
XML_SCHEMAS_DATETIME,
XML_SCHEMAS_DURATION,
+ XML_SCHEMAS_FLOAT,
+ XML_SCHEMAS_DOUBLE,
XML_SCHEMAS_,
XML_SCHEMAS_XXX
} xmlSchemaValType;
@@ -100,6 +102,8 @@ struct _xmlSchemaVal {
xmlSchemaValDecimal decimal;
xmlSchemaValDate date;
xmlSchemaValDuration dur;
+ float f;
+ double d;
} value;
};
@@ -122,6 +126,8 @@ static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
static xmlSchemaTypePtr xmlSchemaTypeNmtoken = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
+static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
/*
* xmlSchemaInitBasicType:
@@ -176,6 +182,8 @@ xmlSchemaInitTypes(void) {
xmlSchemaTypeNonNegativeIntegerDef =
xmlSchemaInitBasicType("nonNegativeInteger");
xmlSchemaTypeNmtoken = xmlSchemaInitBasicType("NMTOKEN");
+ xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float");
+ xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double");
xmlSchemaTypesInitialized = 1;
}
@@ -1059,6 +1067,34 @@ xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
}
}
return(0);
+ } else if (type == xmlSchemaTypeFloatDef) {
+ const xmlChar *cur = value, *tmp;
+ int frac = 0, len, neg = 0;
+ unsigned long base = 0;
+ if (cur == NULL)
+ return(1);
+ if (*cur == '+')
+ cur++;
+ else if (*cur == '-') {
+ neg = 1;
+ cur++;
+ }
+ tmp = cur;
+ while ((*cur >= '0') && (*cur <= '9')) {
+ base = base * 10 + (*cur - '0');
+ cur++;
+ }
+ len = cur - tmp;
+ if (*cur == '.') {
+ cur++;
+ tmp = cur;
+ while ((*cur >= '0') && (*cur <= '9')) {
+ base = base * 10 + (*cur - '0');
+ cur++;
+ }
+ frac = cur - tmp;
+ }
+ } else if (type == xmlSchemaTypeDoubleDef) {
} else {
TODO
return(0);