From 1c745ade5d5766aae34f6b05bc2780ae2daa7483 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Thu, 20 Feb 2003 00:11:02 +0000 Subject: [PATCH] implemented the 4.20 and 4.21 simplification rules. updated the results * relaxng.c: implemented the 4.20 and 4.21 simplification rules. * result/relaxng/*: updated the results Daniel --- ChangeLog | 5 + relaxng.c | 177 +++++++++++++++++++++++++++++++++ result/relaxng/spec1_err | 2 +- result/relaxng/tutor10_1_4.err | 4 +- result/relaxng/tutor10_1_5.err | 4 +- result/relaxng/tutor10_1_6.err | 4 +- result/relaxng/tutor10_2_3.err | 4 +- result/relaxng/tutor10_2_4.err | 4 +- result/relaxng/tutor10_7_3.err | 2 +- result/relaxng/tutor10_8_3.err | 2 +- result/relaxng/tutor11_2_2.err | 2 +- result/relaxng/tutor11_2_3.err | 2 +- result/relaxng/tutor12_1_err | 2 +- result/relaxng/tutor3_2_1.err | 4 +- result/relaxng/tutor3_5_2.err | 2 +- result/relaxng/tutor3_7_err | 2 +- result/relaxng/tutor5_3_1.err | 6 +- result/relaxng/tutor6_1_3.err | 2 +- result/relaxng/tutor6_2_4.err | 2 +- result/relaxng/tutor6_3_1.err | 2 +- result/relaxng/tutor7_1_2.err | 6 +- result/relaxng/tutor7_1_3.err | 6 +- result/relaxng/tutor7_2_4.err | 4 +- result/relaxng/tutor7_3_4.err | 6 +- result/relaxng/tutor7_3_5.err | 6 +- result/relaxng/tutor8_2_4.err | 6 +- result/relaxng/tutor8_2_5.err | 4 +- result/relaxng/tutor8_2_6.err | 2 +- result/relaxng/tutor9_5_2.err | 2 +- result/relaxng/tutor9_5_3.err | 2 +- result/relaxng/tutor9_6_2.err | 2 +- result/relaxng/tutor9_6_3.err | 2 +- 32 files changed, 232 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2081a676..66830f71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Feb 20 01:09:24 CET 2003 Daniel Veillard + + * relaxng.c: implemented the 4.20 and 4.21 simplification rules. + * result/relaxng/*: updated the results + Wed Feb 19 18:30:30 CET 2003 Daniel Veillard * relaxng.c: more bugfixes diff --git a/relaxng.c b/relaxng.c index a2dbe61b..a2bdf53c 100644 --- a/relaxng.c +++ b/relaxng.c @@ -3776,6 +3776,182 @@ xmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt, return(ret); } +/** + * xmlRelaxNGCheckRules: + * @ctxt: a Relax-NG parser context + * @nodes: grammar children nodes + * + * Check for simplification of empty and notAllowed + */ +static void +xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt, + xmlRelaxNGDefinePtr cur, + xmlRelaxNGDefinePtr parent) { + xmlRelaxNGDefinePtr prev = NULL; + + while (cur != NULL) { + if ((cur->type == XML_RELAXNG_REF) || + (cur->type == XML_RELAXNG_PARENTREF)) { + if (cur->depth != -3) { + cur->depth = -3; + xmlRelaxNGSimplify(ctxt, cur->content, cur); + } + } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_ATTRIBUTE) || + (parent->type == XML_RELAXNG_LIST) || + (parent->type == XML_RELAXNG_GROUP) || + (parent->type == XML_RELAXNG_INTERLEAVE) || + (parent->type == XML_RELAXNG_ONEORMORE) || + (parent->type == XML_RELAXNG_ZEROORMORE))) { + parent->type = XML_RELAXNG_NOT_ALLOWED; + break; + } + if ((parent != NULL) && + (parent->type == XML_RELAXNG_CHOICE)) { + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->next; + } else + prev->next = cur->next; + } else + prev = cur; + } else if (cur->type == XML_RELAXNG_EMPTY){ + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_ONEORMORE) || + (parent->type == XML_RELAXNG_ZEROORMORE))) { + parent->type = XML_RELAXNG_EMPTY; + break; + } + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_GROUP) || + (parent->type == XML_RELAXNG_INTERLEAVE))) { + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->next; + } else + prev->next = cur->next; + } else + prev = cur; + } else { + if (cur->content != NULL) + xmlRelaxNGSimplify(ctxt, cur->content, cur); + /* + * This may result in a simplification + */ + if ((cur->type == XML_RELAXNG_GROUP) || + (cur->type == XML_RELAXNG_INTERLEAVE)) { + if (cur->content == NULL) + cur->type = XML_RELAXNG_EMPTY; + else if (cur->content->next == NULL) { + cur->content->next = cur->next; + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->content; + } else { + prev->next = cur->content; + } + cur = cur->content; + } + } + /* + * the current node may have been transformed back + */ + if ((cur->type == XML_RELAXNG_EXCEPT) && + (cur->content != NULL) && + (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->next; + } else + prev->next = cur->next; + } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_ATTRIBUTE) || + (parent->type == XML_RELAXNG_LIST) || + (parent->type == XML_RELAXNG_GROUP) || + (parent->type == XML_RELAXNG_INTERLEAVE) || + (parent->type == XML_RELAXNG_ONEORMORE) || + (parent->type == XML_RELAXNG_ZEROORMORE))) { + parent->type = XML_RELAXNG_NOT_ALLOWED; + break; + } + if ((parent != NULL) && + (parent->type == XML_RELAXNG_CHOICE)) { + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->next; + } else + prev->next = cur->next; + } else + prev = cur; + } else if (cur->type == XML_RELAXNG_EMPTY){ + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_ONEORMORE) || + (parent->type == XML_RELAXNG_ZEROORMORE))) { + parent->type = XML_RELAXNG_EMPTY; + break; + } + if ((parent != NULL) && + ((parent->type == XML_RELAXNG_GROUP) || + (parent->type == XML_RELAXNG_INTERLEAVE) || + (parent->type == XML_RELAXNG_CHOICE))) { + if (prev == NULL) { + if (parent != NULL) + parent->content = cur->next; + } else + prev->next = cur->next; + } else + prev = cur; + } else { + prev = cur; + } + } + cur = cur->next; + } +} + +#if 0 +/** + * xmlRelaxNGCheckRules: + * @ctxt: a Relax-NG parser context + * @nodes: grammar children nodes + * @state: a state + * + * Check for rules in + * + * Returns 0 if check passed, and -1 in case of error + */ +static int +xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, + xmlRelaxNGDefinePtr cur, int depth) { + int ret = 0; + + while ((ret == 0) && (cur != NULL)) { + if ((cur->type == XML_RELAXNG_REF) || + (cur->type == XML_RELAXNG_PARENTREF)) { + if (cur->depth == -1) { + cur->depth = depth; + ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); + cur->depth = -2; + } else if (depth == cur->depth) { + if (ctxt->error != NULL) + ctxt->error(ctxt->userData, + "Detected a cycle in %s references\n", cur->name); + ctxt->nbErrors++; + return(-1); + } + } else if (cur->type == XML_RELAXNG_ELEMENT) { + ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); + } else { + ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); + } + cur = cur->next; + } + return(ret); +} +#endif + /** * xmlRelaxNGParseGrammar: * @ctxt: a Relax-NG parser context @@ -3888,6 +4064,7 @@ xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) { ctxt->define = olddefine; if (schema->topgrammar->start != NULL) { xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); + xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); } #ifdef DEBUG diff --git a/result/relaxng/spec1_err b/result/relaxng/spec1_err index 99cf052b..cd80a7dd 100644 --- a/result/relaxng/spec1_err +++ b/result/relaxng/spec1_err @@ -1 +1 @@ -Unimplemented block at relaxng.c:5697 +Unimplemented block at relaxng.c:5874 diff --git a/result/relaxng/tutor10_1_4.err b/result/relaxng/tutor10_1_4.err index d553dcaa..e661d73a 100644 --- a/result/relaxng/tutor10_1_4.err +++ b/result/relaxng/tutor10_1_4.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5881 +error detected at relaxng.c:6058 Expecting a namespace for element foo -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor10_1_5.err b/result/relaxng/tutor10_1_5.err index 0310479e..814058f5 100644 --- a/result/relaxng/tutor10_1_5.err +++ b/result/relaxng/tutor10_1_5.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5886 +error detected at relaxng.c:6063 Expecting element foo has wrong namespace: expecting http://www.example.com -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor10_1_6.err b/result/relaxng/tutor10_1_6.err index 0310479e..814058f5 100644 --- a/result/relaxng/tutor10_1_6.err +++ b/result/relaxng/tutor10_1_6.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5886 +error detected at relaxng.c:6063 Expecting element foo has wrong namespace: expecting http://www.example.com -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor10_2_3.err b/result/relaxng/tutor10_2_3.err index 79a821f3..74b3d653 100644 --- a/result/relaxng/tutor10_2_3.err +++ b/result/relaxng/tutor10_2_3.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5898 +error detected at relaxng.c:6075 Expecting no namespace for element foo -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor10_2_4.err b/result/relaxng/tutor10_2_4.err index 79a821f3..74b3d653 100644 --- a/result/relaxng/tutor10_2_4.err +++ b/result/relaxng/tutor10_2_4.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5898 +error detected at relaxng.c:6075 Expecting no namespace for element foo -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor10_7_3.err b/result/relaxng/tutor10_7_3.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor10_7_3.err +++ b/result/relaxng/tutor10_7_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor10_8_3.err b/result/relaxng/tutor10_8_3.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor10_8_3.err +++ b/result/relaxng/tutor10_8_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor11_2_2.err b/result/relaxng/tutor11_2_2.err index 91c4f3ef..9cae4dfb 100644 --- a/result/relaxng/tutor11_2_2.err +++ b/result/relaxng/tutor11_2_2.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6105 +error detected at relaxng.c:6282 Invalid attribute foo for element card diff --git a/result/relaxng/tutor11_2_3.err b/result/relaxng/tutor11_2_3.err index 8d7f8988..f24944b8 100644 --- a/result/relaxng/tutor11_2_3.err +++ b/result/relaxng/tutor11_2_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6105 +error detected at relaxng.c:6282 Invalid attribute b for element card diff --git a/result/relaxng/tutor12_1_err b/result/relaxng/tutor12_1_err index 99cf052b..cd80a7dd 100644 --- a/result/relaxng/tutor12_1_err +++ b/result/relaxng/tutor12_1_err @@ -1 +1 @@ -Unimplemented block at relaxng.c:5697 +Unimplemented block at relaxng.c:5874 diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err index 5e5a24c5..4327550c 100644 --- a/result/relaxng/tutor3_2_1.err +++ b/result/relaxng/tutor3_2_1.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:5873 +error detected at relaxng.c:6050 Expecting element name, got email -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element card: email diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor3_5_2.err +++ b/result/relaxng/tutor3_5_2.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor3_7_err b/result/relaxng/tutor3_7_err index f7198a5c..9a41395a 100644 --- a/result/relaxng/tutor3_7_err +++ b/result/relaxng/tutor3_7_err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6462 +error detected at relaxng.c:6639 extra data on the document diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err index 9f72a689..1b1d92f8 100644 --- a/result/relaxng/tutor5_3_1.err +++ b/result/relaxng/tutor5_3_1.err @@ -1,6 +1,6 @@ -error detected at relaxng.c:6256 +error detected at relaxng.c:6433 Element bad has child elements -error detected at relaxng.c:6039 +error detected at relaxng.c:6216 Expecting an element got 3 type -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element bad: text diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err index 8d8f0bad..3ef6a416 100644 --- a/result/relaxng/tutor6_1_3.err +++ b/result/relaxng/tutor6_1_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6105 +error detected at relaxng.c:6282 Invalid attribute preferredFormat for element card diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err index 48ca7950..db765b17 100644 --- a/result/relaxng/tutor6_2_4.err +++ b/result/relaxng/tutor6_2_4.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element preferredFormat: text diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err index 8d8f0bad..3ef6a416 100644 --- a/result/relaxng/tutor6_3_1.err +++ b/result/relaxng/tutor6_3_1.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6105 +error detected at relaxng.c:6282 Invalid attribute preferredFormat for element card diff --git a/result/relaxng/tutor7_1_2.err b/result/relaxng/tutor7_1_2.err index cbfe2f8b..6e22ca92 100644 --- a/result/relaxng/tutor7_1_2.err +++ b/result/relaxng/tutor7_1_2.err @@ -1,6 +1,6 @@ -error detected at relaxng.c:4984 +error detected at relaxng.c:5161 Internal: failed to validate type float -error detected at relaxng.c:6394 +error detected at relaxng.c:6571 error validating list -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element vector: text diff --git a/result/relaxng/tutor7_1_3.err b/result/relaxng/tutor7_1_3.err index 92eef349..31ed32fa 100644 --- a/result/relaxng/tutor7_1_3.err +++ b/result/relaxng/tutor7_1_3.err @@ -1,6 +1,6 @@ -error detected at relaxng.c:5224 +error detected at relaxng.c:5401 Extra data in list: 5.6 -error detected at relaxng.c:6394 +error detected at relaxng.c:6571 error validating list -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element vector: text diff --git a/result/relaxng/tutor7_2_4.err b/result/relaxng/tutor7_2_4.err index 7ff321d3..3bfb7079 100644 --- a/result/relaxng/tutor7_2_4.err +++ b/result/relaxng/tutor7_2_4.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:4984 +error detected at relaxng.c:5161 Internal: failed to validate type double -error detected at relaxng.c:6394 +error detected at relaxng.c:6571 error validating list diff --git a/result/relaxng/tutor7_3_4.err b/result/relaxng/tutor7_3_4.err index 9a414cf1..9672d11d 100644 --- a/result/relaxng/tutor7_3_4.err +++ b/result/relaxng/tutor7_3_4.err @@ -1,6 +1,6 @@ -error detected at relaxng.c:5224 +error detected at relaxng.c:5401 Extra data in list: 5.6 -error detected at relaxng.c:6394 +error detected at relaxng.c:6571 error validating list -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element path: text diff --git a/result/relaxng/tutor7_3_5.err b/result/relaxng/tutor7_3_5.err index fbf3e99d..c94bf28e 100644 --- a/result/relaxng/tutor7_3_5.err +++ b/result/relaxng/tutor7_3_5.err @@ -1,6 +1,6 @@ -error detected at relaxng.c:4984 +error detected at relaxng.c:5161 Internal: failed to validate type double -error detected at relaxng.c:6394 +error detected at relaxng.c:6571 error validating list -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element path: text diff --git a/result/relaxng/tutor8_2_4.err b/result/relaxng/tutor8_2_4.err index bde59019..6e73a992 100644 --- a/result/relaxng/tutor8_2_4.err +++ b/result/relaxng/tutor8_2_4.err @@ -1,4 +1,4 @@ -Unimplemented block at relaxng.c:5697 -Unimplemented block at relaxng.c:5697 -error detected at relaxng.c:6092 +Unimplemented block at relaxng.c:5874 +Unimplemented block at relaxng.c:5874 +error detected at relaxng.c:6269 Extra content for element head: meta diff --git a/result/relaxng/tutor8_2_5.err b/result/relaxng/tutor8_2_5.err index 7e38529e..73526aec 100644 --- a/result/relaxng/tutor8_2_5.err +++ b/result/relaxng/tutor8_2_5.err @@ -1,4 +1,4 @@ -error detected at relaxng.c:6033 +error detected at relaxng.c:6210 Expecting an element, got empty -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element head: meta diff --git a/result/relaxng/tutor8_2_6.err b/result/relaxng/tutor8_2_6.err index 240c7f47..d23da382 100644 --- a/result/relaxng/tutor8_2_6.err +++ b/result/relaxng/tutor8_2_6.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element head: base diff --git a/result/relaxng/tutor9_5_2.err b/result/relaxng/tutor9_5_2.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor9_5_2.err +++ b/result/relaxng/tutor9_5_2.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor9_5_3.err b/result/relaxng/tutor9_5_3.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor9_5_3.err +++ b/result/relaxng/tutor9_5_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor9_6_2.err b/result/relaxng/tutor9_6_2.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor9_6_2.err +++ b/result/relaxng/tutor9_6_2.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card diff --git a/result/relaxng/tutor9_6_3.err b/result/relaxng/tutor9_6_3.err index 2b281149..fbb50a82 100644 --- a/result/relaxng/tutor9_6_3.err +++ b/result/relaxng/tutor9_6_3.err @@ -1,2 +1,2 @@ -error detected at relaxng.c:6092 +error detected at relaxng.c:6269 Extra content for element addressBook: card