diff --git a/ChangeLog b/ChangeLog index 0ce90291..bf37ae5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Tue Aug 9 13:07:27 CEST 2005 Daniel Veillard + + * xmlregexp.c xmlschemas.c: trying to nail down the remaining + ##other issues + * result/schemas/any7* test/schemas/any7: completed the tests + and added the results + * result/schemas/any3_0_0.err result/schemas/any5_0_0.err + result/schemas/any5_1_0.err: this slightly chnages the output + from 3 existing tests + Mon Aug 8 22:33:08 CEST 2005 Daniel Veillard * nanoftp.c nanohttp.c xmlschemastypes.c: applied patch from diff --git a/result/schemas/any3_0_0.err b/result/schemas/any3_0_0.err index 19036ce5..49ce5813 100644 --- a/result/schemas/any3_0_0.err +++ b/result/schemas/any3_0_0.err @@ -1 +1 @@ -./test/schemas/any3_0.xml:12: element bar.A: Schemas validity error : Element 'bar.A': This element is not expected. Expected is one of ( {##other:http://FOO}* ). +./test/schemas/any3_0.xml:12: element bar.A: Schemas validity error : Element 'bar.A': This element is not expected. Expected is ( ##other{http://FOO}* ). diff --git a/result/schemas/any5_0_0.err b/result/schemas/any5_0_0.err index 137229b8..b69fd575 100644 --- a/result/schemas/any5_0_0.err +++ b/result/schemas/any5_0_0.err @@ -1 +1 @@ -./test/schemas/any5_0.xml:6: element boo: Schemas validity error : Element '{urn:test:foo}boo': This element is not expected. Expected is ( not {urn:test:foo}* ). +./test/schemas/any5_0.xml:6: element boo: Schemas validity error : Element '{urn:test:foo}boo': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/result/schemas/any5_1_0.err b/result/schemas/any5_1_0.err index 137229b8..b69fd575 100644 --- a/result/schemas/any5_1_0.err +++ b/result/schemas/any5_1_0.err @@ -1 +1 @@ -./test/schemas/any5_0.xml:6: element boo: Schemas validity error : Element '{urn:test:foo}boo': This element is not expected. Expected is ( not {urn:test:foo}* ). +./test/schemas/any5_0.xml:6: element boo: Schemas validity error : Element '{urn:test:foo}boo': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/result/schemas/any7_1_0 b/result/schemas/any7_1_0 new file mode 100644 index 00000000..cfd9dccb --- /dev/null +++ b/result/schemas/any7_1_0 @@ -0,0 +1 @@ +./test/schemas/any7_0.xml fails to validate diff --git a/result/schemas/any7_1_0.err b/result/schemas/any7_1_0.err new file mode 100644 index 00000000..a4274f89 --- /dev/null +++ b/result/schemas/any7_1_0.err @@ -0,0 +1 @@ +./test/schemas/any7_0.xml:18: element moo: Schemas validity error : Element 'moo': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/result/schemas/any7_1_1 b/result/schemas/any7_1_1 new file mode 100644 index 00000000..2a6f5d7d --- /dev/null +++ b/result/schemas/any7_1_1 @@ -0,0 +1 @@ +./test/schemas/any7_1.xml fails to validate diff --git a/result/schemas/any7_1_1.err b/result/schemas/any7_1_1.err new file mode 100644 index 00000000..8745468a --- /dev/null +++ b/result/schemas/any7_1_1.err @@ -0,0 +1 @@ +./test/schemas/any7_1.xml:17: element bar: Schemas validity error : Element '{urn:test:foo}bar': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/result/schemas/any7_2_0 b/result/schemas/any7_2_0 new file mode 100644 index 00000000..cfd9dccb --- /dev/null +++ b/result/schemas/any7_2_0 @@ -0,0 +1 @@ +./test/schemas/any7_0.xml fails to validate diff --git a/result/schemas/any7_2_0.err b/result/schemas/any7_2_0.err new file mode 100644 index 00000000..a4274f89 --- /dev/null +++ b/result/schemas/any7_2_0.err @@ -0,0 +1 @@ +./test/schemas/any7_0.xml:18: element moo: Schemas validity error : Element 'moo': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/result/schemas/any7_2_1 b/result/schemas/any7_2_1 new file mode 100644 index 00000000..2a6f5d7d --- /dev/null +++ b/result/schemas/any7_2_1 @@ -0,0 +1 @@ +./test/schemas/any7_1.xml fails to validate diff --git a/result/schemas/any7_2_1.err b/result/schemas/any7_2_1.err new file mode 100644 index 00000000..8745468a --- /dev/null +++ b/result/schemas/any7_2_1.err @@ -0,0 +1 @@ +./test/schemas/any7_1.xml:17: element bar: Schemas validity error : Element '{urn:test:foo}bar': This element is not expected. Expected is ( ##other{urn:test:foo}* ). diff --git a/test/schemas/any7_0.xml b/test/schemas/any7_0.xml index d8f23d2a..288b1e7f 100755 --- a/test/schemas/any7_0.xml +++ b/test/schemas/any7_0.xml @@ -16,4 +16,4 @@ One of '{"urn:test:foo":bar, WC[##other:"urn:test:foo"]}' is expected. xsi:schemaLocation="urn:test:foo any-2_1.xsd"> - \ No newline at end of file + diff --git a/test/schemas/any7_2.xsd b/test/schemas/any7_2.xsd new file mode 100755 index 00000000..cabfd982 --- /dev/null +++ b/test/schemas/any7_2.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/xmlregexp.c b/xmlregexp.c index 700b886f..cf5f942e 100644 --- a/xmlregexp.c +++ b/xmlregexp.c @@ -246,6 +246,7 @@ struct _xmlAutomata { xmlRegCounter *counters; int determinist; + int negs; }; struct _xmlRegexp { @@ -419,6 +420,7 @@ xmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { if ((ret->determinist != 0) && (ret->nbCounters == 0) && + (ctxt->negs == 0) && (ret->atoms != NULL) && (ret->atoms[0] != NULL) && (ret->atoms[0]->type == XML_REGEXP_STRING)) { @@ -661,6 +663,7 @@ xmlRegNewParserCtxt(const xmlChar *string) { ret->string = xmlStrdup(string); ret->cur = ret->string; ret->neg = 0; + ret->negs = 0; ret->error = 0; ret->determinist = -1; return(ret); @@ -1902,8 +1905,9 @@ xmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2) { default: return(1); } - if (atom1->neg != atom2->neg) + if (atom1->neg != atom2->neg) { ret = !ret; + } return(ret); } @@ -2903,19 +2907,20 @@ error: } /** - * xmlRegExecPushString: + * xmlRegExecPushStringInternal: * @exec: a regexp execution context or NULL to indicate the end * @value: a string token input * @data: data associated to the token to reuse in callbacks + * @compound: value was assembled from 2 strings * * Push one input token in the execution context * * Returns: 1 if the regexp reached a final state, 0 if non-final, and * a negative value in case of error. */ -int -xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, - void *data) { +static int +xmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, + void *data, int compound) { xmlRegTransPtr trans; xmlRegAtomPtr atom; int ret; @@ -3057,8 +3062,11 @@ xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, break; } else if (value != NULL) { ret = xmlRegStrEqualWildcard(atom->valuep, value); - if (atom->neg) + if (atom->neg) { ret = !ret; + if (!compound) + ret = 0; + } if ((ret == 1) && (trans->counter >= 0)) { xmlRegCounterPtr counter; int count; @@ -3257,6 +3265,23 @@ progress: return(exec->status); } +/** + * xmlRegExecPushString: + * @exec: a regexp execution context or NULL to indicate the end + * @value: a string token input + * @data: data associated to the token to reuse in callbacks + * + * Push one input token in the execution context + * + * Returns: 1 if the regexp reached a final state, 0 if non-final, and + * a negative value in case of error. + */ +int +xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, + void *data) { + return(xmlRegExecPushStringInternal(exec, value, data, 0)); +} + /** * xmlRegExecPushString2: * @exec: a regexp execution context or NULL to indicate the end @@ -3306,7 +3331,7 @@ xmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, if (exec->comp->compact != NULL) ret = xmlRegCompactPushString(exec, exec->comp, str, data); else - ret = xmlRegExecPushString(exec, str, data); + ret = xmlRegExecPushStringInternal(exec, str, data, 1); if (str != buf) xmlFree(buf); @@ -4917,6 +4942,8 @@ xmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, * If @to is NULL, this creates first a new target state in the automata * and then adds a transition from the @from state to the target state * activated by any value except (@token,@token2) + * Note that if @token2 is not NULL, then (X, NULL) won't match to follow + # the semantic of XSD ##other * * Returns the target state or NULL in case of error */ @@ -4963,6 +4990,7 @@ xmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, xmlRegFreeAtom(atom); return(NULL); } + am->negs++; if (to == NULL) return(am->state); return(to); diff --git a/xmlschemas.c b/xmlschemas.c index 3ee5563e..7a016a25 100644 --- a/xmlschemas.c +++ b/xmlschemas.c @@ -1935,7 +1935,7 @@ xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt, (cur[3] == ' ')) { is_not = 1; cur += 4; - str = xmlStrcat(str, BAD_CAST "not "); + str = xmlStrcat(str, BAD_CAST "##other"); } else { is_not = 0; } @@ -11137,20 +11137,9 @@ xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt, } while (ns != NULL); } else if (wild->negNsSet != NULL) { - - /* - * Lead nodes with the negated namespace to the sink-state - * {"*", "##other"}. - */ - pctxt->state = xmlAutomataNewTransition2(pctxt->am, start, NULL, - BAD_CAST "*", wild->negNsSet->value, wild); - /* - * Open a door for nodes with any other namespace - * {"*", "*"} - */ - pctxt->state = xmlAutomataNewTransition2(pctxt->am, - start, NULL, BAD_CAST "*", BAD_CAST "*", wild); - xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); + pctxt->state = xmlAutomataNewNegTrans(pctxt->am, + start, end, BAD_CAST "*", wild->negNsSet->value, + wild); } } else { int counter;