1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-07-29 11:41:22 +03:00

implemented the checks from section 7.1, fixed some of the 4.20 and 4.21

* relaxng.c: implemented the checks from section 7.1, fixed
  some of the 4.20 and 4.21 problems.
  found 373 test schemas: 338 success 35 failures
  found 529 test instances: 519 success 6 failures
* result/relaxng/*: updated the results
Daniel
This commit is contained in:
Daniel Veillard
2003-02-20 15:03:22 +00:00
parent 1c745ade5d
commit 77648bbe61
3 changed files with 375 additions and 58 deletions

View File

@ -1,3 +1,11 @@
Thu Feb 20 16:00:31 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: implemented the checks from section 7.1, fixed
some of the 4.20 and 4.21 problems.
found 373 test schemas: 338 success 35 failures
found 529 test instances: 519 success 6 failures
* result/relaxng/*: updated the results
Thu Feb 20 01:09:24 CET 2003 Daniel Veillard <daniel@veillard.com> Thu Feb 20 01:09:24 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: implemented the 4.20 and 4.21 simplification rules. * relaxng.c: implemented the 4.20 and 4.21 simplification rules.

View File

@ -254,9 +254,10 @@ def handle_testCase(node):
global nb_instances_tests global nb_instances_tests
global resources global resources
log.write("\n ============= test %d line %d ================\n" % ( sections = node.xpathEval('string(section)')
log.write("\n ======== test %d line %d section %s ==========\n" % (
nb_schemas_tests, node.lineNo())) nb_schemas_tests, node.lineNo(), sections))
resources = {} resources = {}
if debug: if debug:
print "test %d line %d" % (nb_schemas_tests, node.lineNo()) print "test %d line %d" % (nb_schemas_tests, node.lineNo())
@ -320,7 +321,7 @@ def handle_testSuite(node, level = 0):
msg = msg + author.content + " " msg = msg + author.content + " "
print msg print msg
sections = node.xpathEval('section') sections = node.xpathEval('section')
if sections != []: if sections != [] and level <= 0:
msg = "" msg = ""
for section in sections: for section in sections:
msg = msg + section.content + " " msg = msg + section.content + " "
@ -332,6 +333,10 @@ def handle_testSuite(node, level = 0):
if level >= 1 and sections != []: if level >= 1 and sections != []:
msg = ""
for section in sections:
msg = msg + section.content + " "
print "Result of tests for section %s" % (msg)
if nb_schemas_tests != old_schemas_tests: if nb_schemas_tests != old_schemas_tests:
print "found %d test schemas: %d success %d failures" % ( print "found %d test schemas: %d success %d failures" % (
nb_schemas_tests - old_schemas_tests, nb_schemas_tests - old_schemas_tests,

414
relaxng.c
View File

@ -96,6 +96,7 @@ struct _xmlRelaxNGGrammar {
typedef enum { typedef enum {
XML_RELAXNG_NOOP = -1, /* a no operation from simplification */
XML_RELAXNG_EMPTY = 0, /* an empty pattern */ XML_RELAXNG_EMPTY = 0, /* an empty pattern */
XML_RELAXNG_NOT_ALLOWED, /* not allowed top */ XML_RELAXNG_NOT_ALLOWED, /* not allowed top */
XML_RELAXNG_EXCEPT, /* except present in nameclass defs */ XML_RELAXNG_EXCEPT, /* except present in nameclass defs */
@ -159,7 +160,14 @@ typedef enum {
XML_RELAXNG_ERR_ XML_RELAXNG_ERR_
} xmlRelaxNGValidError; } xmlRelaxNGValidError;
#define XML_RELAXNG_IN_ATTRIBUTE 1 #define XML_RELAXNG_IN_ATTRIBUTE (1 << 0)
#define XML_RELAXNG_IN_ONEORMORE (1 << 1)
#define XML_RELAXNG_IN_LIST (1 << 2)
#define XML_RELAXNG_IN_DATAEXCEPT (1 << 3)
#define XML_RELAXNG_IN_START (1 << 4)
#define XML_RELAXNG_IN_OOMGROUP (1 << 5)
#define XML_RELAXNG_IN_OOMINTERLEAVE (1 << 6)
#define XML_RELAXNG_IN_EXTERNALREF (1 << 7)
struct _xmlRelaxNGParserCtxt { struct _xmlRelaxNGParserCtxt {
void *userData; /* user specific data block */ void *userData; /* user specific data block */
@ -2477,7 +2485,7 @@ xmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
xmlRelaxNGDocumentPtr docu; xmlRelaxNGDocumentPtr docu;
xmlNodePtr root, tmp; xmlNodePtr root, tmp;
xmlChar *ns; xmlChar *ns;
int newNs = 0; int newNs = 0, oldflags;
xmlRelaxNGDefinePtr def; xmlRelaxNGDefinePtr def;
docu = node->_private; docu = node->_private;
@ -2526,7 +2534,10 @@ xmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
/* /*
* Parsing to get a precompiled schemas. * Parsing to get a precompiled schemas.
*/ */
oldflags = ctxt->flags;
ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF;
docu->schema = xmlRelaxNGParseDocument(ctxt, root); docu->schema = xmlRelaxNGParseDocument(ctxt, root);
ctxt->flags = oldflags;
if ((docu->schema != NULL) && if ((docu->schema != NULL) &&
(docu->schema->topgrammar != NULL)) { (docu->schema->topgrammar != NULL)) {
docu->content = docu->schema->topgrammar->start; docu->content = docu->schema->topgrammar->start;
@ -2931,15 +2942,10 @@ xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
case XML_RELAXNG_CHOICE: case XML_RELAXNG_CHOICE:
case XML_RELAXNG_GROUP: case XML_RELAXNG_GROUP:
case XML_RELAXNG_INTERLEAVE: case XML_RELAXNG_INTERLEAVE:
case XML_RELAXNG_ATTRIBUTE:
ret->content = cur; ret->content = cur;
cur->parent = ret; cur->parent = ret;
break; break;
case XML_RELAXNG_ATTRIBUTE:
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"attribute has an attribute child\n");
ctxt->nbErrors++;
break;
case XML_RELAXNG_START: case XML_RELAXNG_START:
case XML_RELAXNG_PARAM: case XML_RELAXNG_PARAM:
case XML_RELAXNG_EXCEPT: case XML_RELAXNG_EXCEPT:
@ -2948,6 +2954,13 @@ xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
"attribute has invalid content\n"); "attribute has invalid content\n");
ctxt->nbErrors++; ctxt->nbErrors++;
break; break;
case XML_RELAXNG_NOOP:
TODO
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Internal error, noop found\n");
ctxt->nbErrors++;
break;
} }
} }
child = child->next; child = child->next;
@ -3267,6 +3280,13 @@ xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
TODO TODO
ctxt->nbErrors++; ctxt->nbErrors++;
break; break;
case XML_RELAXNG_NOOP:
TODO
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Internal error, noop found\n");
ctxt->nbErrors++;
break;
} }
} }
child = child->next; child = child->next;
@ -3776,6 +3796,40 @@ xmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt,
return(ret); return(ret);
} }
/**
* xmlRelaxNGTryUnlink:
* @ctxt: a Relax-NG parser context
* @cur: the definition to unlink
* @parent: the parent definition
* @prev: the previous sibling definition
*
* Try to unlink a definition. If not possble make it a NOOP
*
* Returns the new prev definition
*/
static xmlRelaxNGDefinePtr
xmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
xmlRelaxNGDefinePtr cur,
xmlRelaxNGDefinePtr parent,
xmlRelaxNGDefinePtr prev) {
if (prev != NULL) {
prev->next = cur->next;
} else {
if (parent != NULL) {
if (parent->content == cur)
parent->content = cur->next;
else if (parent->attrs == cur)
parent->attrs = cur->next;
else if (parent->nameClass == cur)
parent->nameClass = cur->next;
} else {
cur->type = XML_RELAXNG_NOOP;
prev = cur;
}
}
return(prev);
}
/** /**
* xmlRelaxNGCheckRules: * xmlRelaxNGCheckRules:
* @ctxt: a Relax-NG parser context * @ctxt: a Relax-NG parser context
@ -3797,6 +3851,7 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
xmlRelaxNGSimplify(ctxt, cur->content, cur); xmlRelaxNGSimplify(ctxt, cur->content, cur);
} }
} else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
cur->parent = parent;
if ((parent != NULL) && if ((parent != NULL) &&
((parent->type == XML_RELAXNG_ATTRIBUTE) || ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
(parent->type == XML_RELAXNG_LIST) || (parent->type == XML_RELAXNG_LIST) ||
@ -3809,14 +3864,11 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
} }
if ((parent != NULL) && if ((parent != NULL) &&
(parent->type == XML_RELAXNG_CHOICE)) { (parent->type == XML_RELAXNG_CHOICE)) {
if (prev == NULL) { prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
if (parent != NULL)
parent->content = cur->next;
} else
prev->next = cur->next;
} else } else
prev = cur; prev = cur;
} else if (cur->type == XML_RELAXNG_EMPTY){ } else if (cur->type == XML_RELAXNG_EMPTY){
cur->parent = parent;
if ((parent != NULL) && if ((parent != NULL) &&
((parent->type == XML_RELAXNG_ONEORMORE) || ((parent->type == XML_RELAXNG_ONEORMORE) ||
(parent->type == XML_RELAXNG_ZEROORMORE))) { (parent->type == XML_RELAXNG_ZEROORMORE))) {
@ -3826,16 +3878,17 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
if ((parent != NULL) && if ((parent != NULL) &&
((parent->type == XML_RELAXNG_GROUP) || ((parent->type == XML_RELAXNG_GROUP) ||
(parent->type == XML_RELAXNG_INTERLEAVE))) { (parent->type == XML_RELAXNG_INTERLEAVE))) {
if (prev == NULL) { prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
if (parent != NULL)
parent->content = cur->next;
} else
prev->next = cur->next;
} else } else
prev = cur; prev = cur;
} else { } else {
cur->parent = parent;
if (cur->content != NULL) if (cur->content != NULL)
xmlRelaxNGSimplify(ctxt, cur->content, cur); xmlRelaxNGSimplify(ctxt, cur->content, cur);
if (cur->attrs != NULL)
xmlRelaxNGSimplify(ctxt, cur->attrs, cur);
if (cur->nameClass != NULL)
xmlRelaxNGSimplify(ctxt, cur->nameClass, cur);
/* /*
* This may result in a simplification * This may result in a simplification
*/ */
@ -3844,14 +3897,17 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
if (cur->content == NULL) if (cur->content == NULL)
cur->type = XML_RELAXNG_EMPTY; cur->type = XML_RELAXNG_EMPTY;
else if (cur->content->next == NULL) { else if (cur->content->next == NULL) {
cur->content->next = cur->next; if ((parent == NULL) && (prev == NULL)) {
if (prev == NULL) { cur->type = XML_RELAXNG_NOOP;
if (parent != NULL) } else if (prev == NULL) {
parent->content = cur->content; parent->content = cur->content;
cur->content->next = cur->next;
cur = cur->content;
} else { } else {
cur->content->next = cur->next;
prev->next = cur->content; prev->next = cur->content;
cur = cur->content;
} }
cur = cur->content;
} }
} }
/* /*
@ -3860,11 +3916,7 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
if ((cur->type == XML_RELAXNG_EXCEPT) && if ((cur->type == XML_RELAXNG_EXCEPT) &&
(cur->content != NULL) && (cur->content != NULL) &&
(cur->content->type == XML_RELAXNG_NOT_ALLOWED)) { (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) {
if (prev == NULL) { prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
if (parent != NULL)
parent->content = cur->next;
} else
prev->next = cur->next;
} else if (cur->type == XML_RELAXNG_NOT_ALLOWED) { } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
if ((parent != NULL) && if ((parent != NULL) &&
((parent->type == XML_RELAXNG_ATTRIBUTE) || ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
@ -3878,11 +3930,7 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
} }
if ((parent != NULL) && if ((parent != NULL) &&
(parent->type == XML_RELAXNG_CHOICE)) { (parent->type == XML_RELAXNG_CHOICE)) {
if (prev == NULL) { prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
if (parent != NULL)
parent->content = cur->next;
} else
prev->next = cur->next;
} else } else
prev = cur; prev = cur;
} else if (cur->type == XML_RELAXNG_EMPTY){ } else if (cur->type == XML_RELAXNG_EMPTY){
@ -3896,11 +3944,7 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
((parent->type == XML_RELAXNG_GROUP) || ((parent->type == XML_RELAXNG_GROUP) ||
(parent->type == XML_RELAXNG_INTERLEAVE) || (parent->type == XML_RELAXNG_INTERLEAVE) ||
(parent->type == XML_RELAXNG_CHOICE))) { (parent->type == XML_RELAXNG_CHOICE))) {
if (prev == NULL) { prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
if (parent != NULL)
parent->content = cur->next;
} else
prev->next = cur->next;
} else } else
prev = cur; prev = cur;
} else { } else {
@ -3911,46 +3955,294 @@ xmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
} }
} }
#if 0
/** /**
* xmlRelaxNGCheckRules: * xmlRelaxNGCheckRules:
* @ctxt: a Relax-NG parser context * @ctxt: a Relax-NG parser context
* @nodes: grammar children nodes * @nodes: grammar children nodes
* @state: a state * @flags: some accumulated flags
* *
* Check for rules in * Check for rules in section 7
* *
* Returns 0 if check passed, and -1 in case of error * Returns 0 if check passed, and -1 in case of error
*/ */
static int static int
xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt,
xmlRelaxNGDefinePtr cur, int depth) { xmlRelaxNGDefinePtr cur, int flags) {
int ret = 0; int ret = 0, nflags = flags;
while ((ret == 0) && (cur != NULL)) { while (cur != NULL) {
if ((cur->type == XML_RELAXNG_REF) || if ((cur->type == XML_RELAXNG_REF) ||
(cur->type == XML_RELAXNG_PARENTREF)) { (cur->type == XML_RELAXNG_PARENTREF)) {
if (cur->depth == -1) { if (flags & XML_RELAXNG_IN_LIST) {
cur->depth = depth;
ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
cur->depth = -2;
} else if (depth == cur->depth) {
if (ctxt->error != NULL) if (ctxt->error != NULL)
ctxt->error(ctxt->userData, ctxt->error(ctxt->userData,
"Detected a cycle in %s references\n", cur->name); "Found forbidden pattern list//ref\n");
ctxt->nbErrors++; ctxt->nbErrors++;
return(-1); ret = -1;
}
if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern attribute//ref\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//ref\n");
ctxt->nbErrors++;
ret = -1;
}
if (cur->depth != -4) {
cur->depth = -4;
if (xmlRelaxNGCheckRules(ctxt, cur->content, flags) != 0)
ret = -1;
} }
} else if (cur->type == XML_RELAXNG_ELEMENT) { } else if (cur->type == XML_RELAXNG_ELEMENT) {
ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1); if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//element(ref)\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern list//element(ref)\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern attribute//element(ref)\n");
ctxt->nbErrors++;
ret = -1;
}
/*
* reset since in the simple form elements are only child
* of grammar/define
*/
nflags = 0;
if (xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags) != 0)
ret = -1;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_ATTRIBUTE) {
if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern attribute//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern list//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_OOMGROUP) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern oneOrMore//group//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern oneOrMore//interleave//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//attribute\n");
ctxt->nbErrors++;
ret = -1;
}
nflags = flags | XML_RELAXNG_IN_ATTRIBUTE;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if ((cur->type == XML_RELAXNG_ONEORMORE) ||
(cur->type == XML_RELAXNG_ZEROORMORE)) {
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//oneOrMore\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//oneOrMore\n");
ctxt->nbErrors++;
ret = -1;
}
nflags = flags | XML_RELAXNG_IN_ONEORMORE;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_LIST) {
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern list//list\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//list\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//list\n");
ctxt->nbErrors++;
ret = -1;
}
nflags = flags | XML_RELAXNG_IN_LIST;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_GROUP) {
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//group\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//group\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_ONEORMORE)
nflags = flags | XML_RELAXNG_IN_OOMGROUP;
else
nflags = flags;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_INTERLEAVE) {
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern list//interleave\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//interleave\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//interleave\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_ONEORMORE)
nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE;
else
nflags = flags;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_EXCEPT) {
if ((cur->parent != NULL) &&
(cur->parent->type == XML_RELAXNG_DATATYPE))
nflags = flags | XML_RELAXNG_IN_DATAEXCEPT;
else
nflags = flags;
if (xmlRelaxNGCheckRules(ctxt, cur->content, nflags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_DATATYPE) {
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//data\n");
ctxt->nbErrors++;
ret = -1;
}
if (xmlRelaxNGCheckRules(ctxt, cur->content, flags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_VALUE) {
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//value\n");
ctxt->nbErrors++;
ret = -1;
}
if (xmlRelaxNGCheckRules(ctxt, cur->content, flags) != 0)
ret = -1;
} else if (cur->type == XML_RELAXNG_TEXT) {
if (flags & XML_RELAXNG_IN_LIST) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern list//text\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//text\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//text\n");
ctxt->nbErrors++;
ret = -1;
}
} else if (cur->type == XML_RELAXNG_EMPTY) {
if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern data/except//empty\n");
ctxt->nbErrors++;
ret = -1;
}
if (flags & XML_RELAXNG_IN_START) {
if (ctxt->error != NULL)
ctxt->error(ctxt->userData,
"Found forbidden pattern start//empty\n");
ctxt->nbErrors++;
ret = -1;
}
} else { } else {
ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth); if (xmlRelaxNGCheckRules(ctxt, cur->content, flags) != 0)
ret = -1;
} }
cur = cur->next; cur = cur->next;
} }
return(ret); return(ret);
} }
#endif
/** /**
* xmlRelaxNGParseGrammar: * xmlRelaxNGParseGrammar:
@ -4064,7 +4356,15 @@ xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) {
ctxt->define = olddefine; ctxt->define = olddefine;
if (schema->topgrammar->start != NULL) { if (schema->topgrammar->start != NULL) {
xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0); xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0);
xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL); if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) {
xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL);
while ((schema->topgrammar->start != NULL) &&
(schema->topgrammar->start->type == XML_RELAXNG_NOOP) &&
(schema->topgrammar->start->next != NULL))
schema->topgrammar->start = schema->topgrammar->start->content;
xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start,
XML_RELAXNG_IN_START);
}
} }
#ifdef DEBUG #ifdef DEBUG
@ -4955,6 +5255,9 @@ xmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) {
case XML_RELAXNG_PARAM: case XML_RELAXNG_PARAM:
TODO TODO
break; break;
case XML_RELAXNG_NOOP:
xmlRelaxNGDumpDefines(output, define->content);
break;
} }
} }
@ -6418,6 +6721,7 @@ xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
case XML_RELAXNG_ATTRIBUTE: case XML_RELAXNG_ATTRIBUTE:
ret = xmlRelaxNGValidateAttribute(ctxt, define); ret = xmlRelaxNGValidateAttribute(ctxt, define);
break; break;
case XML_RELAXNG_NOOP:
case XML_RELAXNG_REF: case XML_RELAXNG_REF:
case XML_RELAXNG_PARENTREF: case XML_RELAXNG_PARENTREF:
case XML_RELAXNG_EXTERNALREF: case XML_RELAXNG_EXTERNALREF: