incomplete steps for real/double support avoiding a compilation problem

* 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
Daniel
diff --git a/ChangeLog b/ChangeLog
index 683ab2d..84744dd 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 3d2f508..5535dd9 100644
--- a/include/libxml/valid.h
+++ b/include/libxml/valid.h
@@ -298,6 +298,15 @@
 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 e32ff76..950d290 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 e4b9afe..b66d4d9 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 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 8e65786..77e29e5 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 4578e14..adab5af 100644
--- a/valid.c
+++ b/valid.c
@@ -366,7 +366,7 @@
  *
  * 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 @@
     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 @@
 	default:
 	    VERROR(ctxt->userData, "ContentModel broken for element %s\n",
 		   name);
-	    return(-1);
+	    return(0);
     }
-    return(0);
+    return(1);
 }
 /**
  * xmlValidBuildContentModel:
@@ -491,31 +491,32 @@
  * (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);
-    if (elem->type != XML_ELEMENT_DECL)
-	return(-1);
-    if (elem->etype != XML_ELEMENT_TYPE_ELEMENT)
 	return(0);
+    if (elem->type != XML_ELEMENT_DECL)
+	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 @@
     ctxt->state = NULL;
     xmlFreeAutomata(ctxt->am);
     ctxt->am = NULL;
-    return(0);
+    return(1);
 }
 
 #endif /* LIBXML_REGEXP_ENABLED */
@@ -918,6 +919,10 @@
 	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 @@
     
     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 0615025..dc159a2 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -51,6 +51,8 @@
     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 @@
 	xmlSchemaValDecimal     decimal;
         xmlSchemaValDate        date;
         xmlSchemaValDuration    dur;
+	float			f;
+	double			d;
     } value;
 };
 
@@ -122,6 +126,8 @@
 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 @@
     xmlSchemaTypeNonNegativeIntegerDef =
 	xmlSchemaInitBasicType("nonNegativeInteger");
     xmlSchemaTypeNmtoken = xmlSchemaInitBasicType("NMTOKEN");
+    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float");
+    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double");
 
     xmlSchemaTypesInitialized = 1;
 }
@@ -1059,6 +1067,34 @@
 	    }
 	}
 	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);