mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-03-19 14:50:07 +03:00
Fixed the empty node detection to avoid reporting an inexistant close tag.
* xmlreader.c: Fixed the empty node detection to avoid reporting an inexistant close tag. Daniel
This commit is contained in:
parent
0d132cffc1
commit
df512f4060
@ -1,3 +1,8 @@
|
||||
Mon Dec 23 16:54:22 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||
|
||||
* xmlreader.c: Fixed the empty node detection to avoid reporting
|
||||
an inexistant close tag.
|
||||
|
||||
Mon Dec 23 15:42:24 CET 2002 Daniel Veillard <daniel@veillard.com>
|
||||
|
||||
* python/libxml.c python/setup.py.in: patch from Stéphane Bidoul
|
||||
|
26
xmlreader.c
26
xmlreader.c
@ -91,6 +91,7 @@ struct _xmlTextReader {
|
||||
xmlNodePtr curnode;/* current attribute node */
|
||||
int depth; /* depth of the current node */
|
||||
xmlNodePtr faketext;/* fake xmlNs chld */
|
||||
int wasempty;/* was the last node empty */
|
||||
};
|
||||
|
||||
#ifdef DEBUG_READER
|
||||
@ -174,9 +175,9 @@ xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) {
|
||||
}
|
||||
}
|
||||
if (reader->state == XML_TEXTREADER_ELEMENT)
|
||||
reader->state = XML_TEXTREADER_EMPTY;
|
||||
reader->wasempty = 1;
|
||||
else
|
||||
reader->state = XML_TEXTREADER_END;
|
||||
reader->wasempty = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -335,7 +336,7 @@ xmlTextReaderPushData(xmlTextReaderPtr reader) {
|
||||
*/
|
||||
int
|
||||
xmlTextReaderRead(xmlTextReaderPtr reader) {
|
||||
int val, olddepth;
|
||||
int val, olddepth, wasempty;
|
||||
xmlTextReaderState oldstate;
|
||||
xmlNodePtr oldnode;
|
||||
|
||||
@ -373,6 +374,9 @@ xmlTextReaderRead(xmlTextReaderPtr reader) {
|
||||
oldstate = reader->state;
|
||||
olddepth = reader->ctxt->nodeNr;
|
||||
oldnode = reader->node;
|
||||
wasempty = ((reader->wasempty == 1) && (reader->ctxt->node != NULL) &&
|
||||
(reader->ctxt->node->last == reader->node));
|
||||
|
||||
/*
|
||||
* If we are not backtracking on ancestors or examined nodes,
|
||||
* that the parser didn't finished or that we arent at the end
|
||||
@ -397,16 +401,15 @@ xmlTextReaderRead(xmlTextReaderPtr reader) {
|
||||
(reader->node->type != XML_DTD_NODE)) {
|
||||
reader->node = reader->node->children;
|
||||
reader->depth++;
|
||||
if ((reader->state != XML_TEXTREADER_ELEMENT) &&
|
||||
(reader->state != XML_TEXTREADER_EMPTY))
|
||||
reader->state = XML_TEXTREADER_ELEMENT;
|
||||
reader->state = XML_TEXTREADER_ELEMENT;
|
||||
DUMP_READER
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
if (reader->node->next != NULL) {
|
||||
if ((oldstate == XML_TEXTREADER_ELEMENT) &&
|
||||
(reader->node->type == XML_ELEMENT_NODE)) {
|
||||
(reader->node->type == XML_ELEMENT_NODE) &&
|
||||
(wasempty == 0)) {
|
||||
reader->state = XML_TEXTREADER_END;
|
||||
DUMP_READER
|
||||
return(1);
|
||||
@ -1410,10 +1413,15 @@ int
|
||||
xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) {
|
||||
if ((reader == NULL) || (reader->node == NULL))
|
||||
return(-1);
|
||||
if (reader->node->type != XML_ELEMENT_NODE)
|
||||
return(0);
|
||||
if (reader->node->children != NULL)
|
||||
return(0);
|
||||
if ((reader->state == XML_TEXTREADER_EMPTY) ||
|
||||
(reader->state == XML_TEXTREADER_BACKTRACK))
|
||||
if (reader->node != reader->ctxt->node)
|
||||
return(1);
|
||||
if ((reader->ctxt->node != NULL) &&
|
||||
(reader->node == reader->ctxt->node->last) &&
|
||||
(reader->wasempty == 1))
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user