diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | include/libxml/valid.h | 9 | ||||
-rw-r--r-- | include/libxml/xmlautomata.h | 3 | ||||
-rw-r--r-- | include/libxml/xmlregexp.h | 9 | ||||
-rw-r--r-- | testAutomata.c | 1 | ||||
-rw-r--r-- | valid.c | 34 | ||||
-rw-r--r-- | xmlschemastypes.c | 36 |
7 files changed, 86 insertions, 14 deletions
@@ -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) { @@ -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); |