implementing xs:all with minOccurs = 0 added more tests covering xs:all

* xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h:
  implementing xs:all with minOccurs = 0
* tes/schemas/* result/schemas/*: added more tests covering
  xs:all
Daniel
diff --git a/ChangeLog b/ChangeLog
index c5d1213..77e4a33 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sat Apr 20 19:36:39 CEST 2002 Daniel Veillard <daniel@veillard.com>
+
+	* xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h:
+	  implementing xs:all with minOccurs = 0
+	* tes/schemas/* result/schemas/*: added more tests covering
+	  xs:all
+
 Sat Apr 20 09:22:50 CEST 2002 Daniel Veillard <daniel@veillard.com>
 
 	* xmlregexp.c: first implementation of the all particle, this
diff --git a/include/libxml/xmlautomata.h b/include/libxml/xmlautomata.h
index c7d5b05..85b91e6 100644
--- a/include/libxml/xmlautomata.h
+++ b/include/libxml/xmlautomata.h
@@ -69,7 +69,8 @@
 						 void *data);
 xmlAutomataStatePtr	xmlAutomataNewAllTrans	(xmlAutomataPtr am,
 						 xmlAutomataStatePtr from,
-						 xmlAutomataStatePtr to);
+						 xmlAutomataStatePtr to,
+						 int lax);
 xmlAutomataStatePtr	xmlAutomataNewEpsilon	(xmlAutomataPtr am,
 						 xmlAutomataStatePtr from,
 						 xmlAutomataStatePtr to);
diff --git a/result/schemas/all_0_0 b/result/schemas/all_0_0
new file mode 100644
index 0000000..08eb108
--- /dev/null
+++ b/result/schemas/all_0_0
@@ -0,0 +1 @@
+./test/schemas/all_0.xml validates
diff --git a/result/schemas/all_0_0.err b/result/schemas/all_0_0.err
new file mode 100644
index 0000000..316c100
--- /dev/null
+++ b/result/schemas/all_0_0.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: c, c, c
+Element doc content check succeeded
diff --git a/result/schemas/all_0_1 b/result/schemas/all_0_1
new file mode 100644
index 0000000..eaf4a1a
--- /dev/null
+++ b/result/schemas/all_0_1
@@ -0,0 +1 @@
+./test/schemas/all_1.xml validates
diff --git a/result/schemas/all_0_1.err b/result/schemas/all_0_1.err
new file mode 100644
index 0000000..ebae3aa
--- /dev/null
+++ b/result/schemas/all_0_1.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: c, c, c
+xmlSchemaValidateCallback: a, a, a
+Element doc content check succeeded
diff --git a/result/schemas/all_0_2 b/result/schemas/all_0_2
new file mode 100644
index 0000000..62af901
--- /dev/null
+++ b/result/schemas/all_0_2
@@ -0,0 +1 @@
+./test/schemas/all_2.xml validates
diff --git a/result/schemas/all_0_2.err b/result/schemas/all_0_2.err
new file mode 100644
index 0000000..0a6d139
--- /dev/null
+++ b/result/schemas/all_0_2.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: c, c, c
+Element doc content check succeeded
diff --git a/result/schemas/all_0_3 b/result/schemas/all_0_3
new file mode 100644
index 0000000..55a2a4d
--- /dev/null
+++ b/result/schemas/all_0_3
@@ -0,0 +1 @@
+./test/schemas/all_3.xml fails to validate
diff --git a/result/schemas/all_0_3.err b/result/schemas/all_0_3.err
new file mode 100644
index 0000000..b9bd80c
--- /dev/null
+++ b/result/schemas/all_0_3.err
@@ -0,0 +1,25 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+Element doc content check failed
diff --git a/result/schemas/all_0_4 b/result/schemas/all_0_4
new file mode 100644
index 0000000..cdd8824
--- /dev/null
+++ b/result/schemas/all_0_4
@@ -0,0 +1 @@
+./test/schemas/all_4.xml fails to validate
diff --git a/result/schemas/all_0_4.err b/result/schemas/all_0_4.err
new file mode 100644
index 0000000..aabc867
--- /dev/null
+++ b/result/schemas/all_0_4.err
@@ -0,0 +1,23 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+Element doc content check failed
diff --git a/result/schemas/all_0_5 b/result/schemas/all_0_5
new file mode 100644
index 0000000..f939f65
--- /dev/null
+++ b/result/schemas/all_0_5
@@ -0,0 +1 @@
+./test/schemas/all_5.xml fails to validate
diff --git a/result/schemas/all_0_5.err b/result/schemas/all_0_5.err
new file mode 100644
index 0000000..b9bd80c
--- /dev/null
+++ b/result/schemas/all_0_5.err
@@ -0,0 +1,25 @@
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of all2 : ./test/schemas/all_0.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_0.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: all transition, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+Element doc content check failed
diff --git a/result/schemas/all_1_0 b/result/schemas/all_1_0
new file mode 100644
index 0000000..08eb108
--- /dev/null
+++ b/result/schemas/all_1_0
@@ -0,0 +1 @@
+./test/schemas/all_0.xml validates
diff --git a/result/schemas/all_1_0.err b/result/schemas/all_1_0.err
new file mode 100644
index 0000000..b954c8e
--- /dev/null
+++ b/result/schemas/all_1_0.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: c, c, c
+Element doc content check succeeded
diff --git a/result/schemas/all_1_1 b/result/schemas/all_1_1
new file mode 100644
index 0000000..eaf4a1a
--- /dev/null
+++ b/result/schemas/all_1_1
@@ -0,0 +1 @@
+./test/schemas/all_1.xml validates
diff --git a/result/schemas/all_1_1.err b/result/schemas/all_1_1.err
new file mode 100644
index 0000000..c9fb79d
--- /dev/null
+++ b/result/schemas/all_1_1.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: c, c, c
+xmlSchemaValidateCallback: a, a, a
+Element doc content check succeeded
diff --git a/result/schemas/all_1_2 b/result/schemas/all_1_2
new file mode 100644
index 0000000..62af901
--- /dev/null
+++ b/result/schemas/all_1_2
@@ -0,0 +1 @@
+./test/schemas/all_2.xml validates
diff --git a/result/schemas/all_1_2.err b/result/schemas/all_1_2.err
new file mode 100644
index 0000000..5548cfe
--- /dev/null
+++ b/result/schemas/all_1_2.err
@@ -0,0 +1,26 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: b, b, b
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: c, c, c
+Element doc content check succeeded
diff --git a/result/schemas/all_1_3 b/result/schemas/all_1_3
new file mode 100644
index 0000000..8186e82
--- /dev/null
+++ b/result/schemas/all_1_3
@@ -0,0 +1 @@
+./test/schemas/all_3.xml validates
diff --git a/result/schemas/all_1_3.err b/result/schemas/all_1_3.err
new file mode 100644
index 0000000..3b3cb98
--- /dev/null
+++ b/result/schemas/all_1_3.err
@@ -0,0 +1,25 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+Element doc content check succeeded
diff --git a/result/schemas/all_1_4 b/result/schemas/all_1_4
new file mode 100644
index 0000000..2eb22ae
--- /dev/null
+++ b/result/schemas/all_1_4
@@ -0,0 +1 @@
+./test/schemas/all_4.xml validates
diff --git a/result/schemas/all_1_4.err b/result/schemas/all_1_4.err
new file mode 100644
index 0000000..fb46a92
--- /dev/null
+++ b/result/schemas/all_1_4.err
@@ -0,0 +1,23 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+Element doc content check succeeded
diff --git a/result/schemas/all_1_5 b/result/schemas/all_1_5
new file mode 100644
index 0000000..f939f65
--- /dev/null
+++ b/result/schemas/all_1_5
@@ -0,0 +1 @@
+./test/schemas/all_5.xml fails to validate
diff --git a/result/schemas/all_1_5.err b/result/schemas/all_1_5.err
new file mode 100644
index 0000000..7b79b64
--- /dev/null
+++ b/result/schemas/all_1_5.err
@@ -0,0 +1,25 @@
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of all2 : ./test/schemas/all_1.xsd:5 :elements
+Type of anontype1 : ./test/schemas/all_1.xsd:4 :elements
+Building content model for doc
+Unimplemented block at xmlschemas.c:3062
+Content model of doc:
+ regexp: '(null)' 
+3 atoms:
+ 00  atom: string onceonly 'a' 
+ 01  atom: string onceonly 'b' 
+ 02  atom: string onceonly 'c' 
+2 states:
+ state: 0, 4 transitions:
+  trans: counted 0, atom 0, to 0
+  trans: counted 1, atom 1, to 0
+  trans: counted 2, atom 2, to 0
+  trans: count based 1193047, epsilon to 1
+ state: FINAL 1, 0 transitions:
+3 counters:
+ 0: min 1 max 1
+ 1: min 1 max 1
+ 2: min 1 max 1
+xmlSchemaValidateCallback: a, a, a
+xmlSchemaValidateCallback: b, b, b
+Element doc content check failed
diff --git a/result/schemas/choice_2_6.err b/result/schemas/choice_2_6.err
index 2943d07..b3c5b53 100644
--- a/result/schemas/choice_2_6.err
+++ b/result/schemas/choice_2_6.err
@@ -38,15 +38,7 @@
 xmlSchemaValidateCallback: b, b, b
 xmlSchemaValidateCallback: a, a, a
 xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
 xmlSchemaValidateCallback: b, b, b
 xmlSchemaValidateCallback: a, a, a
 xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
-xmlSchemaValidateCallback: a, a, a
 Element doc content check failed
diff --git a/test/schemas/all_0.xml b/test/schemas/all_0.xml
new file mode 100644
index 0000000..fb5b0fa
--- /dev/null
+++ b/test/schemas/all_0.xml
@@ -0,0 +1 @@
+<doc><a/><b/><c/></doc>
diff --git a/test/schemas/all_0.xsd b/test/schemas/all_0.xsd
new file mode 100644
index 0000000..55c04ee
--- /dev/null
+++ b/test/schemas/all_0.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doc">
+    <xsd:complexType>
+      <xsd:all minOccurs="1">
+        <xsd:element name="a"/>
+        <xsd:element name="b"/>
+        <xsd:element name="c"/>
+      </xsd:all>
+    </xsd:complexType>
+  </xsd:element>
+</xsd:schema>
diff --git a/test/schemas/all_1.xml b/test/schemas/all_1.xml
new file mode 100644
index 0000000..41d797e
--- /dev/null
+++ b/test/schemas/all_1.xml
@@ -0,0 +1,2 @@
+<doc><b/><c/><a/></doc>
+
diff --git a/test/schemas/all_1.xsd b/test/schemas/all_1.xsd
new file mode 100644
index 0000000..bc386f3
--- /dev/null
+++ b/test/schemas/all_1.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:element name="doc">
+    <xsd:complexType>
+      <xsd:all minOccurs="0">
+        <xsd:element name="a"/>
+        <xsd:element name="b"/>
+        <xsd:element name="c"/>
+      </xsd:all>
+    </xsd:complexType>
+  </xsd:element>
+</xsd:schema>
diff --git a/test/schemas/all_2.xml b/test/schemas/all_2.xml
new file mode 100644
index 0000000..cc1580b
--- /dev/null
+++ b/test/schemas/all_2.xml
@@ -0,0 +1 @@
+<doc><b/><a/><c/></doc>
diff --git a/test/schemas/all_3.xml b/test/schemas/all_3.xml
new file mode 100644
index 0000000..c011b3f
--- /dev/null
+++ b/test/schemas/all_3.xml
@@ -0,0 +1 @@
+<doc><a/><b/></doc>
diff --git a/test/schemas/all_4.xml b/test/schemas/all_4.xml
new file mode 100644
index 0000000..afa807c
--- /dev/null
+++ b/test/schemas/all_4.xml
@@ -0,0 +1 @@
+<doc></doc>
diff --git a/test/schemas/all_5.xml b/test/schemas/all_5.xml
new file mode 100644
index 0000000..d68f321
--- /dev/null
+++ b/test/schemas/all_5.xml
@@ -0,0 +1 @@
+<doc><a/><b/><a/></doc>
diff --git a/xmlregexp.c b/xmlregexp.c
index c4a34e1..0f44ad7 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -281,7 +281,8 @@
 
 };
 
-#define REGEXP_ALL_COUNTER 0x123456
+#define REGEXP_ALL_COUNTER	0x123456
+#define REGEXP_ALL_LAX_COUNTER	0x123457
 
 static void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top);
 
@@ -956,27 +957,32 @@
 
 /**
  * xmlFAGenerateAllTransition:
- * ctxt:  a regexp parser context
- * from:  the from state
- * to:  the target state or NULL for building a new one
+ * @ctxt:  a regexp parser context
+ * @from:  the from state
+ * @to:  the target state or NULL for building a new one
+ * @lax:
  *
  */
 static void
 xmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt,
-			   xmlRegStatePtr from, xmlRegStatePtr to) {
+			   xmlRegStatePtr from, xmlRegStatePtr to,
+			   int lax) {
     if (to == NULL) {
 	to = xmlRegNewState(ctxt);
 	xmlRegStatePush(ctxt, to);
 	ctxt->state = to;
     }
-    xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER);
+    if (lax)
+	xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER);
+    else
+	xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER);
 }
 
 /**
  * xmlFAGenerateEpsilonTransition:
- * ctxt:  a regexp parser context
- * from:  the from state
- * to:  the target state or NULL for building a new one
+ * @ctxt:  a regexp parser context
+ * @from:  the from state
+ * @to:  the target state or NULL for building a new one
  *
  */
 static void
@@ -992,9 +998,9 @@
 
 /**
  * xmlFAGenerateCountedEpsilonTransition:
- * ctxt:  a regexp parser context
- * from:  the from state
- * to:  the target state or NULL for building a new one
+ * @ctxt:  a regexp parser context
+ * @from:  the from state
+ * @to:  the target state or NULL for building a new one
  * counter:  the counter for that transition
  *
  */
@@ -1011,9 +1017,9 @@
 
 /**
  * xmlFAGenerateCountedTransition:
- * ctxt:  a regexp parser context
- * from:  the from state
- * to:  the target state or NULL for building a new one
+ * @ctxt:  a regexp parser context
+ * @from:  the from state
+ * @to:  the target state or NULL for building a new one
  * counter:  the counter for that transition
  *
  */
@@ -1030,10 +1036,10 @@
 
 /**
  * xmlFAGenerateTransitions:
- * ctxt:  a regexp parser context
- * from:  the from state
- * to:  the target state or NULL for building a new one
- * atom:  the atom generating the transition
+ * @ctxt:  a regexp parser context
+ * @from:  the from state
+ * @to:  the target state or NULL for building a new one
+ * @atom:  the atom generating the transition
  *
  */
 static void
@@ -1135,7 +1141,7 @@
 
 /**
  * xmlFAReduceEpsilonTransitions:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  * @fromnr:  the from state
  * @tonr:  the to state 
  * @cpunter:  should that transition be associted to a counted
@@ -1216,7 +1222,7 @@
 
 /**
  * xmlFAEliminateEpsilonTransitions:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  */
 static void
@@ -2027,7 +2033,44 @@
 		continue;
 	    atom = trans->atom;
 	    ret = 0;
-	    if (trans->count == REGEXP_ALL_COUNTER) {
+	    if (trans->count == REGEXP_ALL_LAX_COUNTER) {
+		int i;
+		int count;
+		xmlRegTransPtr t;
+		xmlRegCounterPtr counter;
+
+		ret = 0;
+
+#ifdef DEBUG_PUSH
+		printf("testing all lax %d\n", trans->count);
+#endif
+		/*
+		 * Check all counted transitions from the current state
+		 */
+		if ((value == NULL) && (final)) {
+		    ret = 1;
+		} else if (value != NULL) {
+		    for (i = 0;i < exec->state->nbTrans;i++) {
+			t = &exec->state->trans[i];
+			if ((t->counter < 0) || (t == trans))
+			    continue;
+			counter = &exec->comp->counters[t->counter];
+			count = exec->counts[t->counter];
+			if ((count < counter->max) && 
+		            (t->atom != NULL) &&
+			    (xmlStrEqual(value, t->atom->valuep))) {
+			    ret = 0;
+			    break;
+			}
+			if ((count >= counter->min) &&
+			    (count < counter->max) &&
+			    (xmlStrEqual(value, t->atom->valuep))) {
+			    ret = 1;
+			    break;
+			}
+		    }
+		}
+	    } else if (trans->count == REGEXP_ALL_COUNTER) {
 		int i;
 		int count;
 		xmlRegTransPtr t;
@@ -2073,6 +2116,16 @@
 		break;
 	    } else if (value != NULL) {
 		ret = xmlStrEqual(value, atom->valuep);
+		if ((ret == 1) && (trans->counter >= 0)) {
+		    xmlRegCounterPtr counter;
+		    int count;
+
+		    count = exec->counts[trans->counter];
+		    counter = &exec->comp->counters[trans->counter];
+		    if (count >= counter->max)
+			ret = 0;
+		}
+
 		if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) {
 		    xmlRegStatePtr to = exec->comp->states[trans->to];
 
@@ -2373,7 +2426,7 @@
 
 /**
  * xmlFAIsChar:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [10]   Char   ::=   [^.\?*+()|#x5B#x5D]
  */
@@ -2393,7 +2446,7 @@
 
 /**
  * xmlFAParseCharProp:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [27]   charProp   ::=   IsCategory | IsBlock
  * [28]   IsCategory ::= Letters | Marks | Numbers | Punctuation |
@@ -2616,7 +2669,7 @@
 
 /**
  * xmlFAParseCharClassEsc:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) 
  * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E]
@@ -2734,7 +2787,7 @@
 
 /**
  * xmlFAParseCharRef:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [19]   XmlCharRef   ::=   ( '&#' [0-9]+ ';' ) | (' &#x' [0-9a-fA-F]+ ';' )
  */
@@ -2791,7 +2844,7 @@
 
 /**
  * xmlFAParseCharRange:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [17]   charRange   ::=     seRange | XmlCharRef | XmlCharIncDash 
  * [18]   seRange   ::=   charOrEsc '-' charOrEsc
@@ -2880,7 +2933,7 @@
 
 /**
  * xmlFAParsePosCharGroup:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [14]   posCharGroup ::= ( charRange | charClassEsc  )+
  */
@@ -2898,7 +2951,7 @@
 
 /**
  * xmlFAParseCharGroup:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [13]   charGroup    ::= posCharGroup | negCharGroup | charClassSub
  * [15]   negCharGroup ::= '^' posCharGroup
@@ -2941,7 +2994,7 @@
 
 /**
  * xmlFAParseCharClass:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [11]   charClass   ::=     charClassEsc | charClassExpr
  * [12]   charClassExpr   ::=   '[' charGroup ']'
@@ -2966,7 +3019,7 @@
 
 /**
  * xmlFAParseQuantExact:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [8]   QuantExact   ::=   [0-9]+
  */
@@ -2988,7 +3041,7 @@
 
 /**
  * xmlFAParseQuantifier:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [4]   quantifier   ::=   [?*+] | ( '{' quantity '}' )
  * [5]   quantity   ::=   quantRange | quantMin | QuantExact
@@ -3045,7 +3098,7 @@
 
 /**
  * xmlFAParseAtom:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [9]   atom   ::=   Char | charClass | ( '(' regExp ')' )
  */
@@ -3099,7 +3152,7 @@
 
 /**
  * xmlFAParsePiece:
- * ctxt:  a regexp parser context
+ * @ctxt:  a regexp parser context
  *
  * [3]   piece   ::=   atom quantifier?
  */
@@ -3120,8 +3173,8 @@
 
 /**
  * xmlFAParseBranch:
- * ctxt:  a regexp parser context
- * first:  is taht the first
+ * @ctxt:  a regexp parser context
+ * @first:  is taht the first
  *
  * [2]   branch   ::=   piece*
  */
@@ -3162,8 +3215,8 @@
 
 /**
  * xmlFAParseRegExp:
- * ctxt:  a regexp parser context
- * top:  is that the top-level expressions ?
+ * @ctxt:  a regexp parser context
+ * @top:  is that the top-level expressions ?
  *
  * [1]   regExp   ::=     branch  ( '|' branch )*
  */
@@ -3598,10 +3651,10 @@
  */
 xmlAutomataStatePtr
 xmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from,
-		      xmlAutomataStatePtr to) {
+		       xmlAutomataStatePtr to, int lax) {
     if ((am == NULL) || (from == NULL))
 	return(NULL);
-    xmlFAGenerateAllTransition(am, from, to);
+    xmlFAGenerateAllTransition(am, from, to, lax);
     if (to == NULL)
 	return(am->state);
     return(to);
diff --git a/xmlschemas.c b/xmlschemas.c
index 1926063..606b66b 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -3037,10 +3037,10 @@
 	    break;
 	}
 	case XML_SCHEMA_TYPE_ALL: {
-	    xmlAutomataStatePtr end;
 	    xmlAutomataStatePtr start;
 	    xmlSchemaTypePtr subtypes;
 	    xmlSchemaElementPtr elem = (xmlSchemaElementPtr) type;
+	    int lax;
 
 	    subtypes = type->subtypes;
 	    if (subtypes == NULL)
@@ -3056,7 +3056,9 @@
 				subtypes);
 		subtypes = subtypes->next;
 	    }
-	    ctxt->state = xmlAutomataNewAllTrans(ctxt->am, ctxt->state, NULL);
+	    lax = type->minOccurs == 0;
+	    ctxt->state = xmlAutomataNewAllTrans(ctxt->am, ctxt->state, NULL,
+		                                 lax);
 	    TODO
 	    break;
 	}
@@ -3895,6 +3897,11 @@
 xmlSchemaRegisterAttributes(xmlSchemaValidCtxtPtr ctxt,
 	                    xmlAttrPtr attrs) {
     while (attrs != NULL) {
+	if ((attrs->ns != NULL) &&
+	    (xmlStrEqual(attrs->ns->href, xmlSchemaInstanceNs))) {
+	    attrs = attrs->next;
+	    continue;
+	}
 	if (ctxt->attrNr >= ctxt->attrMax) {
 	    xmlSchemaAttrStatePtr tmp;