diff --git a/ChangeLog b/ChangeLog index c5d12132..77e4a336 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sat Apr 20 19:36:39 CEST 2002 Daniel Veillard + + * 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 * xmlregexp.c: first implementation of the all particle, this diff --git a/include/libxml/xmlautomata.h b/include/libxml/xmlautomata.h index c7d5b057..85b91e65 100644 --- a/include/libxml/xmlautomata.h +++ b/include/libxml/xmlautomata.h @@ -69,7 +69,8 @@ xmlAutomataStatePtr xmlAutomataNewOnceTrans (xmlAutomataPtr am, 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 00000000..08eb108f --- /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 00000000..316c100b --- /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 00000000..eaf4a1a1 --- /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 00000000..ebae3aa0 --- /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 00000000..62af9019 --- /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 00000000..0a6d1395 --- /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 00000000..55a2a4da --- /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 00000000..b9bd80c8 --- /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 00000000..cdd8824b --- /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 00000000..aabc8670 --- /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 00000000..f939f657 --- /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 00000000..b9bd80c8 --- /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 00000000..08eb108f --- /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 00000000..b954c8eb --- /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 00000000..eaf4a1a1 --- /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 00000000..c9fb79d2 --- /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 00000000..62af9019 --- /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 00000000..5548cfe5 --- /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 00000000..8186e826 --- /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 00000000..3b3cb98c --- /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 00000000..2eb22aee --- /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 00000000..fb46a927 --- /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 00000000..f939f657 --- /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 00000000..7b79b647 --- /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 2943d070..b3c5b53e 100644 --- a/result/schemas/choice_2_6.err +++ b/result/schemas/choice_2_6.err @@ -38,15 +38,7 @@ 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 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 00000000..fb5b0fae --- /dev/null +++ b/test/schemas/all_0.xml @@ -0,0 +1 @@ + diff --git a/test/schemas/all_0.xsd b/test/schemas/all_0.xsd new file mode 100644 index 00000000..55c04eec --- /dev/null +++ b/test/schemas/all_0.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/schemas/all_1.xml b/test/schemas/all_1.xml new file mode 100644 index 00000000..41d797e4 --- /dev/null +++ b/test/schemas/all_1.xml @@ -0,0 +1,2 @@ + + diff --git a/test/schemas/all_1.xsd b/test/schemas/all_1.xsd new file mode 100644 index 00000000..bc386f30 --- /dev/null +++ b/test/schemas/all_1.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/schemas/all_2.xml b/test/schemas/all_2.xml new file mode 100644 index 00000000..cc1580b5 --- /dev/null +++ b/test/schemas/all_2.xml @@ -0,0 +1 @@ + diff --git a/test/schemas/all_3.xml b/test/schemas/all_3.xml new file mode 100644 index 00000000..c011b3fa --- /dev/null +++ b/test/schemas/all_3.xml @@ -0,0 +1 @@ + diff --git a/test/schemas/all_4.xml b/test/schemas/all_4.xml new file mode 100644 index 00000000..afa807c2 --- /dev/null +++ b/test/schemas/all_4.xml @@ -0,0 +1 @@ + diff --git a/test/schemas/all_5.xml b/test/schemas/all_5.xml new file mode 100644 index 00000000..d68f3216 --- /dev/null +++ b/test/schemas/all_5.xml @@ -0,0 +1 @@ + diff --git a/xmlregexp.c b/xmlregexp.c index c4a34e1d..0f44ad76 100644 --- a/xmlregexp.c +++ b/xmlregexp.c @@ -281,7 +281,8 @@ struct _xmlRegExecCtxt { }; -#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 @@ xmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { /** * 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 @@ xmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, /** * 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 @@ xmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, /** * 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 @@ xmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, /** * 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 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, /** * 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 @@ xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, /** * xmlFAEliminateEpsilonTransitions: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * */ static void @@ -2027,7 +2033,44 @@ xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, 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 @@ xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, 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 @@ progress: /** * xmlFAIsChar: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [10] Char ::= [^.\?*+()|#x5B#x5D] */ @@ -2393,7 +2446,7 @@ xmlFAIsChar(xmlRegParserCtxtPtr ctxt) { /** * 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 @@ xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { /** * 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 @@ xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseCharRef: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [19] XmlCharRef ::= ( '&#' [0-9]+ ';' ) | (' &#x' [0-9a-fA-F]+ ';' ) */ @@ -2791,7 +2844,7 @@ xmlFAParseCharRef(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseCharRange: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash * [18] seRange ::= charOrEsc '-' charOrEsc @@ -2880,7 +2933,7 @@ xmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParsePosCharGroup: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [14] posCharGroup ::= ( charRange | charClassEsc )+ */ @@ -2898,7 +2951,7 @@ xmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseCharGroup: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub * [15] negCharGroup ::= '^' posCharGroup @@ -2941,7 +2994,7 @@ xmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseCharClass: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [11] charClass ::= charClassEsc | charClassExpr * [12] charClassExpr ::= '[' charGroup ']' @@ -2966,7 +3019,7 @@ xmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseQuantExact: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [8] QuantExact ::= [0-9]+ */ @@ -2988,7 +3041,7 @@ xmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseQuantifier: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) * [5] quantity ::= quantRange | quantMin | QuantExact @@ -3045,7 +3098,7 @@ xmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParseAtom: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [9] atom ::= Char | charClass | ( '(' regExp ')' ) */ @@ -3099,7 +3152,7 @@ xmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { /** * xmlFAParsePiece: - * ctxt: a regexp parser context + * @ctxt: a regexp parser context * * [3] piece ::= atom quantifier? */ @@ -3120,8 +3173,8 @@ xmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { /** * 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 @@ xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, int first) { /** * 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 @@ xmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, */ 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 19260637..606b66b7 100644 --- a/xmlschemas.c +++ b/xmlschemas.c @@ -3037,10 +3037,10 @@ xmlSchemaBuildAContentModel(xmlSchemaTypePtr type, 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 @@ xmlSchemaBuildAContentModel(xmlSchemaTypePtr type, 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 @@ static int 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;