more RelaxNG bug hunting Daniel

* relaxng.c check-relaxng-test-suite.py: more RelaxNG bug hunting
Daniel
This commit is contained in:
Daniel Veillard 2003-02-17 23:34:33 +00:00
parent 416589ae78
commit 2df2de225a
3 changed files with 71 additions and 36 deletions

View File

@ -1,3 +1,7 @@
Tue Feb 18 00:33:17 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c check-relaxng-test-suite.py: more RelaxNG bug hunting
Mon Feb 17 18:23:32 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c check-relaxng-test-suite.py: more work on the

View File

@ -14,7 +14,6 @@ CONF="test/relaxng/OASIS/spectest.xml"
LOG="check-relaxng-test-suite.log"
RES="relaxng-test-results.xml"
log = open(LOG, "w")
nb_schemas_tests = 0
nb_schemas_success = 0

102
relaxng.c
View File

@ -2786,6 +2786,16 @@ xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
def = xmlRelaxNGParseInterleave(ctxt, node);
if (def != NULL) {
xmlRelaxNGDefinePtr tmp;
if ((def->content != NULL) && (def->content->next != NULL)) {
tmp = xmlRelaxNGNewDefine(ctxt, node);
if (tmp != NULL) {
tmp->type = XML_RELAXNG_GROUP;
tmp->content = def->content;
def->content = tmp;
}
}
tmp = xmlRelaxNGNewDefine(ctxt, node);
if (tmp == NULL)
return(def);
@ -3235,7 +3245,7 @@ xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
static int
xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) {
int ret = 0;
xmlRelaxNGDefinePtr def = NULL;
xmlRelaxNGDefinePtr def = NULL, last;
if (nodes == NULL) {
if (ctxt->error != NULL)
@ -3254,7 +3264,6 @@ xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) {
ctxt->error(ctxt->userData, "element empty is not empty\n");
ctxt->nbErrors++;
}
ctxt->grammar->start = def;
} else if (IS_RELAXNG(nodes, "notAllowed")) {
def = xmlRelaxNGNewDefine(ctxt, nodes);
if (def == NULL)
@ -3266,9 +3275,15 @@ xmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) {
"element notAllowed is not empty\n");
ctxt->nbErrors++;
}
ctxt->grammar->start = def;
} else {
def = xmlRelaxNGParsePatterns(ctxt, nodes, 1);
}
if (ctxt->grammar->start != NULL) {
last = ctxt->grammar->start;
while (last->next != NULL)
last = last->next;
last->next = def;
} else {
ctxt->grammar->start = def;
}
nodes = nodes->next;
@ -3528,14 +3543,24 @@ xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
xmlChar *combine;
int choiceOrInterleave = -1;
int missing = 0;
xmlRelaxNGDefinePtr cur, last, tmp, tmp2;
xmlRelaxNGDefinePtr cur;
starts = grammar->startList;
if ((starts == NULL) || (starts->nextHash == NULL))
starts = grammar->start;
if ((starts == NULL) || (starts->next == NULL))
return;
cur = starts;
while (cur != NULL) {
combine = xmlGetProp(cur->node, BAD_CAST "combine");
if ((cur->node == NULL) || (cur->node->parent == NULL) ||
(!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) {
combine = NULL;
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Internal error: start element not found\n");
ctxt->nbErrors++;
} else {
combine = xmlGetProp(cur->node->parent, BAD_CAST "combine");
}
if (combine != NULL) {
if (xmlStrEqual(combine, BAD_CAST "choice")) {
if (choiceOrInterleave == -1)
@ -3546,7 +3571,7 @@ xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
"<start> use both 'choice' and 'interleave'\n");
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) {
@ -3573,7 +3598,7 @@ xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
}
}
cur = cur->nextHash;
cur = cur->next;
}
#ifdef DEBUG
xmlGenericError(xmlGenericErrorContext,
@ -3586,36 +3611,31 @@ xmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
if (cur == NULL)
return;
if (choiceOrInterleave == 0)
cur->type = XML_RELAXNG_CHOICE;
else
cur->type = XML_RELAXNG_INTERLEAVE;
tmp = starts;
last = NULL;
while (tmp != NULL) {
if (tmp->content != NULL) {
if (tmp->content->next != NULL) {
/*
* we need first to create a wrapper.
*/
tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node);
if (tmp2 == NULL)
break;
tmp2->type = XML_RELAXNG_GROUP;
tmp2->content = tmp->content;
} else {
tmp2 = tmp->content;
else
cur->type = XML_RELAXNG_CHOICE;
cur->content = grammar->start;
grammar->start = 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++;
}
if (last == NULL) {
cur->content = tmp2;
} else {
last->next = tmp2;
}
last = tmp2;
tmp->content = NULL;
}
tmp = tmp->nextHash;
}
starts->content = cur;
}
/**
@ -3655,6 +3675,17 @@ xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) {
ctxt->grammar = ret;
xmlRelaxNGParseGrammarContent(ctxt, nodes);
ctxt->grammar = ret;
if (ctxt->grammar == NULL) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Failed to parse <grammar> content\n");
ctxt->nbErrors++;
} else if (ctxt->grammar->start == NULL) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Element <grammar> has no <start>\n");
ctxt->nbErrors++;
}
/*
* Apply 4.17 mergingd rules to defines and starts
@ -3893,6 +3924,7 @@ xmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
(!xmlStrEqual(node->name, BAD_CAST "attribute")) &&
(!xmlStrEqual(node->name, BAD_CAST "ref")) &&
(!xmlStrEqual(node->name, BAD_CAST "parentRef")) &&
(!xmlStrEqual(node->name, BAD_CAST "param")) &&
(!xmlStrEqual(node->name, BAD_CAST "define"))) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,