]> granicus.if.org Git - php/commitdiff
Make next() and previous() take optional step parameter and optimize
authorAndrei Zmievski <andrei@php.net>
Tue, 11 Jul 2006 17:59:46 +0000 (17:59 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 11 Jul 2006 17:59:46 +0000 (17:59 +0000)
return value usage.

ext/unicode/unicode_iterators.c

index 60f95a93fbf313b7d039a37444cee900a2dd9ec4..90c6a490a8c395b3d501d724ab1d88b3bf71f71a 100644 (file)
@@ -1035,11 +1035,25 @@ PHP_METHOD(TextIterator, current)
 
 PHP_METHOD(TextIterator, next)
 {
+       long i, step = 1;
        zval *object = getThis();
        text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC);
 
-       iter_ops[intern->type]->next(intern, intern->flags TSRMLS_CC);
-       RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC));
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &step) == FAILURE) {
+               return;
+       }
+
+       if (step <= 0) {
+               step = 1;
+       }
+
+       for (i = 0; i < step; i++) {
+               iter_ops[intern->type]->next(intern, intern->flags TSRMLS_CC);
+       }
+
+       if (return_value_used) {
+               RETURN_LONG(iter_ops[intern->type]->offset(intern, intern->flags TSRMLS_CC));
+       }
 }
 
 PHP_METHOD(TextIterator, key)
@@ -1088,13 +1102,26 @@ PHP_METHOD(TextIterator, offset)
 
 PHP_METHOD(TextIterator, previous)
 {
-       long flags;
+       long flags, i, step = 1;
        zval *object = getThis();
        text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC);
 
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &step) == FAILURE) {
+               return;
+       }
+
+       if (step <= 0) {
+               step = 1;
+       }
        flags = intern->flags ^ ITER_REVERSE;
-       iter_ops[intern->type]->next(intern, flags TSRMLS_CC);
-       RETURN_LONG(iter_ops[intern->type]->offset(intern, flags TSRMLS_CC));
+
+       for (i = 0; i < step; i++) {
+               iter_ops[intern->type]->next(intern, flags TSRMLS_CC);
+       }
+
+       if (return_value_used) {
+               RETURN_LONG(iter_ops[intern->type]->offset(intern, flags TSRMLS_CC));
+       }
 }
 
 PHP_METHOD(TextIterator, following)