GitLab repository storage has been migrated to hashed layout. Please contact Infrastructure team if you notice any issues with repositories or hooks.

Commit ef8dd7be authored by Daniel Veillard's avatar Daniel Veillard

fixing bug #108976 get the ID/REFs to reference the ID in the document

* parser.c: fixing bug #108976 get the ID/REFs to reference
  the ID in the document content and not in the entity copy
* SAX.c include/libxml/parser.h: more checking of the ID/REF
  stuff, better solution for #107208
* xmlregexp.c: removed a direct printf, dohhh
* xmlreader.c: fixed a bug on streaming validation of empty
  elements in entities
* result/VC/ElementValid8 test/VCM/v20.xml result/valid/xhtml1.xhtml:
  cleanup of the validation tests
* test/valid/id* test/valid/dtds/destfoo.ent result/valid/id*:
  added more ID/IDREF tests to the suite
Daniel
parent 2cfd9dff
Sun Mar 23 12:57:00 CET 2003 Daniel Veillard <daniel@veillard.com>
* parser.c: fixing bug #108976 get the ID/REFs to reference
the ID in the document content and not in the entity copy
* SAX.c include/libxml/parser.h: more checking of the ID/REF
stuff, better solution for #107208
* xmlregexp.c: removed a direct printf, dohhh
* xmlreader.c: fixed a bug on streaming validation of empty
elements in entities
* result/VC/ElementValid8 test/VCM/v20.xml result/valid/xhtml1.xhtml:
cleanup of the validation tests
* test/valid/id* test/valid/dtds/destfoo.ent result/valid/id*:
added more ID/IDREF tests to the suite
Sat Mar 22 23:38:08 CET 2003 Daniel Veillard <daniel@veillard.com>
* xmlreader.c: fixed #107043 removing 2 warnings with Sun One
......
......@@ -880,7 +880,7 @@ my_attribute(void *ctx, const xmlChar *fullname, const xmlChar *value,
0,0,0);
ctxt->depth--;
} else {
val = value;
val = (xmlChar *) value;
}
if (val[0] != 0) {
......@@ -932,7 +932,7 @@ my_attribute(void *ctx, const xmlChar *fullname, const xmlChar *value,
0,0,0);
ctxt->depth--;
} else {
val = value;
val = (xmlChar *) value;
}
if (val[0] == 0) {
......@@ -1068,9 +1068,9 @@ my_attribute(void *ctx, const xmlChar *fullname, const xmlChar *value,
ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc,
ctxt->node, ret, value);
}
} else if ((((ctxt->replaceEntities == 0) && (ctxt->external != 2)) ||
((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0))) &&
(ctxt->depth == 0)) {
} else if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
(((ctxt->replaceEntities == 0) && (ctxt->external != 2)) ||
((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) {
/*
* when validating, the ID registration is done at the attribute
* validation level. Otherwise we have to do specific handling here.
......
......@@ -133,6 +133,14 @@ typedef enum {
*/
#define XML_COMPLETE_ATTRS 4
/**
* XML_SKIP_IDS:
*
* Bit in the loadsubset context field to tell to not do ID/REFs registration.
* Used to initialize xmlLoadExtDtdDefaultValue in some special cases.
*/
#define XML_SKIP_IDS 8
/**
* xmlParserCtxt:
*
......
......@@ -5620,24 +5620,57 @@ xmlParseReference(xmlParserCtxtPtr ctxt) {
* a simple tree copy for all references except the first
* In the first occurrence list contains the replacement
*/
if (list == NULL) {
xmlNodePtr new = NULL, cur, firstChild = NULL;
if ((list == NULL) && (ent->owner == 0)) {
xmlNodePtr nw = NULL, cur, firstChild = NULL;
cur = ent->children;
while (cur != NULL) {
new = xmlCopyNode(cur, 1);
if (new != NULL) {
new->_private = cur->_private;
nw = xmlCopyNode(cur, 1);
if (nw != NULL) {
nw->_private = cur->_private;
if (firstChild == NULL){
firstChild = new;
firstChild = nw;
}
xmlAddChild(ctxt->node, new);
xmlAddChild(ctxt->node, nw);
}
if (cur == ent->last)
break;
cur = cur->next;
}
if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)
xmlAddEntityReference(ent, firstChild, new);
xmlAddEntityReference(ent, firstChild, nw);
} else if (list == NULL) {
xmlNodePtr nw = NULL, cur, next, last,
firstChild = NULL;
/*
* Copy the entity child list and make it the new
* entity child list. The goal is to make sure any
* ID or REF referenced will be the one from the
* document content and not the entity copy.
*/
cur = ent->children;
ent->children = NULL;
last = ent->last;
ent->last = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = NULL;
cur->parent = NULL;
nw = xmlCopyNode(cur, 1);
if (nw != NULL) {
nw->_private = cur->_private;
if (firstChild == NULL){
firstChild = cur;
}
xmlAddChild((xmlNodePtr) ent, nw);
xmlAddChild(ctxt->node, cur);
}
if (cur == last)
break;
cur = next;
}
ent->owner = 1;
if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)
xmlAddEntityReference(ent, firstChild, nw);
} else {
/*
* the name change is to avoid coalescing of the
......@@ -9976,6 +10009,12 @@ xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt,
ctxt->validate = 0;
ctxt->loadsubset = oldctxt->loadsubset;
if ((oldctxt->validate) || (oldctxt->replaceEntities != 0)) {
/*
* ID/IDREF registration will be done in xmlValidateElement below
*/
ctxt->loadsubset |= XML_SKIP_IDS;
}
xmlParseContent(ctxt);
if ((RAW == '<') && (NXT(1) == '/')) {
......
./test/VC/ElementValid8:7: validity warning: Content model for Element doc is ambiguous
./test/VC/ElementValid8:7: validity error: Content model of doc is not determinist: ((a , b) | (a , c))
<doc><a/><c> doc is non-deterministic </c></doc>
^
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
]>
<doc>
<src ref="foo"/>
<dest id="foo"/>
<src ref="foo"/>
</doc>
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
<!ENTITY dest "<dest id='foo'/>">
]>
<doc>
<src ref="foo"/>
&dest;
<src ref="foo"/>
</doc>
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
<!ENTITY dest SYSTEM "dtds/destfoo.ent">
]>
<doc>
<src ref="foo"/>
&dest;
<src ref="foo"/>
</doc>
......@@ -6,7 +6,7 @@
<title>XHTML 1.0: The Extensible HyperText Markup
Language</title>
<link rel="stylesheet" href="W3C-PR.css" type="text/css" />
<style type="text/css"><![CDATA[
<style type="text/css">
span.term { font-style: italic; color: rgb(0, 0, 192) }
code {
color: green;
......@@ -49,7 +49,7 @@ div.contents {
}
.tocline { list-style: none; }
table.exceptions { background-color: rgb(255,255,153); }
]]></style>
</style>
</head>
<body>
<div class="navbar">
......
<!DOCTYPE doc [
<!ELEMENT doc ((a | b)*, a, b) >
<!ELEMENT doc ((a | b)*, c, b) >
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
<!ELEMENT c EMPTY>
]>
<doc>
<a/>
<c/>
<b/>
</doc>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
]>
<doc>
<src ref="foo"/>
<dest id="foo"/>
<src ref="foo"/>
</doc>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
<!ENTITY dest "<dest id='foo'/>">
]>
<doc>
<src ref="foo"/>
&dest;
<src ref="foo"/>
</doc>
<!DOCTYPE doc [
<!ELEMENT doc (src | dest)*>
<!ELEMENT src EMPTY>
<!ELEMENT dest EMPTY>
<!ATTLIST src ref IDREF #IMPLIED>
<!ATTLIST dest id ID #IMPLIED>
<!ENTITY dest SYSTEM "dtds/destfoo.ent">
]>
<doc>
<src ref="foo"/>
&dest;
<src ref="foo"/>
</doc>
......@@ -5170,6 +5170,7 @@ xmlValidatePushElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
xmlElementPtr eDecl;
int extsubset = 0;
/* printf("PushElem %s\n", qname); */
if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) {
xmlValidStatePtr state = ctxt->vstate;
xmlElementPtr elemDecl;
......@@ -5257,6 +5258,7 @@ int
xmlValidatePushCData(xmlValidCtxtPtr ctxt, const xmlChar *data, int len) {
int ret = 1;
/* printf("CDATA %s %d\n", data, len); */
if (len <= 0)
return(ret);
if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) {
......@@ -5330,6 +5332,7 @@ xmlValidatePopElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED,
const xmlChar *qname ATTRIBUTE_UNUSED) {
int ret = 1;
/* printf("PopElem %s\n", qname); */
if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) {
xmlValidStatePtr state = ctxt->vstate;
xmlElementPtr elemDecl;
......
......@@ -524,6 +524,8 @@ xmlTextReaderValidateEntity(xmlTextReaderPtr reader) {
if (node->children != NULL) {
node = node->children;
continue;
} else if (node->type == XML_ELEMENT_NODE) {
xmlTextReaderValidatePop(reader);
}
if (node->next != NULL) {
node = node->next;
......
......@@ -455,7 +455,6 @@ xmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) {
prev = transitions[stateno * (nbatoms + 1) + atomno + 1];
if (prev != 0) {
if (prev != targetno + 1) {
printf("not determinist\n");
ret->determinist = 0;
#ifdef DEBUG_COMPACTION
printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment