helly           Tue Nov 18 17:14:20 2003 EDT

  Modified files:              
    /spl        spl_directory.c spl_functions.h spl_iterators.c 
  Log:
  - Rename DirectoryTreeIterator to RecursiveDirectoryiterator (what it 
    effectively is).
  - Add DirectoryIterator::__toString ->getFilename
  - Add RecursiveDirecetoryIterator::__toString ->getPathname
  - Add RecursiveIteratorIterator::getSubIterator.
  
  
Index: spl/spl_directory.c
diff -u spl/spl_directory.c:1.12 spl/spl_directory.c:1.13
--- spl/spl_directory.c:1.12    Sun Nov  9 18:00:50 2003
+++ spl/spl_directory.c Tue Nov 18 17:14:19 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.12 2003/11/09 23:00:50 helly Exp $ */
+/* $Id: spl_directory.c,v 1.13 2003/11/18 22:14:19 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -53,11 +53,12 @@
 SPL_METHOD(DirectoryIterator, isDot);
 SPL_METHOD(DirectoryIterator, isDir);
 
-SPL_METHOD(DirectoryTreeIterator, rewind);
-SPL_METHOD(DirectoryTreeIterator, next);
-SPL_METHOD(DirectoryTreeIterator, key);
-SPL_METHOD(DirectoryTreeIterator, hasChildren);
-SPL_METHOD(DirectoryTreeIterator, getChildren);
+SPL_METHOD(RecursiveDirectoryIterator, rewind);
+SPL_METHOD(RecursiveDirectoryIterator, next);
+SPL_METHOD(RecursiveDirectoryIterator, key);
+SPL_METHOD(RecursiveDirectoryIterator, hasChildren);
+SPL_METHOD(RecursiveDirectoryIterator, getChildren);
+SPL_METHOD(RecursiveDirectoryIterator, __toString);
 
 
 /* declare method parameters */
@@ -82,15 +83,17 @@
        SPL_ME(DirectoryIterator, getPathname,   NULL, ZEND_ACC_PUBLIC)
        SPL_ME(DirectoryIterator, isDot,         NULL, ZEND_ACC_PUBLIC)
        SPL_ME(DirectoryIterator, isDir,         NULL, ZEND_ACC_PUBLIC)
+       SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename, NULL, 
ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
 static zend_function_entry spl_ce_dir_tree_class_functions[] = {
-       SPL_ME(DirectoryTreeIterator, rewind,        NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(DirectoryTreeIterator, next,          NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(DirectoryTreeIterator, key,           NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(DirectoryTreeIterator, hasChildren,   NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(DirectoryTreeIterator, getChildren,   NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, rewind,        NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, next,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, key,           NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, hasChildren,   NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, getChildren,   NULL, ZEND_ACC_PUBLIC)
+       SPL_MA(RecursiveDirectoryIterator, __toString, DirectoryIterator, getPathname, 
NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
@@ -101,7 +104,7 @@
 
 /* decalre the class entry */
 zend_class_entry *spl_ce_DirectoryIterator;
-zend_class_entry *spl_ce_DirectoryTreeIterator;
+zend_class_entry *spl_ce_RecursiveDirectoryIterator;
 
 
 /* the overloaded class structure */
@@ -358,15 +361,19 @@
        zval *object = getThis();
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
 
-       char *filename;
-       int filename_len = spprintf(&filename, 0, "%s/%s", intern->path, 
intern->entry.d_name);
-       RETURN_STRINGL(filename, filename_len, 0);
+       if (intern->entry.d_name[0]) {
+               char *filename;
+               int filename_len = spprintf(&filename, 0, "%s/%s", intern->path, 
intern->entry.d_name);
+               RETURN_STRINGL(filename, filename_len, 0);
+       } else {
+               RETURN_BOOL(0);
+       }
 }
 /* }}} */
 
-/* {{{ proto string DirectoryTreeIterator::key()
+/* {{{ proto string RecursiveDirectoryIterator::key()
    Return path and filename of current dir entry */
-SPL_METHOD(DirectoryTreeIterator, key)
+SPL_METHOD(RecursiveDirectoryIterator, key)
 {
        zval *object = getThis();
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -404,9 +411,9 @@
 }
 /* }}} */
 
-/* {{{ proto void DirectoryTreeIterator::rewind()
+/* {{{ proto void RecursiveDirectoryIterator::rewind()
    Rewind dir back to the start */
-SPL_METHOD(DirectoryTreeIterator, rewind)
+SPL_METHOD(RecursiveDirectoryIterator, rewind)
 {
        zval *object = getThis();
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -423,9 +430,9 @@
 }
 /* }}} */
 
-/* {{{ proto void DirectoryTreeIterator::next()
+/* {{{ proto void RecursiveDirectoryIterator::next()
    Move to next entry */
-SPL_METHOD(DirectoryTreeIterator, next)
+SPL_METHOD(RecursiveDirectoryIterator, next)
 {
        zval *object = getThis();
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -439,9 +446,9 @@
 }
 /* }}} */
 
-/* {{{ proto bool DirectoryTreeIterator::hasChildren()
+/* {{{ proto bool RecursiveDirectoryIterator::hasChildren()
    Returns whether current entry is a directory and not '.' or '..' */
-SPL_METHOD(DirectoryTreeIterator, hasChildren)
+SPL_METHOD(RecursiveDirectoryIterator, hasChildren)
 {
        zval *object = getThis();
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -458,9 +465,9 @@
 }
 /* }}} */
 
-/* {{{ proto DirectoryTreeIterator DirectoryIterator::getChildren()
+/* {{{ proto RecursiveDirectoryIterator DirectoryIterator::getChildren()
    Returns an iterator fo rthe current entry if it is a directory */
-SPL_METHOD(DirectoryTreeIterator, getChildren)
+SPL_METHOD(RecursiveDirectoryIterator, getChildren)
 {
        zval *object = getThis(), zpath;
        spl_ce_dir_object *intern = 
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -470,7 +477,7 @@
        
        ZVAL_STRINGL(&zpath, path, path_len, 0);
 
-       spl_instantiate_arg_ex1(spl_ce_DirectoryTreeIterator, &return_value, 0, &zpath 
TSRMLS_CC);
+       spl_instantiate_arg_ex1(spl_ce_RecursiveDirectoryIterator, &return_value, 0, 
&zpath TSRMLS_CC);
        zval_dtor(&zpath);
 }
 /* }}} */
@@ -624,17 +631,11 @@
        spl_ce_dir_object   *object   = iterator->object;
        
        object->index++;
-       zval_dtor(iterator->current);
-skip_dots:
-       if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
-               object->entry.d_name[0] = '\0';
-               ZVAL_NULL(iterator->current);
-       } else {
-               if (!strcmp(object->entry.d_name, ".") || 
!strcmp(object->entry.d_name, "..")) {
-                       goto skip_dots;
+       do {
+               if (!object->dirp || !php_stream_readdir(object->dirp, 
&object->entry)) {
+                       object->entry.d_name[0] = '\0';
                }
-               ZVAL_STRING(iterator->current, object->entry.d_name, 1);
-       }
+       } while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name, 
".."));
 }
 /* }}} */
 
@@ -648,21 +649,14 @@
        if (object->dirp) {
                php_stream_rewinddir(object->dirp);
        }
-       zval_dtor(iterator->current);
-skip_dots:
-       if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
-               object->entry.d_name[0] = '\0';
-               ZVAL_NULL(iterator->current);
-       } else {
-               if (!strcmp(object->entry.d_name, ".") || 
!strcmp(object->entry.d_name, "..")) {
-                       goto skip_dots;
+       do {
+               if (!object->dirp || !php_stream_readdir(object->dirp, 
&object->entry)) {
+                       object->entry.d_name[0] = '\0';
                }
-               ZVAL_STRING(iterator->current, object->entry.d_name, 1);
-       }
+       } while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name, 
".."));
 }
 /* }}} */
 
-
 /* iterator handler table */
 zend_object_iterator_funcs spl_ce_dir_tree_it_funcs = {
        spl_ce_dir_it_dtor,
@@ -682,7 +676,8 @@
        object->refcount++;
        iterator->intern.data = (void*)object;
        iterator->intern.funcs = &spl_ce_dir_tree_it_funcs;
-       MAKE_STD_ZVAL(iterator->current);
+       iterator->current = object;
+       object->refcount++;
        iterator->object = dir_object;
        
        return (zend_object_iterator*)iterator;
@@ -701,10 +696,10 @@
 
        spl_ce_DirectoryIterator->get_iterator = spl_ce_dir_get_iterator;
 
-       REGISTER_SPL_SUB_CLASS_EX(DirectoryTreeIterator, DirectoryIterator, 
spl_ce_dir_object_new, spl_ce_dir_tree_class_functions);
-       REGISTER_SPL_IMPLEMENTS(DirectoryTreeIterator, RecursiveIterator);
+       REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, DirectoryIterator, 
spl_ce_dir_object_new, spl_ce_dir_tree_class_functions);
+       REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
 
-       spl_ce_DirectoryTreeIterator->get_iterator = spl_ce_dir_tree_get_iterator;
+       spl_ce_RecursiveDirectoryIterator->get_iterator = spl_ce_dir_tree_get_iterator;
 
        return SUCCESS;
 }
Index: spl/spl_functions.h
diff -u spl/spl_functions.h:1.10 spl/spl_functions.h:1.11
--- spl/spl_functions.h:1.10    Sun Nov  9 09:05:35 2003
+++ spl/spl_functions.h Tue Nov 18 17:14:19 2003
@@ -71,6 +71,8 @@
 #define SPL_METHOD(class_name, function_name) \
        PHP_METHOD(spl_ ## class_name, function_name)
 
+#define SPL_MA(class_name, function_name, alias_class, alias_function, arg_info, 
flags) \
+       ZEND_MALIAS(function_name, spl_ ## alias_class, alias_function, arg_info, 
flags)
 #endif /* PHP_FUNCTIONS_H */
 
 /*
Index: spl/spl_iterators.c
diff -u spl/spl_iterators.c:1.3 spl/spl_iterators.c:1.4
--- spl/spl_iterators.c:1.3     Sun Nov 16 19:57:01 2003
+++ spl/spl_iterators.c Tue Nov 18 17:14:19 2003
@@ -47,6 +47,7 @@
 SPL_METHOD(RecursiveIteratorIterator, current);
 SPL_METHOD(RecursiveIteratorIterator, next);
 SPL_METHOD(RecursiveIteratorIterator, getLevel);
+SPL_METHOD(RecursiveIteratorIterator, getSubIterator);
 
 static
 ZEND_BEGIN_ARG_INFO(arginfo_recursive_it___construct, 0) 
@@ -54,6 +55,12 @@
        ZEND_ARG_INFO(0, mode)
 ZEND_END_ARG_INFO();
 
+static
+ZEND_BEGIN_ARG_INFO(arginfo_recursive_it_getSubIterator, 0) 
+       ZEND_ARG_INFO(0, iterator)
+       ZEND_ARG_INFO(0, mode)
+ZEND_END_ARG_INFO();
+
 static zend_function_entry spl_funcs_RecursiveIteratorIterator[] = {
        SPL_ME(RecursiveIteratorIterator, __construct,   
arginfo_recursive_it___construct, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveIteratorIterator, rewind,        NULL, ZEND_ACC_PUBLIC)
@@ -62,6 +69,7 @@
        SPL_ME(RecursiveIteratorIterator, current,       NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveIteratorIterator, next,          NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveIteratorIterator, getLevel,      NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveIteratorIterator, 
getSubIterator,arginfo_recursive_it_getSubIterator, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
@@ -377,6 +385,22 @@
        RETURN_LONG(object->level);
 }
 
+SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
+{
+       spl_recursive_it_object   *object = 
(spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       int  level;
+       zval *zobject;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &level) == FAILURE) {
+               return;
+       }
+       if (level < 0 || level > object->level) {
+               RETURN_NULL();
+       }
+       zobject = object->iterators[level].zobject;
+       REPLACE_ZVAL_VALUE(&return_value, zobject, 1);
+}
+
 /* {{{ spl_dtor_RecursiveIteratorIterator */
 static void spl_dtor_RecursiveIteratorIterator(void *_object, zend_object_handle 
handle TSRMLS_DC)
 {

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

Reply via email to