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
diff --git a/xmlreader.c b/xmlreader.c
index 5649da9..9655624 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -91,6 +91,7 @@
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 @@
}
}
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 @@
*/
int
xmlTextReaderRead(xmlTextReaderPtr reader) {
- int val, olddepth;
+ int val, olddepth, wasempty;
xmlTextReaderState oldstate;
xmlNodePtr oldnode;
@@ -373,6 +374,9 @@
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 @@
(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 @@
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);
}