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:
@ -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.
|
||||||
|
@ -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
414
relaxng.c
@ -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:
|
||||||
|
Reference in New Issue
Block a user