diff options
author | Rob Richards <rrichards@php.net> | 2004-07-22 15:50:44 +0000 |
---|---|---|
committer | Rob Richards <rrichards@php.net> | 2004-07-22 15:50:44 +0000 |
commit | 950f950ecdf830162dff0e63d18a763f23297af0 (patch) | |
tree | f04ca49467d5c6e8cbb11731a00263a167556093 /ext/xmlreader/php_xmlreader.c | |
parent | bb23e0d7cc23daaca7f3bcb6d34ca591e0039019 (diff) | |
download | php-git-950f950ecdf830162dff0e63d18a763f23297af0.tar.gz |
add optional name parameter to next()
move to next named sibling skipping subtrees
Diffstat (limited to 'ext/xmlreader/php_xmlreader.c')
-rw-r--r-- | ext/xmlreader/php_xmlreader.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 2c9b5b8355..11cb6110ca 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -760,18 +760,40 @@ PHP_METHOD(xmlreader, read) } /* }}} */ -/* {{{ proto boolean read() +/* {{{ proto boolean next([string localname]) Moves the position of the current instance to the next node in the stream. */ PHP_METHOD(xmlreader, next) { zval *id; - int retval; + int retval, name_len=0; xmlreader_object *intern; + char *name = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len) == FAILURE) { + return; + } id = getThis(); intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC); if (intern != NULL && intern->ptr != NULL) { retval = xmlTextReaderNext(intern->ptr); + while (name != NULL && retval == 1) { +#ifdef PHP_WIN32 + /* xmlTextReaderConstLocalName should be used once its added to win def libxml.def file. + Doing so will not require localname to be freed as its not allocated */ + xmlChar *localname = xmlTextReaderLocalName(intern->ptr); + if (xmlStrEqual(localname, name)) { + xmlFree(localname); + RETURN_TRUE; + } + xmlFree(localname); +#else + if (xmlStrEqual(xmlTextReaderConstLocalName(intern->ptr), name)) { + RETURN_TRUE; + } +#endif + retval = xmlTextReaderNext(intern->ptr); + } if (retval == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occured while reading"); RETURN_FALSE; |