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

Reply via email to