checked and fixed the compilation of RNG schemas, fixes a couple of bugs
* relaxng.c result/relaxng/*: checked and fixed the compilation
of RNG schemas, fixes a couple of bugs #117097 and #117001 .
This slightly changes the output messages of some regression tests.
Daniel
diff --git a/relaxng.c b/relaxng.c
index 28eef44..054277c 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -2701,18 +2701,7 @@
(def->dflags & IS_NOT_COMPILABLE))
return(0);
switch(def->type) {
- case XML_RELAXNG_REF:
- case XML_RELAXNG_EXTERNALREF:
- case XML_RELAXNG_PARENTREF:
- if (def->depth == -20) {
- return(1);
- } else {
- def->depth = -20;
- ret = xmlRelaxNGIsCompileable(def->content);
- }
- break;
case XML_RELAXNG_NOOP:
- case XML_RELAXNG_START:
ret = xmlRelaxNGIsCompileable(def->content);
break;
case XML_RELAXNG_TEXT:
@@ -2722,15 +2711,41 @@
case XML_RELAXNG_ELEMENT:
if (((def->dflags & IS_NOT_COMPILABLE) == 0) &&
((def->dflags & IS_COMPILABLE) == 0)) {
- ret = xmlRelaxNGIsCompileable(def->content);
+ xmlRelaxNGDefinePtr list;
+ list = def->content;
+ while (list != NULL) {
+ ret = xmlRelaxNGIsCompileable(list);
+ if (ret != 1)
+ break;
+ list = list->next;
+ }
if (ret == 0) def->dflags |= IS_NOT_COMPILABLE;
if (ret == 1) def->dflags |= IS_COMPILABLE;
}
- if ((def->nameClass != NULL) || (def->name == NULL))
- return(0);
- else
- return(1);
+ if (ret == 1) {
+ if ((def->nameClass != NULL) || (def->name == NULL))
+ ret = 0;
+ }
break;
+ case XML_RELAXNG_REF:
+ case XML_RELAXNG_EXTERNALREF:
+ case XML_RELAXNG_PARENTREF:
+ if (def->depth == -20) {
+ return(1);
+ } else {
+ xmlRelaxNGDefinePtr list;
+
+ def->depth = -20;
+ list = def->content;
+ while (list != NULL) {
+ ret = xmlRelaxNGIsCompileable(list);
+ if (ret != 1)
+ break;
+ list = list->next;
+ }
+ }
+ break;
+ case XML_RELAXNG_START:
case XML_RELAXNG_OPTIONAL:
case XML_RELAXNG_ZEROORMORE:
case XML_RELAXNG_ONEORMORE:
@@ -2853,9 +2868,6 @@
ctxt->am = oldam;
}
break;
- case XML_RELAXNG_REF:
- case XML_RELAXNG_EXTERNALREF:
- case XML_RELAXNG_PARENTREF:
case XML_RELAXNG_NOOP:
ret = xmlRelaxNGCompile(ctxt, def->content);
break;
@@ -2905,7 +2917,9 @@
list = def->content;
while (list != NULL) {
ctxt->state = oldstate;
- xmlRelaxNGCompile(ctxt, list);
+ ret = xmlRelaxNGCompile(ctxt, list);
+ if (ret != 0)
+ break;
if (target == NULL)
target = ctxt->state;
else {
@@ -2917,11 +2931,16 @@
break;
}
+ case XML_RELAXNG_REF:
+ case XML_RELAXNG_EXTERNALREF:
+ case XML_RELAXNG_PARENTREF:
case XML_RELAXNG_GROUP:
case XML_RELAXNG_DEF:
list = def->content;
while (list != NULL) {
- xmlRelaxNGCompile(ctxt, list);
+ ret = xmlRelaxNGCompile(ctxt, list);
+ if (ret != 0)
+ break;
list = list->next;
}
break;
@@ -2978,15 +2997,28 @@
if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
ctxt->am = NULL;
ret = xmlRelaxNGCompile(ctxt, def);
+#ifdef DEBUG_PROGRESSIVE
+ if (ret == 0) {
+ if (def->type == XML_RELAXNG_START)
+ xmlGenericError(xmlGenericErrorContext,
+ "compiled the start\n");
+ else
+ xmlGenericError(xmlGenericErrorContext,
+ "compiled element %s\n", def->name);
+ } else {
+ if (def->type == XML_RELAXNG_START)
+ xmlGenericError(xmlGenericErrorContext,
+ "failed to compile the start\n");
+ else
+ xmlGenericError(xmlGenericErrorContext,
+ "failed to compile element %s\n", def->name);
+ }
+#endif
return(ret);
}
}
switch(def->type) {
- case XML_RELAXNG_REF:
- case XML_RELAXNG_EXTERNALREF:
- case XML_RELAXNG_PARENTREF:
case XML_RELAXNG_NOOP:
- case XML_RELAXNG_START:
ret = xmlRelaxNGTryCompile(ctxt, def->content);
break;
case XML_RELAXNG_TEXT:
@@ -3004,6 +3036,10 @@
case XML_RELAXNG_CHOICE:
case XML_RELAXNG_GROUP:
case XML_RELAXNG_DEF:
+ case XML_RELAXNG_START:
+ case XML_RELAXNG_REF:
+ case XML_RELAXNG_EXTERNALREF:
+ case XML_RELAXNG_PARENTREF:
list = def->content;
while (list != NULL) {
ret = xmlRelaxNGTryCompile(ctxt, list);