From 1c354ef3f8eba986d25657717a28ce43bf8e2e0a Mon Sep 17 00:00:00 2001 From: Nikolai Weibull Date: Fri, 12 Oct 2018 22:30:10 +0200 Subject: [PATCH 1/4] Add compile and libxml2-config.cmake to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 62cd025b..605bb2f7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ Makefile.in aclocal.m4 autom4te.cache bissect* +compile config.guess config.h config.h.in @@ -59,6 +60,7 @@ install-sh libtool libxml-2.0-uninstalled.pc libxml-2.0.pc +libxml2-config.cmake libxml2.la libxml2.spec list -- GitLab From 3cf2a68bb3c94504fade18975247b0576a09cc87 Mon Sep 17 00:00:00 2001 From: Nikolai Weibull Date: Fri, 12 Oct 2018 22:30:26 +0200 Subject: [PATCH 2/4] Look inside divs for starts and defines inside include RELAX NG allows for div elements inside of include elements. We need to look inside those div elements for start and define elements that may be redefining start and define elements in the included grammar. --- relaxng.c | 13 ++++++++++++- result/relaxng/include0_0 | 0 result/relaxng/include0_0.err | 1 + result/relaxng/include0_err | 1 + result/relaxng/include0_valid | 0 test/relaxng/include0.inc | 5 +++++ test/relaxng/include0.rng | 11 +++++++++++ test/relaxng/include0_0.xml | 1 + 8 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 result/relaxng/include0_0 create mode 100644 result/relaxng/include0_0.err create mode 100644 result/relaxng/include0_err create mode 100644 result/relaxng/include0_valid create mode 100644 test/relaxng/include0.inc create mode 100644 test/relaxng/include0.rng create mode 100644 test/relaxng/include0_0.xml diff --git a/relaxng.c b/relaxng.c index 88d351df..5bbabc49 100644 --- a/relaxng.c +++ b/relaxng.c @@ -1739,7 +1739,18 @@ xmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL, xmlFree(name); } } - cur = cur->next; + if (IS_RELAXNG(cur, "div") && cur->children != NULL) { + cur = cur->children; + } else { + if (cur->next != NULL) { + cur = cur->next; + } else { + while (cur->parent != node && cur->parent->next == NULL) { + cur = cur->parent; + } + cur = cur->parent != node ? cur->parent->next : NULL; + } + } } diff --git a/result/relaxng/include0_0 b/result/relaxng/include0_0 new file mode 100644 index 00000000..e69de29b diff --git a/result/relaxng/include0_0.err b/result/relaxng/include0_0.err new file mode 100644 index 00000000..24013bc5 --- /dev/null +++ b/result/relaxng/include0_0.err @@ -0,0 +1 @@ +./test/relaxng/include0_0.xml validates diff --git a/result/relaxng/include0_err b/result/relaxng/include0_err new file mode 100644 index 00000000..cd16cbe2 --- /dev/null +++ b/result/relaxng/include0_err @@ -0,0 +1 @@ +./test/relaxng/include0.rng validates diff --git a/result/relaxng/include0_valid b/result/relaxng/include0_valid new file mode 100644 index 00000000..e69de29b diff --git a/test/relaxng/include0.inc b/test/relaxng/include0.inc new file mode 100644 index 00000000..8636ee4e --- /dev/null +++ b/test/relaxng/include0.inc @@ -0,0 +1,5 @@ + + + + + diff --git a/test/relaxng/include0.rng b/test/relaxng/include0.rng new file mode 100644 index 00000000..e8edb92f --- /dev/null +++ b/test/relaxng/include0.rng @@ -0,0 +1,11 @@ + + +
+ + + + + +
+
+
diff --git a/test/relaxng/include0_0.xml b/test/relaxng/include0_0.xml new file mode 100644 index 00000000..f3f286ea --- /dev/null +++ b/test/relaxng/include0_0.xml @@ -0,0 +1 @@ + -- GitLab From 4f5d2b9b2da3fc400371823de6ca0165b865040d Mon Sep 17 00:00:00 2001 From: Nikolai Weibull Date: Fri, 12 Oct 2018 23:46:24 +0200 Subject: [PATCH 3/4] Allow choice within choice in nameClass in RELAX NG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pattern nameClass allows for nested choice elements, for example a b c which is semantically equivalent to a b c The old code didn’t handle this correctly, as it never expected a choice inside another choice. This patch fixes this by flattening any nested choices. This pattern of nested choice elements comes up in RELAX NG simplification, where all choice elements are rewritten in this nested manner, see section 4.12 of the RELAX NG specification. --- relaxng.c | 16 ++++++++++------ result/relaxng/anyName0_0 | 0 result/relaxng/anyName0_0.err | 1 + result/relaxng/anyName0_err | 1 + result/relaxng/anyName0_valid | 0 test/relaxng/anyName0.rng | 15 +++++++++++++++ test/relaxng/anyName0_0.xml | 1 + 7 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 result/relaxng/anyName0_0 create mode 100644 result/relaxng/anyName0_0.err create mode 100644 result/relaxng/anyName0_err create mode 100644 result/relaxng/anyName0_valid create mode 100644 test/relaxng/anyName0.rng create mode 100644 test/relaxng/anyName0_0.xml diff --git a/relaxng.c b/relaxng.c index 5bbabc49..e508425a 100644 --- a/relaxng.c +++ b/relaxng.c @@ -5358,11 +5358,15 @@ xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, xmlNodePtr child; xmlRelaxNGDefinePtr last = NULL; - ret = xmlRelaxNGNewDefine(ctxt, node); - if (ret == NULL) - return (NULL); - ret->parent = def; - ret->type = XML_RELAXNG_CHOICE; + if (def->type == XML_RELAXNG_CHOICE) { + ret = def; + } else { + ret = xmlRelaxNGNewDefine(ctxt, node); + if (ret == NULL) + return (NULL); + ret->parent = def; + ret->type = XML_RELAXNG_CHOICE; + } if (node->children == NULL) { xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY, @@ -5374,7 +5378,7 @@ xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, tmp = xmlRelaxNGParseNameClass(ctxt, child, ret); if (tmp != NULL) { if (last == NULL) { - last = ret->nameClass = tmp; + last = tmp; } else { last->next = tmp; last = tmp; diff --git a/result/relaxng/anyName0_0 b/result/relaxng/anyName0_0 new file mode 100644 index 00000000..e69de29b diff --git a/result/relaxng/anyName0_0.err b/result/relaxng/anyName0_0.err new file mode 100644 index 00000000..f660c26d --- /dev/null +++ b/result/relaxng/anyName0_0.err @@ -0,0 +1 @@ +./test/relaxng/anyName0_0.xml validates diff --git a/result/relaxng/anyName0_err b/result/relaxng/anyName0_err new file mode 100644 index 00000000..ab6f08da --- /dev/null +++ b/result/relaxng/anyName0_err @@ -0,0 +1 @@ +./test/relaxng/anyName0.rng validates diff --git a/result/relaxng/anyName0_valid b/result/relaxng/anyName0_valid new file mode 100644 index 00000000..e69de29b diff --git a/test/relaxng/anyName0.rng b/test/relaxng/anyName0.rng new file mode 100644 index 00000000..9fc5ead0 --- /dev/null +++ b/test/relaxng/anyName0.rng @@ -0,0 +1,15 @@ + + + + + + + a + b + + c + + + + + diff --git a/test/relaxng/anyName0_0.xml b/test/relaxng/anyName0_0.xml new file mode 100644 index 00000000..fb08e36d --- /dev/null +++ b/test/relaxng/anyName0_0.xml @@ -0,0 +1 @@ + -- GitLab From 0d0ad65b6e1c4ae5ac46be3ac88f38e21506907a Mon Sep 17 00:00:00 2001 From: Nikolai Weibull Date: Sat, 13 Oct 2018 00:12:12 +0200 Subject: [PATCH 4/4] Remove redefined starts and defines inside include elements When including a grammar from another grammar, we need to make sure that any redefines of starts and includes that that grammar does inside any of its include elements are also removed. --- relaxng.c | 3 +++ result/relaxng/include1_0 | 0 result/relaxng/include1_0.err | 1 + result/relaxng/include1_err | 1 + result/relaxng/include1_valid | 0 test/relaxng/include1-0.inc | 12 ++++++++++++ test/relaxng/include1-1.inc | 7 +++++++ test/relaxng/include1.rng | 12 ++++++++++++ test/relaxng/include1_0.xml | 1 + 9 files changed, 37 insertions(+) create mode 100644 result/relaxng/include1_0 create mode 100644 result/relaxng/include1_0.err create mode 100644 result/relaxng/include1_err create mode 100644 result/relaxng/include1_valid create mode 100644 test/relaxng/include1-0.inc create mode 100644 test/relaxng/include1-1.inc create mode 100644 test/relaxng/include1.rng create mode 100644 test/relaxng/include1_0.xml diff --git a/relaxng.c b/relaxng.c index e508425a..8306e546 100644 --- a/relaxng.c +++ b/relaxng.c @@ -1573,6 +1573,9 @@ xmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, #endif } } + if (xmlRelaxNGRemoveRedefine(ctxt, URL, tmp->children, name) == 1) { + found = 1; + } } tmp = tmp2; } diff --git a/result/relaxng/include1_0 b/result/relaxng/include1_0 new file mode 100644 index 00000000..e69de29b diff --git a/result/relaxng/include1_0.err b/result/relaxng/include1_0.err new file mode 100644 index 00000000..8c13f4c5 --- /dev/null +++ b/result/relaxng/include1_0.err @@ -0,0 +1 @@ +./test/relaxng/include1_0.xml validates diff --git a/result/relaxng/include1_err b/result/relaxng/include1_err new file mode 100644 index 00000000..ad4850b0 --- /dev/null +++ b/result/relaxng/include1_err @@ -0,0 +1 @@ +./test/relaxng/include1.rng validates diff --git a/result/relaxng/include1_valid b/result/relaxng/include1_valid new file mode 100644 index 00000000..e69de29b diff --git a/test/relaxng/include1-0.inc b/test/relaxng/include1-0.inc new file mode 100644 index 00000000..87c68028 --- /dev/null +++ b/test/relaxng/include1-0.inc @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/relaxng/include1-1.inc b/test/relaxng/include1-1.inc new file mode 100644 index 00000000..8af51ec0 --- /dev/null +++ b/test/relaxng/include1-1.inc @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/relaxng/include1.rng b/test/relaxng/include1.rng new file mode 100644 index 00000000..c36bff93 --- /dev/null +++ b/test/relaxng/include1.rng @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/relaxng/include1_0.xml b/test/relaxng/include1_0.xml new file mode 100644 index 00000000..d80a5e27 --- /dev/null +++ b/test/relaxng/include1_0.xml @@ -0,0 +1 @@ + -- GitLab