From: Marcus Boerger Date: Sun, 18 Jan 2004 16:25:26 +0000 (+0000) Subject: Fix problems with manual iteration X-Git-Tag: php_ibase_before_split~130 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94e64e3d8bb6ed5e39b7c73311b8123edf122ab8;p=php Fix problems with manual iteration --- diff --git a/ext/spl/spl_sxe.c b/ext/spl/spl_sxe.c index 0e22f80617..6d856cc876 100755 --- a/ext/spl/spl_sxe.c +++ b/ext/spl/spl_sxe.c @@ -57,6 +57,10 @@ SPL_METHOD(SimpleXMLIterator, current) /* {{{ */ { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + if (!sxe->iter.data) { + return; /* return NULL */ + } + RETURN_ZVAL(sxe->iter.data, 1, 0); } /* }}} */ @@ -64,11 +68,16 @@ SPL_METHOD(SimpleXMLIterator, current) /* {{{ */ SPL_METHOD(SimpleXMLIterator, key) /* {{{ */ { xmlNodePtr curnode; - + php_sxe_object *intern; php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - if (sxe->node != NULL) { - curnode = (xmlNodePtr)((php_libxml_node_ptr *)sxe->node)->node; + if (!sxe->iter.data) { + RETURN_FALSE; + } + + intern = (php_sxe_object *)zend_object_store_get_object(sxe->iter.data TSRMLS_CC); + if (intern != NULL && intern->node != NULL) { + curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->node)->node; RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name), 1); } @@ -89,9 +98,14 @@ SPL_METHOD(SimpleXMLIterator, next) /* {{{ */ SPL_METHOD(SimpleXMLIterator, hasChildren) { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - php_sxe_object *child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC); + php_sxe_object *child; xmlNodePtr node; + if (!sxe->iter.data) { + RETURN_FALSE; + } + child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC); + GET_NODE(child, node); if (node) { node = node->children; @@ -109,6 +123,9 @@ SPL_METHOD(SimpleXMLIterator, getChildren) { php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); + if (!sxe->iter.data) { + return; /* return NULL */ + } return_value->type = IS_OBJECT; return_value->value.obj = zend_objects_store_clone_obj(sxe->iter.data TSRMLS_CC); } diff --git a/ext/spl/tests/sxe_003.phpt b/ext/spl/tests/sxe_003.phpt new file mode 100755 index 0000000000..d247896887 --- /dev/null +++ b/ext/spl/tests/sxe_003.phpt @@ -0,0 +1,77 @@ +--TEST-- +SPL: SimpleXMLIterator and getChildren() +--SKIPIF-- + +--FILE-- + + + + Plain text. + + Bla bla 1. + + + Here we have some text data. + + And here some more. + + Wow once again. + + + + + + Bla bla 2. + + Foo Bar + + + +EOF; + +$sxe = simplexml_load_string($xml, 'SimpleXMLIterator'); + +foreach($sxe->getChildren() as $name => $data) { + var_dump($name); + var_dump(get_class($data)); + var_dump(trim($data)); +} + +echo "===RESET===\n"; + +for ($sxe->rewind(); $sxe->hasMore(); $sxe->next()) { + var_dump($sxe->hasChildren()); + var_dump(trim($sxe->key())); + var_dump(trim($sxe->current())); + foreach($sxe->getChildren() as $name => $data) { + var_dump($name); + var_dump(get_class($data)); + var_dump(trim($data)); + } +} + +?> +===DONE=== +--EXPECTF-- + +Warning: Invalid argument supplied for foreach() in %ssxe_003.php on line %d +===RESET=== +bool(true) +string(5) "elem1" +string(10) "Bla bla 1." +string(5) "elem2" +string(17) "SimpleXMLIterator" +string(28) "Here we have some text data." +bool(true) +string(6) "elem11" +string(10) "Bla bla 2." +string(7) "elem111" +string(17) "SimpleXMLIterator" +string(7) "Foo Bar" +===DONE===