Index: third_party/libxml/valid.c |
diff --git a/third_party/libxml/valid.c b/third_party/libxml/valid.c |
index 2510b8d6a49a00a9072c9093e30a7780ebfdc54d..2cb32f32c841f98e7ce425a308a3d18d4cafa959 100644 |
--- a/third_party/libxml/valid.c |
+++ b/third_party/libxml/valid.c |
@@ -36,6 +36,11 @@ static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, |
"Unimplemented block at %s:%d\n", \ |
__FILE__, __LINE__); |
+#ifdef LIBXML_VALID_ENABLED |
+static int |
+xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, |
+ const xmlChar *value); |
+#endif |
/************************************************************************ |
* * |
* Error handling routines * |
@@ -117,7 +122,7 @@ xmlErrValid(xmlValidCtxtPtr ctxt, xmlParserErrors error, |
__xmlRaiseError(NULL, channel, data, |
pctxt, NULL, XML_FROM_VALID, error, |
XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, |
- msg); |
+ "%s", msg); |
} |
#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) |
@@ -632,8 +637,6 @@ xmlValidStateDebug(xmlValidCtxtPtr ctxt) { |
else if ((doc->intSubset == NULL) && \ |
(doc->extSubset == NULL)) return(0) |
-xmlAttributePtr xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem); |
- |
#ifdef LIBXML_REGEXP_ENABLED |
/************************************************************************ |
@@ -1828,53 +1831,6 @@ xmlDumpEnumeration(xmlBufferPtr buf, xmlEnumerationPtr cur) { |
#ifdef LIBXML_VALID_ENABLED |
/** |
- * xmlScanAttributeDeclCallback: |
- * @attr: the attribute decl |
- * @list: the list to update |
- * |
- * Callback called by xmlScanAttributeDecl when a new attribute |
- * has to be entered in the list. |
- */ |
-static void |
-xmlScanAttributeDeclCallback(xmlAttributePtr attr, xmlAttributePtr *list, |
- const xmlChar* name ATTRIBUTE_UNUSED) { |
- attr->nexth = *list; |
- *list = attr; |
-} |
- |
-/** |
- * xmlScanAttributeDecl: |
- * @dtd: pointer to the DTD |
- * @elem: the element name |
- * |
- * When inserting a new element scan the DtD for existing attributes |
- * for that element and initialize the Attribute chain |
- * |
- * Returns the pointer to the first attribute decl in the chain, |
- * possibly NULL. |
- */ |
-xmlAttributePtr |
-xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem) { |
- xmlAttributePtr ret = NULL; |
- xmlAttributeTablePtr table; |
- |
- if (dtd == NULL) { |
- return(NULL); |
- } |
- if (elem == NULL) { |
- return(NULL); |
- } |
- table = (xmlAttributeTablePtr) dtd->attributes; |
- if (table == NULL) |
- return(NULL); |
- |
- /* WRONG !!! */ |
- xmlHashScan3(table, NULL, NULL, elem, |
- (xmlHashScanner) xmlScanAttributeDeclCallback, &ret); |
- return(ret); |
-} |
- |
-/** |
* xmlScanIDAttributeDecl: |
* @ctxt: the validation context |
* @elem: the element name |
@@ -2024,7 +1980,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, |
return(NULL); |
} |
if ((defaultValue != NULL) && |
- (!xmlValidateAttributeValue(type, defaultValue))) { |
+ (!xmlValidateAttributeValueInternal(dtd->doc, type, defaultValue))) { |
xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_DEFAULT, |
"Attribute %s of %s: invalid default value\n", |
elem, name, defaultValue); |
@@ -2042,8 +1998,10 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, |
(dtd->doc->intSubset != NULL) && |
(dtd->doc->intSubset->attributes != NULL)) { |
ret = xmlHashLookup3(dtd->doc->intSubset->attributes, name, ns, elem); |
- if (ret != NULL) |
+ if (ret != NULL) { |
+ xmlFreeEnumeration(tree); |
return(NULL); |
+ } |
} |
/* |
@@ -2057,6 +2015,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, |
if (table == NULL) { |
xmlVErrMemory(ctxt, |
"xmlAddAttributeDecl: Table creation failed!\n"); |
+ xmlFreeEnumeration(tree); |
return(NULL); |
} |
@@ -2064,6 +2023,7 @@ xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, |
ret = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); |
if (ret == NULL) { |
xmlVErrMemory(ctxt, "malloc failed"); |
+ xmlFreeEnumeration(tree); |
return(NULL); |
} |
memset(ret, 0, sizeof(xmlAttribute)); |
@@ -2719,7 +2679,8 @@ xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { |
(!strcmp((char *) attr->ns->prefix, "xml"))) |
return(1); |
if (doc == NULL) return(0); |
- if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { |
+ if ((doc->intSubset == NULL) && (doc->extSubset == NULL) && |
+ (doc->type != XML_HTML_DOCUMENT_NODE)) { |
return(0); |
} else if (doc->type == XML_HTML_DOCUMENT_NODE) { |
if ((xmlStrEqual(BAD_CAST "id", attr->name)) || |
@@ -3390,7 +3351,8 @@ int |
xmlValidateNotationUse(xmlValidCtxtPtr ctxt, xmlDocPtr doc, |
const xmlChar *notationName) { |
xmlNotationPtr notaDecl; |
- if ((doc == NULL) || (doc->intSubset == NULL)) return(-1); |
+ if ((doc == NULL) || (doc->intSubset == NULL) || |
+ (notationName == NULL)) return(-1); |
notaDecl = xmlGetDtdNotationDesc(doc->intSubset, notationName); |
if ((notaDecl == NULL) && (doc->extSubset != NULL)) |
@@ -3445,8 +3407,78 @@ xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { |
} |
#ifdef LIBXML_VALID_ENABLED |
+ |
+static int |
+xmlIsDocNameStartChar(xmlDocPtr doc, int c) { |
+ if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { |
+ /* |
+ * Use the new checks of production [4] [4a] amd [5] of the |
+ * Update 5 of XML-1.0 |
+ */ |
+ if (((c >= 'a') && (c <= 'z')) || |
+ ((c >= 'A') && (c <= 'Z')) || |
+ (c == '_') || (c == ':') || |
+ ((c >= 0xC0) && (c <= 0xD6)) || |
+ ((c >= 0xD8) && (c <= 0xF6)) || |
+ ((c >= 0xF8) && (c <= 0x2FF)) || |
+ ((c >= 0x370) && (c <= 0x37D)) || |
+ ((c >= 0x37F) && (c <= 0x1FFF)) || |
+ ((c >= 0x200C) && (c <= 0x200D)) || |
+ ((c >= 0x2070) && (c <= 0x218F)) || |
+ ((c >= 0x2C00) && (c <= 0x2FEF)) || |
+ ((c >= 0x3001) && (c <= 0xD7FF)) || |
+ ((c >= 0xF900) && (c <= 0xFDCF)) || |
+ ((c >= 0xFDF0) && (c <= 0xFFFD)) || |
+ ((c >= 0x10000) && (c <= 0xEFFFF))) |
+ return(1); |
+ } else { |
+ if (IS_LETTER(c) || (c == '_') || (c == ':')) |
+ return(1); |
+ } |
+ return(0); |
+} |
+ |
+static int |
+xmlIsDocNameChar(xmlDocPtr doc, int c) { |
+ if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { |
+ /* |
+ * Use the new checks of production [4] [4a] amd [5] of the |
+ * Update 5 of XML-1.0 |
+ */ |
+ if (((c >= 'a') && (c <= 'z')) || |
+ ((c >= 'A') && (c <= 'Z')) || |
+ ((c >= '0') && (c <= '9')) || /* !start */ |
+ (c == '_') || (c == ':') || |
+ (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ |
+ ((c >= 0xC0) && (c <= 0xD6)) || |
+ ((c >= 0xD8) && (c <= 0xF6)) || |
+ ((c >= 0xF8) && (c <= 0x2FF)) || |
+ ((c >= 0x300) && (c <= 0x36F)) || /* !start */ |
+ ((c >= 0x370) && (c <= 0x37D)) || |
+ ((c >= 0x37F) && (c <= 0x1FFF)) || |
+ ((c >= 0x200C) && (c <= 0x200D)) || |
+ ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ |
+ ((c >= 0x2070) && (c <= 0x218F)) || |
+ ((c >= 0x2C00) && (c <= 0x2FEF)) || |
+ ((c >= 0x3001) && (c <= 0xD7FF)) || |
+ ((c >= 0xF900) && (c <= 0xFDCF)) || |
+ ((c >= 0xFDF0) && (c <= 0xFFFD)) || |
+ ((c >= 0x10000) && (c <= 0xEFFFF))) |
+ return(1); |
+ } else { |
+ if ((IS_LETTER(c)) || (IS_DIGIT(c)) || |
+ (c == '.') || (c == '-') || |
+ (c == '_') || (c == ':') || |
+ (IS_COMBINING(c)) || |
+ (IS_EXTENDER(c))) |
+ return(1); |
+ } |
+ return(0); |
+} |
+ |
/** |
* xmlValidateNameValue: |
+ * @doc: pointer to the document or NULL |
* @value: an Name value |
* |
* Validate that the given value match Name production |
@@ -3454,8 +3486,8 @@ xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { |
* returns 1 if valid or 0 otherwise |
*/ |
-int |
-xmlValidateNameValue(const xmlChar *value) { |
+static int |
+xmlValidateNameValueInternal(xmlDocPtr doc, const xmlChar *value) { |
const xmlChar *cur; |
int val, len; |
@@ -3463,18 +3495,12 @@ xmlValidateNameValue(const xmlChar *value) { |
cur = value; |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- if (!IS_LETTER(val) && (val != '_') && |
- (val != ':')) { |
+ if (!xmlIsDocNameStartChar(doc, val)) |
return(0); |
- } |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3485,7 +3511,22 @@ xmlValidateNameValue(const xmlChar *value) { |
} |
/** |
- * xmlValidateNamesValue: |
+ * xmlValidateNameValue: |
+ * @value: an Name value |
+ * |
+ * Validate that the given value match Name production |
+ * |
+ * returns 1 if valid or 0 otherwise |
+ */ |
+ |
+int |
+xmlValidateNameValue(const xmlChar *value) { |
+ return(xmlValidateNameValueInternal(NULL, value)); |
+} |
+ |
+/** |
+ * xmlValidateNamesValueInternal: |
+ * @doc: pointer to the document or NULL |
* @value: an Names value |
* |
* Validate that the given value match Names production |
@@ -3493,8 +3534,8 @@ xmlValidateNameValue(const xmlChar *value) { |
* returns 1 if valid or 0 otherwise |
*/ |
-int |
-xmlValidateNamesValue(const xmlChar *value) { |
+static int |
+xmlValidateNamesValueInternal(xmlDocPtr doc, const xmlChar *value) { |
const xmlChar *cur; |
int val, len; |
@@ -3502,19 +3543,13 @@ xmlValidateNamesValue(const xmlChar *value) { |
cur = value; |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- |
- if (!IS_LETTER(val) && (val != '_') && |
- (val != ':')) { |
+ |
+ if (!xmlIsDocNameStartChar(doc, val)) |
return(0); |
- } |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3526,18 +3561,13 @@ xmlValidateNamesValue(const xmlChar *value) { |
cur += len; |
} |
- if (!IS_LETTER(val) && (val != '_') && |
- (val != ':')) { |
+ if (!xmlIsDocNameStartChar(doc, val)) |
return(0); |
- } |
+ |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3549,18 +3579,33 @@ xmlValidateNamesValue(const xmlChar *value) { |
} |
/** |
- * xmlValidateNmtokenValue: |
+ * xmlValidateNamesValue: |
+ * @value: an Names value |
+ * |
+ * Validate that the given value match Names production |
+ * |
+ * returns 1 if valid or 0 otherwise |
+ */ |
+ |
+int |
+xmlValidateNamesValue(const xmlChar *value) { |
+ return(xmlValidateNamesValueInternal(NULL, value)); |
+} |
+ |
+/** |
+ * xmlValidateNmtokenValueInternal: |
+ * @doc: pointer to the document or NULL |
* @value: an Nmtoken value |
* |
* Validate that the given value match Nmtoken production |
* |
* [ VC: Name Token ] |
- * |
+ * |
* returns 1 if valid or 0 otherwise |
*/ |
-int |
-xmlValidateNmtokenValue(const xmlChar *value) { |
+static int |
+xmlValidateNmtokenValueInternal(xmlDocPtr doc, const xmlChar *value) { |
const xmlChar *cur; |
int val, len; |
@@ -3568,19 +3613,13 @@ xmlValidateNmtokenValue(const xmlChar *value) { |
cur = value; |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- |
- if (!IS_LETTER(val) && !IS_DIGIT(val) && |
- (val != '.') && (val != '-') && |
- (val != '_') && (val != ':') && |
- (!IS_COMBINING(val)) && |
- (!IS_EXTENDER(val))) |
+ |
+ if (!xmlIsDocNameChar(doc, val)) |
return(0); |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ val = xmlStringCurrentChar(NULL, cur, &len); |
+ cur += len; |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3591,18 +3630,35 @@ xmlValidateNmtokenValue(const xmlChar *value) { |
} |
/** |
- * xmlValidateNmtokensValue: |
+ * xmlValidateNmtokenValue: |
+ * @value: an Nmtoken value |
+ * |
+ * Validate that the given value match Nmtoken production |
+ * |
+ * [ VC: Name Token ] |
+ * |
+ * returns 1 if valid or 0 otherwise |
+ */ |
+ |
+int |
+xmlValidateNmtokenValue(const xmlChar *value) { |
+ return(xmlValidateNmtokenValueInternal(NULL, value)); |
+} |
+ |
+/** |
+ * xmlValidateNmtokensValueInternal: |
+ * @doc: pointer to the document or NULL |
* @value: an Nmtokens value |
* |
* Validate that the given value match Nmtokens production |
* |
* [ VC: Name Token ] |
- * |
+ * |
* returns 1 if valid or 0 otherwise |
*/ |
-int |
-xmlValidateNmtokensValue(const xmlChar *value) { |
+static int |
+xmlValidateNmtokensValueInternal(xmlDocPtr doc, const xmlChar *value) { |
const xmlChar *cur; |
int val, len; |
@@ -3610,24 +3666,16 @@ xmlValidateNmtokensValue(const xmlChar *value) { |
cur = value; |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
- |
+ |
while (IS_BLANK(val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
- if (!IS_LETTER(val) && !IS_DIGIT(val) && |
- (val != '.') && (val != '-') && |
- (val != '_') && (val != ':') && |
- (!IS_COMBINING(val)) && |
- (!IS_EXTENDER(val))) |
+ if (!xmlIsDocNameChar(doc, val)) |
return(0); |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3640,18 +3688,13 @@ xmlValidateNmtokensValue(const xmlChar *value) { |
} |
if (val == 0) return(1); |
- if (!IS_LETTER(val) && !IS_DIGIT(val) && |
- (val != '.') && (val != '-') && |
- (val != '_') && (val != ':') && |
- (!IS_COMBINING(val)) && |
- (!IS_EXTENDER(val))) |
+ if (!xmlIsDocNameChar(doc, val)) |
return(0); |
- while ((IS_LETTER(val)) || (IS_DIGIT(val)) || |
- (val == '.') || (val == '-') || |
- (val == '_') || (val == ':') || |
- (IS_COMBINING(val)) || |
- (IS_EXTENDER(val))) { |
+ val = xmlStringCurrentChar(NULL, cur, &len); |
+ cur += len; |
+ |
+ while (xmlIsDocNameChar(doc, val)) { |
val = xmlStringCurrentChar(NULL, cur, &len); |
cur += len; |
} |
@@ -3663,6 +3706,22 @@ xmlValidateNmtokensValue(const xmlChar *value) { |
} |
/** |
+ * xmlValidateNmtokensValue: |
+ * @value: an Nmtokens value |
+ * |
+ * Validate that the given value match Nmtokens production |
+ * |
+ * [ VC: Name Token ] |
+ * |
+ * returns 1 if valid or 0 otherwise |
+ */ |
+ |
+int |
+xmlValidateNmtokensValue(const xmlChar *value) { |
+ return(xmlValidateNmtokensValueInternal(NULL, value)); |
+} |
+ |
+/** |
* xmlValidateNotationDecl: |
* @ctxt: the validation context |
* @doc: a document instance |
@@ -3686,6 +3745,40 @@ xmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATT |
} |
/** |
+ * xmlValidateAttributeValueInternal: |
+ * @doc: the document |
+ * @type: an attribute type |
+ * @value: an attribute value |
+ * |
+ * Validate that the given attribute value match the proper production |
+ * |
+ * returns 1 if valid or 0 otherwise |
+ */ |
+ |
+static int |
+xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, |
+ const xmlChar *value) { |
+ switch (type) { |
+ case XML_ATTRIBUTE_ENTITIES: |
+ case XML_ATTRIBUTE_IDREFS: |
+ return(xmlValidateNamesValueInternal(doc, value)); |
+ case XML_ATTRIBUTE_ENTITY: |
+ case XML_ATTRIBUTE_IDREF: |
+ case XML_ATTRIBUTE_ID: |
+ case XML_ATTRIBUTE_NOTATION: |
+ return(xmlValidateNameValueInternal(doc, value)); |
+ case XML_ATTRIBUTE_NMTOKENS: |
+ case XML_ATTRIBUTE_ENUMERATION: |
+ return(xmlValidateNmtokensValueInternal(doc, value)); |
+ case XML_ATTRIBUTE_NMTOKEN: |
+ return(xmlValidateNmtokenValueInternal(doc, value)); |
+ case XML_ATTRIBUTE_CDATA: |
+ break; |
+ } |
+ return(1); |
+} |
+ |
+/** |
* xmlValidateAttributeValue: |
* @type: an attribute type |
* @value: an attribute value |
@@ -3709,27 +3802,9 @@ xmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATT |
* |
* returns 1 if valid or 0 otherwise |
*/ |
- |
int |
xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) { |
- switch (type) { |
- case XML_ATTRIBUTE_ENTITIES: |
- case XML_ATTRIBUTE_IDREFS: |
- return(xmlValidateNamesValue(value)); |
- case XML_ATTRIBUTE_ENTITY: |
- case XML_ATTRIBUTE_IDREF: |
- case XML_ATTRIBUTE_ID: |
- case XML_ATTRIBUTE_NOTATION: |
- return(xmlValidateNameValue(value)); |
- case XML_ATTRIBUTE_NMTOKENS: |
- case XML_ATTRIBUTE_ENUMERATION: |
- return(xmlValidateNmtokensValue(value)); |
- case XML_ATTRIBUTE_NMTOKEN: |
- return(xmlValidateNmtokenValue(value)); |
- case XML_ATTRIBUTE_CDATA: |
- break; |
- } |
- return(1); |
+ return(xmlValidateAttributeValueInternal(NULL, type, value)); |
} |
/** |
@@ -3978,13 +4053,10 @@ xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, |
if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { |
xmlChar fn[50]; |
xmlChar *fullname; |
- |
+ |
fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); |
if (fullname == NULL) |
return(NULL); |
- attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, name); |
- if ((attrDecl == NULL) && (doc->extSubset != NULL)) |
- attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, name); |
if ((fullname != fn) && (fullname != elem->name)) |
xmlFree(fullname); |
} |
@@ -4047,11 +4119,12 @@ xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, |
int val; |
CHECK_DTD; |
if(attr == NULL) return(1); |
- |
+ |
/* Attribute Default Legal */ |
/* Enumeration */ |
if (attr->defaultValue != NULL) { |
- val = xmlValidateAttributeValue(attr->atype, attr->defaultValue); |
+ val = xmlValidateAttributeValueInternal(doc, attr->atype, |
+ attr->defaultValue); |
if (val == 0) { |
xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT, |
"Syntax of default value for attribute %s of %s is not valid\n", |
@@ -4182,15 +4255,15 @@ xmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, |
while (next != NULL) { |
if (next->type == XML_ELEMENT_CONTENT_ELEMENT) { |
if ((xmlStrEqual(next->name, name)) && |
- (xmlStrEqual(next->prefix, cur->prefix))) { |
- if (cur->prefix == NULL) { |
+ (xmlStrEqual(next->prefix, cur->c1->prefix))) { |
+ if (cur->c1->prefix == NULL) { |
xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, |
"Definition of %s has duplicate references of %s\n", |
elem->name, name, NULL); |
} else { |
xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, |
"Definition of %s has duplicate references of %s:%s\n", |
- elem->name, cur->prefix, name); |
+ elem->name, cur->c1->prefix, name); |
} |
ret = 0; |
} |
@@ -4199,15 +4272,15 @@ xmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, |
if (next->c1 == NULL) break; |
if (next->c1->type != XML_ELEMENT_CONTENT_ELEMENT) break; |
if ((xmlStrEqual(next->c1->name, name)) && |
- (xmlStrEqual(next->c1->prefix, cur->prefix))) { |
- if (cur->prefix == NULL) { |
+ (xmlStrEqual(next->c1->prefix, cur->c1->prefix))) { |
+ if (cur->c1->prefix == NULL) { |
xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, |
"Definition of %s has duplicate references to %s\n", |
elem->name, name, NULL); |
} else { |
xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, |
"Definition of %s has duplicate references to %s:%s\n", |
- elem->name, cur->prefix, name); |
+ elem->name, cur->c1->prefix, name); |
} |
ret = 0; |
} |
@@ -4332,7 +4405,7 @@ xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, |
} |
attr->atype = attrDecl->atype; |
- val = xmlValidateAttributeValue(attrDecl->atype, value); |
+ val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); |
if (val == 0) { |
xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, |
"Syntax of value for attribute %s of %s is not valid\n", |
@@ -4517,7 +4590,7 @@ xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { |
return(0); |
} |
- val = xmlValidateAttributeValue(attrDecl->atype, value); |
+ val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); |
if (val == 0) { |
if (ns->prefix != NULL) { |
xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, |
@@ -6673,7 +6746,7 @@ xmlValidateDtdFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { |
xmlAttributeTablePtr table; |
xmlEntitiesTablePtr entities; |
- if (doc == NULL) return(0); |
+ if ((doc == NULL) || (ctxt == NULL)) return(0); |
if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) |
return(0); |
ctxt->doc = doc; |