helly           Wed Jun  7 09:44:42 2006 UTC

  Added files:                 (Branch: PHP_5_2)
    /php-src/ext/spl/tests      spl_004.phpt 

  Modified files:              
    /php-src/ext/spl    php_spl.c spl_iterators.c spl_iterators.h 
  Log:
  - MFH iterator_apply()
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/php_spl.c?r1=1.52.2.28.2.1&r2=1.52.2.28.2.2&diff_format=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.52.2.28.2.1 
php-src/ext/spl/php_spl.c:1.52.2.28.2.2
--- php-src/ext/spl/php_spl.c:1.52.2.28.2.1     Sun Jun  4 10:47:22 2006
+++ php-src/ext/spl/php_spl.c   Wed Jun  7 09:44:41 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_spl.c,v 1.52.2.28.2.1 2006/06/04 10:47:22 helly Exp $ */
+/* $Id: php_spl.c,v 1.52.2.28.2.2 2006/06/07 09:44:41 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
        #include "config.h"
@@ -610,7 +610,14 @@
 
 static
 ZEND_BEGIN_ARG_INFO(arginfo_iterator, 0)
-       ZEND_ARG_INFO(0, iterator)
+       ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0)
+ZEND_END_ARG_INFO();
+
+static
+ZEND_BEGIN_ARG_INFO_EX(arginfo_iterator_apply, 0, 0, 2)
+       ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0)
+       ZEND_ARG_INFO(0, function)
+       ZEND_ARG_ARRAY_INFO(0, args, 1)
 ZEND_END_ARG_INFO();
 
 /* {{{ spl_functions
@@ -628,6 +635,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.73.2.30.2.10&r2=1.73.2.30.2.11&diff_format=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.73.2.30.2.10 
php-src/ext/spl/spl_iterators.c:1.73.2.30.2.11
--- php-src/ext/spl/spl_iterators.c:1.73.2.30.2.10      Tue Jun  6 20:11:35 2006
+++ php-src/ext/spl/spl_iterators.c     Wed Jun  7 09:44:41 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.c,v 1.73.2.30.2.10 2006/06/06 20:11:35 tony2001 Exp $ */
+/* $Id: spl_iterators.c,v 1.73.2.30.2.11 2006/06/07 09:44:41 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -2575,7 +2575,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;
@@ -2600,8 +2600,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;
@@ -2613,6 +2613,54 @@
 }
 /* }}} */
 
+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;
+
+       apply_info.args = NULL;
+       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;
+       }
+
+       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.18.2.7.2.5&r2=1.18.2.7.2.6&diff_format=u
Index: php-src/ext/spl/spl_iterators.h
diff -u php-src/ext/spl/spl_iterators.h:1.18.2.7.2.5 
php-src/ext/spl/spl_iterators.h:1.18.2.7.2.6
--- php-src/ext/spl/spl_iterators.h:1.18.2.7.2.5        Sun May 21 18:13:37 2006
+++ php-src/ext/spl/spl_iterators.h     Wed Jun  7 09:44:41 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.h,v 1.18.2.7.2.5 2006/05/21 18:13:37 helly Exp $ */
+/* $Id: spl_iterators.h,v 1.18.2.7.2.6 2006/06/07 09:44:41 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,

http://cvs.php.net/viewcvs.cgi/php-src/ext/spl/tests/spl_004.phpt?view=markup&rev=1.1
Index: php-src/ext/spl/tests/spl_004.phpt
+++ php-src/ext/spl/tests/spl_004.phpt
--TEST--
SPL: iterator_apply()
--SKIPIF--
<?php if (!extension_loaded("spl")) print "skip"; ?>
--FILE--
<?php

function my_error_handler($errno, $errstr, $errfile, $errline) {
        echo "Error: $errstr\n";
}

set_error_handler('my_error_handler');

function test_arg($arg)
{
        if ($arg instanceof Iterator)
        {
                var_dump($arg->key());
                var_dump($arg->current());
        }
        else
        {
                var_dump($arg);
        }
        return true;
}

function test()
{
        static $arg = 0;
        var_dump($arg++);
        return true;
}

$it = new RecursiveArrayIterator(array(1, array(21, 22), 3));

var_dump(iterator_apply($it, 'test', NULL));

echo "===ARGS===\n";
var_dump(iterator_apply($it, 'test_arg', array($it)));

echo "===RECURSIVE===\n";
$it = new RecursiveIteratorIterator($it);
var_dump(iterator_apply($it, 'test'));

echo "===ERRORS===\n";
var_dump(iterator_apply($it, 'test', 1));
var_dump(iterator_apply($it, 'non_existing_functon'));
var_dump(iterator_apply($it, 'non_existing_functon', NULL, 2));

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
int(0)
int(1)
int(2)
int(3)
===ARGS===
int(0)
int(1)
int(1)
array(2) {
  [0]=>
  int(21)
  [1]=>
  int(22)
}
int(2)
int(3)
int(3)
===RECURSIVE===
int(3)
int(4)
int(5)
int(6)
int(4)
===ERRORS===
Error: Argument 3 passed to iterator_apply() must be an array, integer given
Error: iterator_apply() expects parameter 3 to be array, integer given
NULL
Error: iterator_apply() expects parameter 2 to be function,%sstring given
NULL
Error: iterator_apply() expects at most 3 parameters, 4 given
NULL
===DONE===

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to