Index: third_party/libxml/src/relaxng.c |
diff --git a/third_party/libxml/src/relaxng.c b/third_party/libxml/src/relaxng.c |
index 6dbc499fccbcd59c46020c0cbabeee652747a8ae..8d88e9576fced23c8267aa66dcea8408b4d3eb4d 100644 |
--- a/third_party/libxml/src/relaxng.c |
+++ b/third_party/libxml/src/relaxng.c |
@@ -39,9 +39,10 @@ |
static const xmlChar *xmlRelaxNGNs = (const xmlChar *) |
"http://relaxng.org/ns/structure/1.0"; |
-#define IS_RELAXNG(node, type) \ |
+#define IS_RELAXNG(node, typ) \ |
((node != NULL) && (node->ns != NULL) && \ |
- (xmlStrEqual(node->name, (const xmlChar *) type)) && \ |
+ (node->type == XML_ELEMENT_NODE) && \ |
+ (xmlStrEqual(node->name, (const xmlChar *) typ)) && \ |
(xmlStrEqual(node->ns->href, xmlRelaxNGNs))) |
@@ -60,7 +61,7 @@ static const xmlChar *xmlRelaxNGNs = (const xmlChar *) |
#define DEBUG_LIST 1 |
-#define DEBUG_INCLUDE 1 |
+#define DEBUG_INCLUDE 1 |
#define DEBUG_ERROR 1 |
@@ -71,7 +72,7 @@ static const xmlChar *xmlRelaxNGNs = (const xmlChar *) |
#define MAX_ERROR 5 |
-#define TODO \ |
+#define TODO \ |
xmlGenericError(xmlGenericErrorContext, \ |
"Unimplemented block at %s:%d\n", \ |
__FILE__, __LINE__); |
@@ -421,7 +422,7 @@ struct _xmlRelaxNGDocument { |
/************************************************************************ |
* * |
- * Some factorized error routines * |
+ * Some factorized error routines * |
* * |
************************************************************************/ |
@@ -564,9 +565,9 @@ xmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error, |
} |
/************************************************************************ |
- * * |
- * Preliminary type checking interfaces * |
- * * |
+ * * |
+ * Preliminary type checking interfaces * |
+ * * |
************************************************************************/ |
/** |
@@ -654,9 +655,9 @@ struct _xmlRelaxNGTypeLibrary { |
}; |
/************************************************************************ |
- * * |
- * Allocation functions * |
- * * |
+ * * |
+ * Allocation functions * |
+ * * |
************************************************************************/ |
static void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar); |
static void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define); |
@@ -1094,7 +1095,7 @@ xmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt, |
{ |
int i; |
- if (state == NULL) { |
+ if (state == NULL || states == NULL) { |
return (-1); |
} |
if (states->nbState >= states->maxState) { |
@@ -1397,9 +1398,9 @@ xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt, |
} |
/************************************************************************ |
- * * |
- * Semi internal functions * |
- * * |
+ * * |
+ * Semi internal functions * |
+ * * |
************************************************************************/ |
/** |
@@ -1429,9 +1430,9 @@ xmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags) |
} |
/************************************************************************ |
- * * |
- * Document functions * |
- * * |
+ * * |
+ * Document functions * |
+ * * |
************************************************************************/ |
static xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, |
xmlDocPtr doc); |
@@ -1561,8 +1562,8 @@ xmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt, |
href = xmlGetProp(tmp, BAD_CAST "href"); |
#endif |
if (xmlRelaxNGRemoveRedefine(ctxt, href, |
- inc->doc->children-> |
- children, name) == 1) { |
+ xmlDocGetRootElement(inc->doc)->children, |
+ name) == 1) { |
found = 1; |
} |
#ifdef DEBUG_INCLUDE |
@@ -2007,9 +2008,9 @@ xmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt, |
} |
/************************************************************************ |
- * * |
- * Error functions * |
- * * |
+ * * |
+ * Error functions * |
+ * * |
************************************************************************/ |
#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0); |
@@ -2360,7 +2361,7 @@ xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, |
* generate the error directly |
*/ |
if (((ctxt->flags & FLAGS_IGNORABLE) == 0) || |
- (ctxt->flags & FLAGS_NEGATIVE)) { |
+ (ctxt->flags & FLAGS_NEGATIVE)) { |
xmlNodePtr node, seq; |
/* |
@@ -2390,9 +2391,9 @@ xmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt, |
/************************************************************************ |
- * * |
- * Type library hooks * |
- * * |
+ * * |
+ * Type library hooks * |
+ * * |
************************************************************************/ |
static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, |
const xmlChar * str); |
@@ -2594,13 +2595,10 @@ xmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED, |
} |
ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2); |
if (ret != 0) { |
- if ((comp1 == NULL) && (res1 != NULL)) |
+ if (res1 != (xmlSchemaValPtr) comp1) |
xmlSchemaFreeValue(res1); |
return (-1); |
} |
- if (res1 == NULL) { |
- return (-1); |
- } |
ret = xmlSchemaCompareValues(res1, res2); |
if (res1 != (xmlSchemaValPtr) comp1) |
xmlSchemaFreeValue(res1); |
@@ -2847,12 +2845,12 @@ xmlRelaxNGCleanupTypes(void) |
} |
/************************************************************************ |
- * * |
- * Compiling element content into regexp * |
- * * |
+ * * |
+ * Compiling element content into regexp * |
+ * * |
* Sometime the element content can be compiled into a pure regexp, * |
* This allows a faster execution and streamability at that level * |
- * * |
+ * * |
************************************************************************/ |
/* from automata.c but not exported */ |
@@ -3059,8 +3057,8 @@ xmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) |
list = list->next; |
} |
xmlAutomataSetFinalState(ctxt->am, ctxt->state); |
- def->contModel = xmlAutomataCompile(ctxt->am); |
- xmlRegexpIsDeterminist(def->contModel); |
+ if (xmlAutomataIsDeterminist(ctxt->am)) |
+ def->contModel = xmlAutomataCompile(ctxt->am); |
xmlFreeAutomata(ctxt->am); |
ctxt->state = oldstate; |
@@ -3325,9 +3323,9 @@ xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def) |
} |
/************************************************************************ |
- * * |
- * Parsing functions * |
- * * |
+ * * |
+ * Parsing functions * |
+ * * |
************************************************************************/ |
static xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr |
@@ -6602,7 +6600,7 @@ xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes) |
} |
/* |
- * Apply 4.17 mergingd rules to defines and starts |
+ * Apply 4.17 merging rules to defines and starts |
*/ |
xmlRelaxNGCombineStart(ctxt, ret); |
if (ret->defs != NULL) { |
@@ -6654,12 +6652,17 @@ xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) |
ctxt->define = NULL; |
if (IS_RELAXNG(node, "grammar")) { |
schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children); |
+ if (schema->topgrammar == NULL) { |
+ xmlRelaxNGFree(schema); |
+ return (NULL); |
+ } |
} else { |
xmlRelaxNGGrammarPtr tmp, ret; |
schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt); |
if (schema->topgrammar == NULL) { |
- return (schema); |
+ xmlRelaxNGFree(schema); |
+ return (NULL); |
} |
/* |
* Link the new grammar in the tree |
@@ -6705,9 +6708,9 @@ xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node) |
} |
/************************************************************************ |
- * * |
- * Reading RelaxNGs * |
- * * |
+ * * |
+ * Reading RelaxNGs * |
+ * * |
************************************************************************/ |
/** |
@@ -7316,7 +7319,7 @@ xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) |
} |
} |
/* |
- * Thisd is not an else since "include" is transformed |
+ * This is not an else since "include" is transformed |
* into a div |
*/ |
if (xmlStrEqual(cur->name, BAD_CAST "div")) { |
@@ -7345,13 +7348,13 @@ xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) |
if (ns != NULL) |
xmlFree(ns); |
/* |
- * Since we are about to delete cur, if it's nsDef is non-NULL we |
+ * Since we are about to delete cur, if its nsDef is non-NULL we |
* need to preserve it (it contains the ns definitions for the |
* children we just moved). We'll just stick it on to the end |
* of cur->parent's list, since it's never going to be re-serialized |
* (bug 143738). |
*/ |
- if (cur->nsDef != NULL) { |
+ if ((cur->nsDef != NULL) && (cur->parent != NULL)) { |
xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef; |
while (parDef->next != NULL) |
parDef = parDef->next; |
@@ -7369,7 +7372,8 @@ xmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root) |
else if ((cur->type == XML_TEXT_NODE) || |
(cur->type == XML_CDATA_SECTION_NODE)) { |
if (IS_BLANK_NODE(cur)) { |
- if (cur->parent->type == XML_ELEMENT_NODE) { |
+ if ((cur->parent != NULL) && |
+ (cur->parent->type == XML_ELEMENT_NODE)) { |
if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value")) |
&& |
(!xmlStrEqual |
@@ -7521,7 +7525,7 @@ xmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt) |
xmlRngPErr(ctxt, (xmlNodePtr) doc, |
XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n", |
(ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL); |
- |
+ |
xmlFreeDoc(ctxt->document); |
ctxt->document = NULL; |
return (NULL); |
@@ -7663,9 +7667,9 @@ xmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt, |
#ifdef LIBXML_OUTPUT_ENABLED |
/************************************************************************ |
- * * |
- * Dump back a compiled form * |
- * * |
+ * * |
+ * Dump back a compiled form * |
+ * * |
************************************************************************/ |
static void xmlRelaxNGDumpDefine(FILE * output, |
xmlRelaxNGDefinePtr define); |
@@ -7806,7 +7810,7 @@ xmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define) |
* xmlRelaxNGDumpGrammar: |
* @output: the file output |
* @grammar: a grammar structure |
- * @top: is this a top grammar |
+ * @top: is this a top grammar |
* |
* Dump a RelaxNG structure back |
*/ |
@@ -7899,9 +7903,9 @@ xmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) |
#endif /* LIBXML_OUTPUT_ENABLED */ |
/************************************************************************ |
- * * |
- * Validation of compiled content * |
- * * |
+ * * |
+ * Validation of compiled content * |
+ * * |
************************************************************************/ |
static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, |
xmlRelaxNGDefinePtr define); |
@@ -8044,9 +8048,9 @@ xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, |
} |
/************************************************************************ |
- * * |
- * Progressive validation of when possible * |
- * * |
+ * * |
+ * Progressive validation of when possible * |
+ * * |
************************************************************************/ |
static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, |
xmlRelaxNGDefinePtr defines); |
@@ -8346,7 +8350,7 @@ xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, |
* xmlRelaxNGValidatePushCData: |
* @ctxt: the RelaxNG validation context |
* @data: some character data read |
- * @len: the lenght of the data |
+ * @len: the length of the data |
* |
* check the CData parsed for validation in the current stack |
* |
@@ -8480,9 +8484,9 @@ xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, |
} |
/************************************************************************ |
- * * |
- * Generic interpreted validation implementation * |
- * * |
+ * * |
+ * Generic interpreted validation implementation * |
+ * * |
************************************************************************/ |
static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, |
xmlRelaxNGDefinePtr define); |
@@ -8884,6 +8888,11 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, |
case XML_RELAXNG_ZEROORMORE:{ |
xmlChar *cur, *temp; |
+ if ((ctxt->state->value == NULL) || |
+ (*ctxt->state->value == 0)) { |
+ ret = 0; |
+ break; |
+ } |
oldflags = ctxt->flags; |
ctxt->flags |= FLAGS_IGNORABLE; |
cur = ctxt->state->value; |
@@ -8905,6 +8914,30 @@ xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, |
xmlRelaxNGPopErrors(ctxt, 0); |
break; |
} |
+ case XML_RELAXNG_OPTIONAL:{ |
+ xmlChar *temp; |
+ |
+ if ((ctxt->state->value == NULL) || |
+ (*ctxt->state->value == 0)) { |
+ ret = 0; |
+ break; |
+ } |
+ oldflags = ctxt->flags; |
+ ctxt->flags |= FLAGS_IGNORABLE; |
+ temp = ctxt->state->value; |
+ ret = xmlRelaxNGValidateValue(ctxt, define->content); |
+ ctxt->flags = oldflags; |
+ if (ret != 0) { |
+ ctxt->state->value = temp; |
+ if (ctxt->errNr > 0) |
+ xmlRelaxNGPopErrors(ctxt, 0); |
+ ret = 0; |
+ break; |
+ } |
+ if (ctxt->errNr > 0) |
+ xmlRelaxNGPopErrors(ctxt, 0); |
+ break; |
+ } |
case XML_RELAXNG_EXCEPT:{ |
xmlRelaxNGDefinePtr list; |
@@ -9020,6 +9053,19 @@ xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, |
return (ret); |
list = list->next; |
} |
+ } else if (define->type == XML_RELAXNG_CHOICE) { |
+ xmlRelaxNGDefinePtr list; |
+ |
+ list = define->nameClass; |
+ while (list != NULL) { |
+ ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); |
+ if (ret == 1) |
+ return (1); |
+ if (ret < 0) |
+ return (ret); |
+ list = list->next; |
+ } |
+ return (0); |
} else { |
TODO} |
return (1); |
@@ -9379,6 +9425,10 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, |
oldstate = ctxt->state; |
for (i = 0; i < nbgroups; i++) { |
ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); |
+ if (ctxt->state == NULL) { |
+ ret = -1; |
+ break; |
+ } |
group = partitions->groups[i]; |
if (lasts[i] != NULL) { |
last = lasts[i]->next; |
@@ -10813,9 +10863,9 @@ xmlRelaxNGCleanPSVI(xmlNodePtr node) { |
return; |
} |
/************************************************************************ |
- * * |
- * Validation interfaces * |
- * * |
+ * * |
+ * Validation interfaces * |
+ * * |
************************************************************************/ |
/** |