From 50e5b428562964b1eb2f876370058b34b47c5e90 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Sun, 27 Mar 2005 13:13:58 +0000 Subject: Load /tmp/tmp.XJZ6qc/libxml2-2.6.18 into packages/libxml2/branches/upstream/current. --- xmlreader.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 3 deletions(-) (limited to 'xmlreader.c') diff --git a/xmlreader.c b/xmlreader.c index b467c1c..e16128b 100644 --- a/xmlreader.c +++ b/xmlreader.c @@ -1163,6 +1163,44 @@ xmlTextReaderDoExpand(xmlTextReaderPtr reader) { return(1); } +/** + * xmlTextReaderCollectSiblings: + * @node: the first child + * + * Traverse depth-first through all sibling nodes and their children + * nodes and concatenate their content. This is an auxiliary function + * to xmlTextReaderReadString. + * + * Returns a string containing the content, or NULL in case of error. + */ +static xmlChar * +xmlTextReaderCollectSiblings(xmlNodePtr node) +{ + xmlBufferPtr buffer; + xmlChar *ret; + + buffer = xmlBufferCreate(); + if (buffer == NULL) + return NULL; + + for ( ; node != NULL; node = node->next) { + switch (node->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + xmlBufferCat(buffer, node->content); + break; + case XML_ELEMENT_NODE: + xmlBufferCat(buffer, xmlTextReaderCollectSiblings(node->children)); + default: + break; + } + } + ret = buffer->content; + buffer->content = NULL; + xmlBufferFree(buffer); + return(ret); +} + /** * xmlTextReaderRead: * @reader: the xmlTextReaderPtr used @@ -1551,7 +1589,7 @@ xmlTextReaderNext(xmlTextReaderPtr reader) { cur = reader->node; if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) return(xmlTextReaderRead(reader)); - if (reader->state == XML_TEXTREADER_END) + if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK) return(xmlTextReaderRead(reader)); if (cur->extra & NODE_IS_EMPTY) return(xmlTextReaderRead(reader)); @@ -1606,8 +1644,29 @@ xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { * The string must be deallocated by the caller. */ xmlChar * -xmlTextReaderReadString(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { - TODO +xmlTextReaderReadString(xmlTextReaderPtr reader) +{ + xmlNodePtr node; + + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + + node = (reader->curnode != NULL) ? reader->curnode : reader->node; + switch (node->type) { + case XML_TEXT_NODE: + if (node->content != NULL) + return(xmlStrdup(node->content)); + break; + case XML_ELEMENT_NODE: + if (xmlTextReaderDoExpand(reader) != -1) { + return xmlTextReaderCollectSiblings(node->children); + } + case XML_ATTRIBUTE_NODE: + TODO + break; + default: + break; + } return(NULL); } @@ -4457,6 +4516,27 @@ xmlTextReaderSetup(xmlTextReaderPtr reader, return (0); } +/** + * xmlTextReaderByteConsumed: + * @reader: an XML reader + * + * This function provides the current index of the parser used + * by the reader, relative to the start of the current entity. + * This function actually just wraps a call to xmlBytesConsumed() + * for the parser context associated with the reader. + * See xmlBytesConsumed() for more information. + * + * Returns the index in bytes from the beginning of the entity or -1 + * in case the index could not be computed. + */ +long +xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + return(xmlByteConsumed(reader->ctxt)); +} + + /** * xmlReaderWalker: * @doc: a preparsed document -- cgit v1.2.3