more work done in the train augmented/updated the regression tests Daniel
* relaxng: more work done in the train
* test/relaxng/* result/relaxng/*: augmented/updated the
regression tests
Daniel
diff --git a/relaxng.c b/relaxng.c
index 85c49a0..86ad215 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -1248,7 +1248,7 @@
static xmlRelaxNGDefinePtr xmlRelaxNGParseElement(
xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
static xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(
- xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes);
+ xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes, int group);
static xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(
xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node);
static xmlRelaxNGPtr xmlRelaxNGParseDocument(
@@ -1494,6 +1494,8 @@
xmlRelaxNGDefinePtr *def2) {
xmlRelaxNGDefinePtr *basedef2 = def2;
+ if ((def1 == NULL) || (def2 == NULL))
+ return(1);
if ((*def1 == NULL) || (*def2 == NULL))
return(1);
while (*def1 != NULL) {
@@ -1584,7 +1586,8 @@
continue;
}
}
- if (cur == def) return(ret);
+ if (cur == def)
+ return(ret);
if (cur->next != NULL) {
cur = cur->next;
continue;
@@ -1651,16 +1654,13 @@
goto error;
cur = def->content;
while (cur != NULL) {
- list = xmlRelaxNGGetElements(ctxt, cur);
- if (list != NULL) {
- groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr)
- xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup));
- if (groups[nbgroups] == NULL)
- goto error;
- groups[nbgroups]->rule = cur;
- groups[nbgroups]->defs = list;
- nbgroups++;
- }
+ groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr)
+ xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup));
+ if (groups[nbgroups] == NULL)
+ goto error;
+ groups[nbgroups]->rule = cur;
+ groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur);
+ nbgroups++;
cur = cur->next;
}
list = NULL;
@@ -1817,8 +1817,7 @@
} else {
olddefine = ctxt->define;
ctxt->define = name;
- def->content = xmlRelaxNGParsePatterns(ctxt,
- node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 0);
ctxt->define = olddefine;
}
if (ctxt->grammar->defs == NULL)
@@ -1833,11 +1832,22 @@
} else {
tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def);
if (tmp < 0) {
- TODO
- /* store and implement 4.17 on combining */
- ctxt->nbErrors++;
- ret = -1;
- xmlRelaxNGFreeDefine(def);
+ xmlRelaxNGDefinePtr prev;
+
+ prev = xmlHashLookup(ctxt->grammar->defs, name);
+ if (prev == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Internal error on define aggregation of %s\n",
+ name);
+ ctxt->nbErrors++;
+ ret = -1;
+ xmlRelaxNGFreeDefine(def);
+ } else {
+ while (prev->nextHash != NULL)
+ prev = prev->nextHash;
+ prev->nextHash = def;
+ }
}
}
}
@@ -1882,31 +1892,31 @@
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_ZEROORMORE;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 1);
} else if (IS_RELAXNG(node, "oneOrMore")) {
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_ONEORMORE;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 1);
} else if (IS_RELAXNG(node, "optional")) {
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_OPTIONAL;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 1);
} else if (IS_RELAXNG(node, "choice")) {
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_CHOICE;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 0);
} else if (IS_RELAXNG(node, "group")) {
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_GROUP;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 0);
} else if (IS_RELAXNG(node, "ref")) {
def = xmlRelaxNGNewDefine(ctxt, node);
if (def == NULL)
@@ -1978,7 +1988,7 @@
if (def == NULL)
return(NULL);
def->type = XML_RELAXNG_LIST;
- def->content = xmlRelaxNGParsePatterns(ctxt, node->children);
+ def->content = xmlRelaxNGParsePatterns(ctxt, node->children, 0);
} else if (IS_RELAXNG(node, "interleave")) {
def = xmlRelaxNGParseInterleave(ctxt, node);
} else if (IS_RELAXNG(node, "externalRef")) {
@@ -2244,13 +2254,15 @@
* xmlRelaxNGParsePatterns:
* @ctxt: a Relax-NG parser context
* @nodes: list of nodes
+ * @group: use an implicit <group> for elements
*
* parse the content of a RelaxNG start node.
*
* Returns the definition pointer or NULL in case of error.
*/
static xmlRelaxNGDefinePtr
-xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) {
+xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
+ int group) {
xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent;
parent = ctxt->def;
@@ -2260,7 +2272,8 @@
if (def == NULL) {
def = last = cur;
} else {
- if ((def->type == XML_RELAXNG_ELEMENT) && (def == last)) {
+ if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) &&
+ (def == last)) {
def = xmlRelaxNGNewDefine(ctxt, nodes);
def->type = XML_RELAXNG_GROUP;
def->content = last;
@@ -2306,7 +2319,7 @@
TODO
xmlElemDump(stdout, nodes->doc, nodes);
} else {
- def = xmlRelaxNGParsePatterns(ctxt, nodes);
+ def = xmlRelaxNGParsePatterns(ctxt, nodes, 1);
ctxt->grammar->start = def;
}
nodes = nodes->next;
@@ -2450,7 +2463,7 @@
name);
ctxt->nbErrors++;
}
- } else if (xmlStrEqual(combine, BAD_CAST "choice")) {
+ } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
if (choiceOrInterleave == -1)
choiceOrInterleave = 0;
else if (choiceOrInterleave == 1) {
@@ -2493,9 +2506,9 @@
if (cur == NULL)
return;
if (choiceOrInterleave == 0)
- cur->type = XML_RELAXNG_CHOICE;
- else
cur->type = XML_RELAXNG_INTERLEAVE;
+ else
+ cur->type = XML_RELAXNG_CHOICE;
tmp = define;
last = NULL;
while (tmp != NULL) {
@@ -2523,6 +2536,26 @@
tmp = tmp->nextHash;
}
define->content = cur;
+ if (choiceOrInterleave == 0) {
+ if (ctxt->interleaves == NULL)
+ ctxt->interleaves = xmlHashCreate(10);
+ if (ctxt->interleaves == NULL) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Failed to create interleaves hash table\n");
+ ctxt->nbErrors++;
+ } else {
+ char tmpname[32];
+
+ snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
+ if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) < 0) {
+ if (ctxt->error != NULL)
+ ctxt->error(ctxt->userData,
+ "Failed to add %s to hash table\n", tmpname);
+ ctxt->nbErrors++;
+ }
+ }
+ }
}
/**