helly Fri May 26 00:37:33 2006 UTC
Modified files:
/php-src/ext/spl php_spl.c spl_iterators.c spl_iterators.h
Log:
- Add function iterator_apply()
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/php_spl.c?r1=1.90&r2=1.91&diff_format=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.90 php-src/ext/spl/php_spl.c:1.91
--- php-src/ext/spl/php_spl.c:1.90 Wed May 10 21:09:31 2006
+++ php-src/ext/spl/php_spl.c Fri May 26 00:37:32 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_spl.c,v 1.90 2006/05/10 21:09:31 helly Exp $ */
+/* $Id: php_spl.c,v 1.91 2006/05/26 00:37:32 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -621,7 +621,14 @@
static
ZEND_BEGIN_ARG_INFO(arginfo_iterator, 0)
- ZEND_ARG_INFO(0, iterator)
+ ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0)
+ZEND_END_ARG_INFO();
+
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_iterator_apply, 0, 0, 2)
+ ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0)
+ ZEND_ARG_INFO(0, function)
+ ZEND_ARG_ARRAY_INFO(0, args, 0)
ZEND_END_ARG_INFO();
/* {{{ spl_functions
@@ -639,6 +646,7 @@
#ifdef SPL_ITERATORS_H
PHP_FE(iterator_to_array, arginfo_iterator)
PHP_FE(iterator_count, arginfo_iterator)
+ PHP_FE(iterator_apply, arginfo_iterator_apply)
#endif /* SPL_ITERATORS_H */
{NULL, NULL, NULL}
};
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.c?r1=1.134&r2=1.135&diff_format=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.134
php-src/ext/spl/spl_iterators.c:1.135
--- php-src/ext/spl/spl_iterators.c:1.134 Sun May 21 17:36:52 2006
+++ php-src/ext/spl/spl_iterators.c Fri May 26 00:37:33 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.c,v 1.134 2006/05/21 17:36:52 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.135 2006/05/26 00:37:33 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -2612,7 +2612,7 @@
Copy the iterator into an array */
PHP_FUNCTION(iterator_to_array)
{
- zval *obj;
+ zval *obj;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &obj,
zend_ce_traversable) == FAILURE) {
RETURN_FALSE;
@@ -2637,8 +2637,8 @@
Count the elements in an iterator */
PHP_FUNCTION(iterator_count)
{
- zval *obj;
- long count = 0;
+ zval *obj;
+ long count = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &obj,
zend_ce_traversable) == FAILURE) {
RETURN_FALSE;
@@ -2650,6 +2650,53 @@
}
/* }}} */
+typedef struct {
+ zval *obj;
+ zval *args;
+ long count;
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcc;
+} spl_iterator_apply_info;
+
+static int spl_iterator_func_apply(zend_object_iterator *iter, void *puser
TSRMLS_DC) /* {{{ */
+{
+ zval *retval;
+ spl_iterator_apply_info *apply_info = (spl_iterator_apply_info*)puser;
+ int result;
+
+ apply_info->count++;
+ zend_fcall_info_call(&apply_info->fci, &apply_info->fcc, &retval, NULL
TSRMLS_CC);
+ if (retval) {
+ result = zend_is_true(retval) ? ZEND_HASH_APPLY_KEEP :
ZEND_HASH_APPLY_STOP;
+ zval_ptr_dtor(&retval);
+ } else {
+ result = ZEND_HASH_APPLY_STOP;
+ }
+ return result;
+}
+/* }}} */
+
+/* {{{ proto int iterator_apply(Traversable it, mixed function [, mixed
params])
+ Calls a function for every element in an iterator */
+PHP_FUNCTION(iterator_apply)
+{
+ spl_iterator_apply_info apply_info;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Of|a",
&apply_info.obj, zend_ce_traversable, &apply_info.fci, &apply_info.fcc,
&apply_info.args) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ apply_info.count = 0;
+ zend_fcall_info_args(&apply_info.fci, apply_info.args TSRMLS_CC);
+ if (spl_iterator_apply(apply_info.obj, spl_iterator_func_apply,
(void*)&apply_info TSRMLS_CC) == SUCCESS) {
+ RETVAL_LONG(apply_info.count);
+ } else {
+ RETVAL_FALSE;
+ }
+ zend_fcall_info_args(&apply_info.fci, NULL TSRMLS_CC);
+}
+/* }}} */
+
static zend_function_entry spl_funcs_OuterIterator[] = {
SPL_ABSTRACT_ME(OuterIterator, getInnerIterator, NULL)
{NULL, NULL, NULL}
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/spl_iterators.h?r1=1.35&r2=1.36&diff_format=u
Index: php-src/ext/spl/spl_iterators.h
diff -u php-src/ext/spl/spl_iterators.h:1.35
php-src/ext/spl/spl_iterators.h:1.36
--- php-src/ext/spl/spl_iterators.h:1.35 Sun May 21 17:27:12 2006
+++ php-src/ext/spl/spl_iterators.h Fri May 26 00:37:33 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.h,v 1.35 2006/05/21 17:27:12 helly Exp $ */
+/* $Id: spl_iterators.h,v 1.36 2006/05/26 00:37:33 helly Exp $ */
#ifndef SPL_ITERATORS_H
#define SPL_ITERATORS_H
@@ -55,6 +55,7 @@
PHP_FUNCTION(iterator_to_array);
PHP_FUNCTION(iterator_count);
+PHP_FUNCTION(iterator_apply);
typedef enum {
DIT_Default = 0,
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php