a bit of work on Schemas try to make it more useful changed the Schemas

* xmlschemas.c xmlschemastypes.c include/libxml/xmlschemas.h:
  a bit of work on Schemas
* testSchemas.c: try to make it more useful
* test/schemas/* result/schemas/* Makefile.am: changed the
  Schemas regression test procedure, started adding a few samples
Daniel
diff --git a/ChangeLog b/ChangeLog
index 8d6a6bb..8953de0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Apr 17 11:03:03 CEST 2002 Daniel Veillard <daniel@veillard.com>
+
+	* xmlschemas.c xmlschemastypes.c include/libxml/xmlschemas.h:
+	  a bit of work on Schemas
+	* testSchemas.c: try to make it more useful
+	* test/schemas/* result/schemas/* Makefile.am: changed the
+	  Schemas regression test procedure, started adding a few samples
+
 Tue Apr 16 19:52:01 CEST 2002 Igor Zlatkovic <izlatkovic@stud.fh-frankfurt.de>
 
 	* include/libxml/encoding.h: Patch for the Borland C++ builder
diff --git a/Makefile.am b/Makefile.am
index 3d90f4d..add1dcd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -617,22 +617,29 @@
 	@echo "##"
 	@echo "## Schemas regression tests"
 	@echo "##"
-	-@(for i in $(srcdir)/test/schemas/*.xml ; do \
-	  name=`basename $$i .xml`; \
-	  if [ ! -f $(srcdir)/test/schemas/$$name.xsd ] ; then continue ; fi ; \
-	  schemas="$(srcdir)/test/schemas/$$name.xsd" ; \
-	  if [ ! -d $$i ] ; then \
-	  if [ ! -f $(srcdir)/result/schemas/$$name ] ; then \
-	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/testSchemas $$schemas $$i > $(srcdir)/result/schemas/$$name; \
-	  else \
-	      echo Testing $$name ; \
-	      $(CHECKER) $(top_builddir)/testSchemas $$schemas $$i > result.$$name ; \
-	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
-	      diff $(srcdir)/result/schemas/$$name result.$$name ; \
-	      rm result.$$name ; \
-	  fi ; fi ; done)
-
+	-@(for i in $(srcdir)/test/schemas/*_*.xsd ; do \
+	  name=`basename $$i | sed 's+_.*++'`; \
+	  sno=`basename $$i | sed 's+.*_\(.*\).xsd+\1+'`; \
+	  for j in $(srcdir)/test/schemas/"$$name"_*.xml ; do \
+	      xno=`basename $$j | sed 's+.*_\(.*\).xml+\1+'`; \
+	      if [ ! -f $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno" ]; \
+	      then \
+		  echo New test file "$$name"_"$$xno" ; \
+		  $(CHECKER) $(top_builddir)/testSchemas $$i $$j \
+		    > $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno" \
+		    2> $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err; \
+	      else \
+		  echo Testing "$$name"_"$$xno" ; \
+	          $(CHECKER) $(top_builddir)/testSchemas $$i $$j \
+		    > res.$$name 2> err.$$name;\
+	          grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	          diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno" \
+		       res.$$name;\
+	          diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err \
+		       err.$$name;\
+	          rm res.$$name err.$$name ; \
+	       fi ; \
+	  done; done)
 
 dist-hook: libxml.spec
 	-cp libxml.spec $(distdir)
@@ -659,7 +666,7 @@
 	     $(man_MANS) libxml-2.0.pc.in \
 	     trionan.c trionan.h triostr.c triostr.h trio.c trio.h \
 	     triop.h triodef.h libxml.h \
-	     testThreadsWin32.c genUnicode.py
+	     testThreadsWin32.c genUnicode.py TODO_SCHEMAS
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libxml-2.0.pc
diff --git a/include/libxml/xmlschemas.h b/include/libxml/xmlschemas.h
index 58bf645..c0ca733 100644
--- a/include/libxml/xmlschemas.h
+++ b/include/libxml/xmlschemas.h
@@ -35,6 +35,7 @@
     XML_SCHEMAS_ERR_NOROLLBACK,
     XML_SCHEMAS_ERR_ISABSTRACT,
     XML_SCHEMAS_ERR_NOTEMPTY,
+    XML_SCHEMAS_ERR_ELEMCONT,
     XML_SCHEMAS_ERR_HAVEDEFAULT,
     XML_SCHEMAS_ERR_NOTNILLABLE,
     XML_SCHEMAS_ERR_EXTRACONTENT,
diff --git a/result/schemas/choice_0_0 b/result/schemas/choice_0_0
new file mode 100644
index 0000000..eda062e
--- /dev/null
+++ b/result/schemas/choice_0_0
@@ -0,0 +1 @@
+./test/schemas/choice_0.xml validates
diff --git a/result/schemas/choice_0_0.err b/result/schemas/choice_0_0.err
new file mode 100644
index 0000000..f655977
--- /dev/null
+++ b/result/schemas/choice_0_0.err
@@ -0,0 +1,24 @@
+Type of choice 3 : ./test/schemas/choice_0.xsd:6 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/choice_0.xsd:4 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Building content model for doc
+Content model of doc:
+ regexp: '(null)' 
+2 atoms:
+ 00  atom: string once 'a' 
+ 01  atom: string once 'b' 
+4 states:
+ state: 0, 2 transitions:
+  trans: atom 0, to 2
+  trans: atom 1, to 3
+ state: FINAL 1, 0 transitions:
+ state: FINAL 2, 1 transitions:
+  trans: removed
+ state: FINAL 3, 1 transitions:
+  trans: removed
+0 counters:
+Building content model for a
+Building content model for b
+xmlSchemaValidateCallback: a, a, a
+Element doc content check succeeded
diff --git a/result/schemas/choice_0_1 b/result/schemas/choice_0_1
new file mode 100644
index 0000000..e4338de
--- /dev/null
+++ b/result/schemas/choice_0_1
@@ -0,0 +1 @@
+./test/schemas/choice_1.xml validates
diff --git a/result/schemas/choice_0_1.err b/result/schemas/choice_0_1.err
new file mode 100644
index 0000000..63681ab
--- /dev/null
+++ b/result/schemas/choice_0_1.err
@@ -0,0 +1,24 @@
+Type of choice 3 : ./test/schemas/choice_0.xsd:6 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/choice_0.xsd:4 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Building content model for doc
+Content model of doc:
+ regexp: '(null)' 
+2 atoms:
+ 00  atom: string once 'a' 
+ 01  atom: string once 'b' 
+4 states:
+ state: 0, 2 transitions:
+  trans: atom 0, to 2
+  trans: atom 1, to 3
+ state: FINAL 1, 0 transitions:
+ state: FINAL 2, 1 transitions:
+  trans: removed
+ state: FINAL 3, 1 transitions:
+  trans: removed
+0 counters:
+Building content model for a
+Building content model for b
+xmlSchemaValidateCallback: b, b, b
+Element doc content check succeeded
diff --git a/result/schemas/choice_0_2 b/result/schemas/choice_0_2
new file mode 100644
index 0000000..4071315
--- /dev/null
+++ b/result/schemas/choice_0_2
@@ -0,0 +1 @@
+./test/schemas/choice_2.xml fails to validate
diff --git a/result/schemas/choice_0_2.err b/result/schemas/choice_0_2.err
new file mode 100644
index 0000000..a4025c9
--- /dev/null
+++ b/result/schemas/choice_0_2.err
@@ -0,0 +1,24 @@
+Type of choice 3 : ./test/schemas/choice_0.xsd:6 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/choice_0.xsd:4 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Building content model for doc
+Content model of doc:
+ regexp: '(null)' 
+2 atoms:
+ 00  atom: string once 'a' 
+ 01  atom: string once 'b' 
+4 states:
+ state: 0, 2 transitions:
+  trans: atom 0, to 2
+  trans: atom 1, to 3
+ state: FINAL 1, 0 transitions:
+ state: FINAL 2, 1 transitions:
+  trans: removed
+ state: FINAL 3, 1 transitions:
+  trans: removed
+0 counters:
+Building content model for a
+Building content model for b
+xmlSchemaValidateCallback: a, a, a
+Element doc content check failed
diff --git a/result/schemas/choice_0_3 b/result/schemas/choice_0_3
new file mode 100644
index 0000000..bef604b
--- /dev/null
+++ b/result/schemas/choice_0_3
@@ -0,0 +1 @@
+./test/schemas/choice_3.xml fails to validate
diff --git a/result/schemas/choice_0_3.err b/result/schemas/choice_0_3.err
new file mode 100644
index 0000000..a4025c9
--- /dev/null
+++ b/result/schemas/choice_0_3.err
@@ -0,0 +1,24 @@
+Type of choice 3 : ./test/schemas/choice_0.xsd:6 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/choice_0.xsd:4 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Building content model for doc
+Content model of doc:
+ regexp: '(null)' 
+2 atoms:
+ 00  atom: string once 'a' 
+ 01  atom: string once 'b' 
+4 states:
+ state: 0, 2 transitions:
+  trans: atom 0, to 2
+  trans: atom 1, to 3
+ state: FINAL 1, 0 transitions:
+ state: FINAL 2, 1 transitions:
+  trans: removed
+ state: FINAL 3, 1 transitions:
+  trans: removed
+0 counters:
+Building content model for a
+Building content model for b
+xmlSchemaValidateCallback: a, a, a
+Element doc content check failed
diff --git a/result/schemas/choice_0_4 b/result/schemas/choice_0_4
new file mode 100644
index 0000000..0643e3b
--- /dev/null
+++ b/result/schemas/choice_0_4
@@ -0,0 +1 @@
+./test/schemas/choice_4.xml fails to validate
diff --git a/result/schemas/choice_0_4.err b/result/schemas/choice_0_4.err
new file mode 100644
index 0000000..87ec6fb
--- /dev/null
+++ b/result/schemas/choice_0_4.err
@@ -0,0 +1,23 @@
+Type of choice 3 : ./test/schemas/choice_0.xsd:6 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/choice_0.xsd:4 :elements
+Type of sequence 2 : ./test/schemas/choice_0.xsd:5 :elements
+Building content model for doc
+Content model of doc:
+ regexp: '(null)' 
+2 atoms:
+ 00  atom: string once 'a' 
+ 01  atom: string once 'b' 
+4 states:
+ state: 0, 2 transitions:
+  trans: atom 0, to 2
+  trans: atom 1, to 3
+ state: FINAL 1, 0 transitions:
+ state: FINAL 2, 1 transitions:
+  trans: removed
+ state: FINAL 3, 1 transitions:
+  trans: removed
+0 counters:
+Building content model for a
+Building content model for b
+Element doc content check failed
diff --git a/result/schemas/po b/result/schemas/po
deleted file mode 100644
index e69de29..0000000
--- a/result/schemas/po
+++ /dev/null
diff --git a/result/schemas/po0_0_0 b/result/schemas/po0_0_0
new file mode 100644
index 0000000..9687b9d
--- /dev/null
+++ b/result/schemas/po0_0_0
@@ -0,0 +1 @@
+./test/schemas/po0_0.xml validates
diff --git a/result/schemas/po0_0_0.err b/result/schemas/po0_0_0.err
new file mode 100644
index 0000000..1707aba
--- /dev/null
+++ b/result/schemas/po0_0_0.err
@@ -0,0 +1,161 @@
+Type of sequence 3 : ./test/schemas/po0_0.xsd:21 :elements
+Type of sequence 4 : ./test/schemas/po0_0.xsd:31 :elements
+Type of sequence 6 : ./test/schemas/po0_0.xsd:34 :elements
+Type of anontype5 : ./test/schemas/po0_0.xsd:33 :elements
+Type of sequence 1 : ./test/schemas/po0_0.xsd:12 :elements
+Type of PurchaseOrderType : ./test/schemas/po0_0.xsd:11 :elements
+Type of sequence 6 : ./test/schemas/po0_0.xsd:34 :elements
+Type of SKU : ./test/schemas/po0_0.xsd:53 :simple
+Type of sequence 4 : ./test/schemas/po0_0.xsd:31 :elements
+Type of Items : ./test/schemas/po0_0.xsd:30 :elements
+Type of restriction 8 : ./test/schemas/po0_0.xsd:38 :empty
+Type of simpletype7 : ./test/schemas/po0_0.xsd:37 :simple
+Type of restriction 10 : ./test/schemas/po0_0.xsd:54 :empty
+Type of sequence 1 : ./test/schemas/po0_0.xsd:12 :elements
+Type of sequence 3 : ./test/schemas/po0_0.xsd:21 :elements
+Type of USAddress : ./test/schemas/po0_0.xsd:20 :elements
+Building content model for anonelem2
+Building content model for street
+Building content model for state
+Building content model for shipTo
+Content model of shipTo:
+ regexp: '(null)' 
+5 atoms:
+ 00  atom: string once 'name' 
+ 01  atom: string once 'street' 
+ 02  atom: string once 'city' 
+ 03  atom: string once 'state' 
+ 04  atom: string once 'zip' 
+6 states:
+ state: 0, 1 transitions:
+  trans: atom 0, to 1
+ state: 1, 1 transitions:
+  trans: atom 1, to 2
+ state: 2, 1 transitions:
+  trans: atom 2, to 3
+ state: 3, 1 transitions:
+  trans: atom 3, to 4
+ state: 4, 1 transitions:
+  trans: atom 4, to 5
+ state: FINAL 5, 0 transitions:
+0 counters:
+Building content model for comment
+Building content model for name
+Building content model for item
+Content model of item:
+ regexp: '(null)' 
+5 atoms:
+ 00  atom: string once 'productName' 
+ 01  atom: string once 'quantity' 
+ 02  atom: string once 'USPrice' 
+ 03  atom: string once 'comment' 
+ 04  atom: string once 'shipDate' 
+6 states:
+ state: 0, 1 transitions:
+  trans: atom 0, to 1
+ state: 1, 1 transitions:
+  trans: atom 1, to 2
+ state: 2, 1 transitions:
+  trans: atom 2, to 3
+ state: FINAL 3, 3 transitions:
+  trans: atom 3, to 4
+  trans: removed
+  trans: atom 4, to 5
+ state: FINAL 4, 2 transitions:
+  trans: atom 4, to 5
+  trans: removed
+ state: FINAL 5, 0 transitions:
+0 counters:
+Building content model for productName
+Building content model for anonelem9
+Building content model for quantity
+Building content model for purchaseOrder
+Content model of purchaseOrder:
+ regexp: '(null)' 
+4 atoms:
+ 00  atom: string once 'shipTo' 
+ 01  atom: string once 'billTo' 
+ 02  atom: string once 'comment' 
+ 03  atom: string once 'items' 
+5 states:
+ state: 0, 1 transitions:
+  trans: atom 0, to 1
+ state: 1, 1 transitions:
+  trans: atom 1, to 2
+ state: 2, 3 transitions:
+  trans: atom 2, to 3
+  trans: removed
+  trans: atom 3, to 4
+ state: 3, 1 transitions:
+  trans: atom 3, to 4
+ state: FINAL 4, 0 transitions:
+0 counters:
+Building content model for billTo
+Content model of billTo:
+ regexp: '(null)' 
+5 atoms:
+ 00  atom: string once 'name' 
+ 01  atom: string once 'street' 
+ 02  atom: string once 'city' 
+ 03  atom: string once 'state' 
+ 04  atom: string once 'zip' 
+6 states:
+ state: 0, 1 transitions:
+  trans: atom 0, to 1
+ state: 1, 1 transitions:
+  trans: atom 1, to 2
+ state: 2, 1 transitions:
+  trans: atom 2, to 3
+ state: 3, 1 transitions:
+  trans: atom 3, to 4
+ state: 4, 1 transitions:
+  trans: atom 4, to 5
+ state: FINAL 5, 0 transitions:
+0 counters:
+Building content model for zip
+Building content model for USPrice
+Building content model for items
+Content model of items:
+ regexp: '(null)' 
+1 atoms:
+ 00  atom: string once 'item' 
+2 states:
+ state: FINAL 0, 2 transitions:
+  trans: atom 0, to 1
+  trans: removed
+ state: FINAL 1, 2 transitions:
+  trans: removed
+  trans: atom 0, to 1
+0 counters:
+Building content model for city
+Building content model for shipDate
+xmlSchemaValidateCallback: shipTo, shipTo, shipTo
+xmlSchemaValidateCallback: name, name, name
+xmlSchemaValidateCallback: street, street, street
+xmlSchemaValidateCallback: city, city, city
+xmlSchemaValidateCallback: state, state, state
+xmlSchemaValidateCallback: zip, zip, zip
+Element shipTo content check succeeded
+xmlSchemaValidateCallback: billTo, billTo, billTo
+xmlSchemaValidateCallback: name, name, name
+xmlSchemaValidateCallback: street, street, street
+xmlSchemaValidateCallback: city, city, city
+xmlSchemaValidateCallback: state, state, state
+xmlSchemaValidateCallback: zip, zip, zip
+Element billTo content check succeeded
+xmlSchemaValidateCallback: comment, comment, comment
+xmlSchemaValidateCallback: items, items, items
+xmlSchemaValidateCallback: item, item, item
+xmlSchemaValidateCallback: productName, productName, productName
+xmlSchemaValidateCallback: quantity, quantity, quantity
+xmlSchemaValidateCallback: USPrice, USPrice, USPrice
+xmlSchemaValidateCallback: comment, comment, comment
+Element item content check succeeded
+xmlSchemaValidateCallback: item, item, item
+xmlSchemaValidateCallback: productName, productName, productName
+xmlSchemaValidateCallback: quantity, quantity, quantity
+xmlSchemaValidateCallback: USPrice, USPrice, USPrice
+xmlSchemaValidateCallback: shipDate, shipDate, shipDate
+Element item content check succeeded
+Element items content check succeeded
+Element purchaseOrder content check succeeded
diff --git a/test/schemas/choice_0.xml b/test/schemas/choice_0.xml
new file mode 100644
index 0000000..677b039
--- /dev/null
+++ b/test/schemas/choice_0.xml
@@ -0,0 +1,3 @@
+<doc>
+<a/>
+</doc>
diff --git a/test/schemas/choice_0.xsd b/test/schemas/choice_0.xsd
new file mode 100644
index 0000000..7f690f4
--- /dev/null
+++ b/test/schemas/choice_0.xsd
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="doc">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice minOccurs="1" maxOccurs="unbounded">
+          <xs:element name="a"/>
+          <xs:element name="b"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/test/schemas/choice_1.xml b/test/schemas/choice_1.xml
new file mode 100644
index 0000000..d5c0dd1
--- /dev/null
+++ b/test/schemas/choice_1.xml
@@ -0,0 +1,3 @@
+<doc>
+<b/>
+</doc>
diff --git a/test/schemas/choice_2.xml b/test/schemas/choice_2.xml
new file mode 100644
index 0000000..7b27f17
--- /dev/null
+++ b/test/schemas/choice_2.xml
@@ -0,0 +1,4 @@
+<doc>
+<a/>
+<b/>
+</doc>
diff --git a/test/schemas/choice_3.xml b/test/schemas/choice_3.xml
new file mode 100644
index 0000000..0358109
--- /dev/null
+++ b/test/schemas/choice_3.xml
@@ -0,0 +1,4 @@
+<doc>
+<a/>
+<a/>
+</doc>
diff --git a/test/schemas/choice_4.xml b/test/schemas/choice_4.xml
new file mode 100644
index 0000000..636923c
--- /dev/null
+++ b/test/schemas/choice_4.xml
@@ -0,0 +1,2 @@
+<doc>
+</doc>
diff --git a/test/schemas/po.xml b/test/schemas/po0_0.xml
similarity index 100%
rename from test/schemas/po.xml
rename to test/schemas/po0_0.xml
diff --git a/test/schemas/po.xsd b/test/schemas/po0_0.xsd
similarity index 100%
rename from test/schemas/po.xsd
rename to test/schemas/po0_0.xsd
diff --git a/testSchemas.c b/testSchemas.c
index 3168167..40c0c8b 100644
--- a/testSchemas.c
+++ b/testSchemas.c
@@ -88,6 +88,14 @@
 			    (xmlSchemaValidityWarningFunc) fprintf,
 			    stderr);
 		    ret = xmlSchemaValidateDoc(ctxt, doc);
+		    if (ret == 0) {
+			printf("%s validates\n", argv[i]);
+		    } else if (ret > 0) {
+			printf("%s fails to validate\n", argv[i]);
+		    } else {
+			printf("%s validation generated an internal error\n",
+			       argv[i]);
+		    }
 		    xmlSchemaFreeValidCtxt(ctxt);
 		    xmlFreeDoc(doc);
 		}
diff --git a/xmlschemas.c b/xmlschemas.c
index f211095..4ccc1f1 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -24,8 +24,9 @@
 #include <libxml/xmlautomata.h>
 #include <libxml/xmlregexp.h>
 
-#define DEBUG 1                 /* very verobose output */
-/* #define DEBUG_CONTENT 1 */
+#define DEBUG 1                 /* very verbose output */
+#define DEBUG_CONTENT 1
+#define DEBUG_TYPE 1
 /* #define DEBUG_AUTOMATA 1 */
 
 #define UNBOUNDED (1 << 30)
@@ -3058,8 +3059,9 @@
     xmlAutomataSetFinalState(ctxt->am, ctxt->state);
     elem->contModel = xmlAutomataCompile(ctxt->am);
 #ifdef DEBUG_CONTENT
-    printf("Content model of %s:\n", name);
-    xmlRegexpPrint(stdout, elem->contModel);
+    xmlGenericError(xmlGenericErrorContext,
+                    "Content model of %s:\n", name);
+    xmlRegexpPrint(stderr, elem->contModel);
 #endif
     ctxt->state = NULL;
     xmlFreeAutomata(ctxt->am);
@@ -3205,6 +3207,7 @@
 		if (typeDecl->subtypes != NULL)
 		    xmlSchemaTypeFixup(typeDecl->subtypes, ctxt, NULL);
 
+		explicitContentType = XML_SCHEMA_CONTENT_ELEMENTS;
 		if (typeDecl->subtypes == NULL)
 		    /* 1.1.1 */
 		    explicitContentType = XML_SCHEMA_CONTENT_EMPTY;
@@ -3299,6 +3302,37 @@
 		break;
 	}
     } 
+#ifdef DEBUG_TYPE
+    xmlGenericError(xmlGenericErrorContext,
+	    "Type of %s : %s:%d :", name, typeDecl->node->doc->URL,
+	            xmlGetLineNo(typeDecl->node));
+    switch (typeDecl->contentType) {
+	case XML_SCHEMA_CONTENT_SIMPLE:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "simple\n"); break;
+	case XML_SCHEMA_CONTENT_ELEMENTS:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "elements\n"); break;
+        case XML_SCHEMA_CONTENT_UNKNOWN:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "unknown !!!\n"); break;
+        case XML_SCHEMA_CONTENT_EMPTY:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "empty\n"); break;
+        case XML_SCHEMA_CONTENT_MIXED:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "mixed\n"); break;
+        case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "mixed or elems\n"); break;
+        case XML_SCHEMA_CONTENT_BASIC:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "basic\n"); break;
+	default:
+	    xmlGenericError(xmlGenericErrorContext,
+		    "not registered !!!\n"); break;
+    }
+#endif
 }
 
 /**
@@ -3970,8 +4004,9 @@
     xmlSchemaTypePtr oldtype = ctxt->type;
     xmlNodePtr oldnode = ctxt->node;
 #ifdef DEBUG_CONTENT
-    printf("xmlSchemaValidateCallback: %s, %s, %s\n",
-	   name, type->name, node->name);
+    xmlGenericError(xmlGenericErrorContext,
+                    "xmlSchemaValidateCallback: %s, %s, %s\n",
+		    name, type->name, node->name);
 #endif
     ctxt->type = type;
     ctxt->node = node;
@@ -4195,10 +4230,12 @@
 		"====> %s : %d\n", node->name, ret);
 #endif
 	if (ret == 0) {
+	    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->err = XML_SCHEMAS_ERR_ELEMCONT;
 	    if (ctxt->error != NULL)
 		ctxt->error(ctxt->userData, "Element %s content check failure\n",
 			    node->name);
@@ -4335,7 +4372,7 @@
 static int
 xmlSchemaValidateComplexType(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr node) {
     xmlNodePtr child;
-    xmlSchemaTypePtr type, subtype, model;
+    xmlSchemaTypePtr type, subtype;
     int ret;
 
     child = ctxt->node;
@@ -4360,7 +4397,6 @@
 	     */
 	    child = xmlSchemaSkipIgnored(ctxt, type, child);
 	    subtype = type->subtypes;
-	    ctxt->type = model;
 	    while (child != NULL) {
 		if (child->type == XML_ELEMENT_NODE) {
 		    ret = xmlRegExecPushString(ctxt->regexp,
@@ -4735,10 +4771,12 @@
 	    "====> %s : %d\n", elem->name, ret);
 #endif
     if (ret == 0) {
+	ctxt->err = XML_SCHEMAS_ERR_ELEMCONT;
         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;
         if (ctxt->error != NULL)
             ctxt->error(ctxt->userData, "Element %s content check failed\n",
                         elem->name);
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 4c8d420..002cc7b 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -481,6 +481,9 @@
 		return(0);
 	    TODO /* error code */
 	    return(1);
+	case XML_SCHEMA_FACET_WHITESPACE:
+	    TODO /* whitespaces */
+	    return(0);
 	default:
 	    TODO
     }