helly           Sat Feb  2 22:53:05 2008 UTC

  Modified files:              
    /php-src/ext/spl    spl_directory.c spl_directory.h 
  Log:
  - MFB glob handling
  - Add GlobIterator and FilesystemIterator
  # Commit to 5.3 for more
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.142&r2=1.143&diff_format=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.142 
php-src/ext/spl/spl_directory.c:1.143
--- php-src/ext/spl/spl_directory.c:1.142       Thu Jan 31 11:09:50 2008
+++ php-src/ext/spl/spl_directory.c     Sat Feb  2 22:53:05 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.142 2008/01/31 11:09:50 rrichards Exp $ */
+/* $Id: spl_directory.c,v 1.143 2008/02/02 22:53:05 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -43,15 +43,6 @@
 
 #include "ext/standard/basic_functions.h"
 #include "ext/standard/php_filestat.h"
-#include "ext/standard/php_link.h"
-
-#ifdef HAVE_GLOB
-# ifndef PHP_WIN32
-#  include <glob.h>
-# else
-#  include "win32/glob.h"
-# endif
-#endif
 
 /* declare the class handlers */
 static zend_object_handlers spl_filesystem_object_handlers;
@@ -59,7 +50,9 @@
 /* decalre the class entry */
 PHPAPI zend_class_entry *spl_ce_SplFileInfo;
 PHPAPI zend_class_entry *spl_ce_DirectoryIterator;
+PHPAPI zend_class_entry *spl_ce_FilesystemIterator;
 PHPAPI zend_class_entry *spl_ce_RecursiveDirectoryIterator;
+PHPAPI zend_class_entry *spl_ce_GlobIterator;
 PHPAPI zend_class_entry *spl_ce_SplFileObject;
 PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
 
@@ -197,64 +190,49 @@
                        break;
                case SPL_FS_DIR:
                        path = spl_filesystem_object_get_path(intern, NULL, 
&path_type TSRMLS_CC);
-                       intern->file_name_len = zspprintf(path_type, 
&intern->file_name, 0, "%R%c%s", path_type, path, DEFAULT_SLASH, 
intern->u.dir.entry.d_name);
+                       intern->file_name_len = zspprintf(path_type, 
&intern->file_name, 0, "%R%c%s",
+                                                         path_type, path,
+                                                         DEFAULT_SLASH, 
intern->u.dir.entry.d_name);
                        intern->file_name_type = path_type;
                        break;
                }
        }
 } /* }}} */
 
-#define IS_SLASH_AT(type, zs, pos) (type == IS_UNICODE ? IS_U_SLASH(zs.u[pos]) 
: IS_SLASH(zs.s[pos]))
-
 static int spl_filesystem_dir_read(spl_filesystem_object *intern TSRMLS_DC) /* 
{{{ */
 {
        if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, 
&intern->u.dir.entry)) {
                intern->u.dir.entry.d_name[0] = '\0';
                return 0;
        } else {
-               if (intern->flags & SPL_FILE_DIR_GLOB_REFETCH_PATH) {
-                       if (intern->_path.v) {
-                               efree(intern->_path.v);
-                       }
-                       intern->_path.s = 
php_glob_stream_get_path(intern->u.dir.dirp, 1, &intern->_path_len);
-                       intern->_path_type = IS_STRING;
-               }
                return 1;
        }
 }
 /* }}} */
 
+#define IS_SLASH_AT(type, zs, pos) (type == IS_UNICODE ? IS_U_SLASH(zs.u[pos]) 
: IS_SLASH(zs.s[pos]))
+
 /* {{{ spl_filesystem_dir_open */
 /* open a directory resource */
 static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_uchar 
type, zstr path, int path_len TSRMLS_DC)
 {
-       int options = REPORT_ERRORS, flags;
-       
-       if (intern->flags & SPL_FILE_DIR_GLOB_USE) {
+       int options = REPORT_ERRORS;
+
+#if HELLY_0    
+       if (php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) {
                options |= STREAM_USE_GLOB_DIR_OPEN;
        }
+#endif
 
        intern->type = SPL_FS_DIR;
        intern->_path_type= type;
        intern->_path_len = path_len;
        intern->u.dir.dirp = php_stream_u_opendir(type, path, path_len, 
options, NULL);
 
-       if (intern->u.dir.dirp && php_stream_is(intern->u.dir.dirp, 
&php_glob_stream_ops)) {
-               intern->_path.s = php_glob_stream_get_path(intern->u.dir.dirp, 
1, &intern->_path_len);
-               intern->_path_type = IS_STRING;
-               intern->flags |= SPL_FILE_DIR_GLOB_USE;
-               php_glob_stream_get_count(intern->u.dir.dirp, &flags);
-               if (flags & GLOB_APPEND) {
-                       intern->flags |= SPL_FILE_DIR_GLOB_REFETCH_PATH;
-               } else {
-                       intern->flags &= ~SPL_FILE_DIR_GLOB_REFETCH_PATH;
-               }
-       } else if (intern->_path_len && IS_SLASH_AT(type, path, 
intern->_path_len-1)) {
+       if (intern->_path_len && IS_SLASH_AT(type, path, intern->_path_len-1)) {
                intern->_path = ezstrndup(type, path, --intern->_path_len);
-               intern->flags &= 
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH);
        } else {
                intern->_path = ezstrndup(type, path, intern->_path_len);
-               intern->flags &= 
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH);
        }
        intern->u.dir.index = 0;
 
@@ -399,7 +377,7 @@
 {
        spl_filesystem_object *intern;
        zval *arg1;
-       
+
        if (!file_path.v || !file_path_len) {
 #if defined(PHP_WIN32)
                zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, 
"Cannot create SplFileInfo for empty path");
@@ -550,6 +528,9 @@
        zstr pnstr;
        int  pnlen;
        char stmp[2];
+       int path_len;
+       zstr path;
+       zend_uchar path_type;
 
        *is_temp = 1;
 
@@ -558,11 +539,12 @@
 
        INIT_PZVAL(&zrv);
        Z_ARRVAL(zrv) = rv;
-       
+
        zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) 
zval_add_ref, (void *) &tmp, sizeof(zval *));
 
+       path = spl_filesystem_object_get_path(intern, &path_len, &path_type 
TSRMLS_CC);
        pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", 
sizeof("pathName")-1, &pnlen TSRMLS_CC);
-       add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, 
intern->_path_type, intern->_path, intern->_path_len, 1);
+       add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, path_type, 
path, path_len, 1);
        efree(pnstr.v);
        if (intern->file_name.v) {
                pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, 
"fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC);
@@ -570,7 +552,7 @@
                efree(pnstr.v);
        }
        if (intern->type == SPL_FS_DIR) {
-               pnstr = 
spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "glob", 
sizeof("glob")-1, &pnlen TSRMLS_CC);
+               pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator, 
"glob", sizeof("glob")-1, &pnlen TSRMLS_CC);
                if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
                        add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, 
pnlen+1, intern->_path_type, intern->_path, intern->_path_len, 1);
                } else {
@@ -604,23 +586,32 @@
 }
 /* }}}} */
 
-/* {{{ proto void DirectoryIterator::__construct(string $path, [int $flags = 
0]) U
- Cronstructs a new dir iterator from a path. */
-SPL_METHOD(DirectoryIterator, __construct)
+#define DIT_CTOR_FLAGS  0x00000001
+#define DIT_CTOR_GLOB   0x00000002
+
+UChar u_glob[sizeof("glob://")];
+
+void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int 
ctor_flags) /* {{{ */
 {
        spl_filesystem_object *intern;
        zstr path;
-       int len;
+       int parsed, len;
        zend_uchar path_type;
-       long flags = 0;
+       long flags;
        
        php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC);
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path, 
&len, &path_type, &flags) == FAILURE) {
+       if (ctor_flags & DIT_CTOR_FLAGS) {
+               flags = SPL_FILE_DIR_CURRENT_AS_FILEINFO;
+               parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"t|l", &path, &len, &path_type, &flags);
+       } else {
+               flags = 0;
+               parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", 
&path, &len, &path_type);
+       }
+       if (parsed == FAILURE) {
                php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                return;
        }
-
        if (!len) {
                php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, 
"Directory name must not be empty.");
@@ -630,14 +621,32 @@
        intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
 
        intern->flags = flags;
-       spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+       if ((ctor_flags & DIT_CTOR_GLOB) && (
+               (path_type == IS_STRING && strstr(path.s, "glob://") != path.s) 
||
+               (path_type == IS_UNICODE && u_strstr(path.u, u_glob) != path.u)
+       )) {
+               len = zspprintf(path_type, &path, 0, "glob://%R", path_type, 
path);
+               spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+               efree(path.v);
+       } else {
+               spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+       }
 
        intern->u.dir.is_recursive = instanceof_function(intern->std.ce, 
spl_ce_RecursiveDirectoryIterator TSRMLS_CC) ? 1 : 0;
+       intern->flags = flags;
 
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
 }
 /* }}} */
 
+/* {{{ proto void DirectoryIterator::__construct(string path) U
+ Cronstructs a new dir iterator from a path. */
+SPL_METHOD(DirectoryIterator, __construct)
+{
+       spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
 /* {{{ proto void DirectoryIterator::rewind() U
    Rewind dir back to the start */
 SPL_METHOD(DirectoryIterator, rewind)
@@ -648,7 +657,6 @@
        if (intern->u.dir.dirp) {
                php_stream_rewinddir(intern->u.dir.dirp);
        }
-
        spl_filesystem_dir_read(intern TSRMLS_CC);
 }
 /* }}} */
@@ -700,19 +708,6 @@
 }
 /* }}} */
 
-/* {{{ proto string DirectoryIterator::count() U
-   Return number of entries in directory, works only when USE_GLOB is in 
effect */
-SPL_METHOD(DirectoryIterator, count)
-{
-       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
-       if (intern->flags & SPL_FILE_DIR_GLOB_USE) {
-               RETURN_LONG(php_glob_stream_get_count(intern->u.dir.dirp, 
NULL));
-       }
-       zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Unable 
to determine count unless USE_GLOG flag is in effect");
-}
-/* }}} */
-
 /* {{{ proto string SplFileInfo::getPath() U
    Return the path */
 SPL_METHOD(SplFileInfo, getPath)
@@ -840,9 +835,9 @@
 }
 /* }}} */
 
-/* {{{ proto string RecursiveDirectoryIterator::key() U
+/* {{{ proto string FilesystemIterator::key() U
    Return getPathname() or getFilename() depending on flags */
-SPL_METHOD(RecursiveDirectoryIterator, key)
+SPL_METHOD(FilesystemIterator, key)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
@@ -855,9 +850,9 @@
 }
 /* }}} */
 
-/* {{{ proto string RecursiveDirectoryIterator::current() U
+/* {{{ proto string FilesystemIterator::current() U
    Return getFilename(), getFileInfo() or $this depending on flags */
-SPL_METHOD(RecursiveDirectoryIterator, current)
+SPL_METHOD(FilesystemIterator, current)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
@@ -1180,35 +1175,17 @@
 }
 /* }}} */
 
-/* {{{ proto void RecursiveDirectoryIterator::__construct(string path [, int 
flags]) U
+/* {{{ proto void FilesystemIterator::__construct(string path [, int flags])
  Cronstructs a new dir iterator from a path. */
-SPL_METHOD(RecursiveDirectoryIterator, __construct)
+SPL_METHOD(FilesystemIterator, __construct)
 {
-       spl_filesystem_object *intern;
-       zstr path;
-       zend_uchar path_type;
-       int path_len;
-       long flags = SPL_FILE_DIR_CURRENT_AS_FILEINFO;
-
-       php_set_error_handling(EH_THROW, spl_ce_UnexpectedValueException 
TSRMLS_CC);
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path, 
&path_len, &path_type, &flags) == FAILURE) {
-               php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
-               return;
-       }
-
-       intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
-       intern->u.dir.is_recursive = instanceof_function(intern->std.ce, 
spl_ce_RecursiveDirectoryIterator TSRMLS_CC) ? 1 : 0;
-       intern->flags = flags;
-       spl_filesystem_dir_open(intern, path_type, path, path_len TSRMLS_CC);
-
-       php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+       spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
DIT_CTOR_FLAGS);
 }
 /* }}} */
 
-/* {{{ proto void RecursiveDirectoryIterator::rewind() U
+/* {{{ proto void FilesystemIterator::rewind() U
    Rewind dir back to the start */
-SPL_METHOD(RecursiveDirectoryIterator, rewind)
+SPL_METHOD(FilesystemIterator, rewind)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
@@ -1222,9 +1199,9 @@
 }
 /* }}} */
 
-/* {{{ proto void RecursiveDirectoryIterator::next() U
+/* {{{ proto void FilesystemIterator::next() U
    Move to next entry */
-SPL_METHOD(RecursiveDirectoryIterator, next)
+SPL_METHOD(FilesystemIterator, next)
 {
        spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
@@ -1276,17 +1253,8 @@
 
        INIT_PZVAL(&zflags);
        INIT_PZVAL(&zpath);
-       if ((intern->flags & (SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD)) 
== (SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD)) {
-               ZVAL_LONG(&zflags, intern->flags);
-               Z_TYPE(zpath) = IS_STRING;
-               Z_STRLEN(zpath) = spprintf(&Z_STRVAL(zpath), 0, "%R%c%s",
-                       intern->file_name_type, intern->file_name,
-                       DEFAULT_SLASH,
-                       php_glob_stream_get_pattern(intern->u.dir.dirp, 0, 
NULL));
-       } else {
-               ZVAL_LONG(&zflags, intern->flags & 
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD));
-               ZVAL_ZSTRL(&zpath, intern->file_name_type, intern->file_name, 
intern->file_name_len, 1);
-       }
+       ZVAL_LONG(&zflags, intern->flags);
+       ZVAL_ZSTRL(&zpath, intern->file_name_type, intern->file_name, 
intern->file_name_len, 1);
 
        spl_instantiate_arg_ex2(spl_ce_RecursiveDirectoryIterator, 
&return_value, 0, &zpath, &zflags TSRMLS_CC);
 
@@ -1340,6 +1308,37 @@
 }
 /* }}} */
 
+/* {{{ proto int RecursiveDirectoryIterator::__construct(string path [, int 
flags])
+ Cronstructs a new dir iterator from a path. */
+SPL_METHOD(RecursiveDirectoryIterator, __construct)
+{
+       spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
DIT_CTOR_FLAGS);
+}
+/* }}} */
+
+/* {{{ proto int GlobIterator::__construct(string path [, int flags]) U
+ Cronstructs a new dir iterator from a glob expression (no glob:// needed). */
+SPL_METHOD(GlobIterator, __construct)
+{
+       spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
DIT_CTOR_FLAGS|DIT_CTOR_GLOB);
+}
+/* }}} */
+
+/* {{{ proto int GlobIterator::cont() U
+   Return the number of directories and files found by globbing */
+SPL_METHOD(GlobIterator, count)
+{
+       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
+               RETURN_LONG(php_glob_stream_get_count(intern->u.dir.dirp, 
NULL));
+       } else {
+               /* should not happen */
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "GlobIterator lost 
glob state");
+       }
+}
+/* }}} */
+
 /* forward declarations to the iterator handlers */
 static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC);
 static int spl_filesystem_dir_it_valid(zend_object_iterator *iter TSRMLS_DC);
@@ -1370,8 +1369,7 @@
        dir_object = 
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
        iterator   = spl_filesystem_object_to_iterator(dir_object);
 
-       Z_ADDREF_P(object);
-       Z_ADDREF_P(object);
+       Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
        iterator->intern.data = (void*)object;
        iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
        iterator->current = object;
@@ -1675,9 +1673,8 @@
 };
 
 static
-ZEND_BEGIN_ARG_INFO_EX(arginfo_dir___construct, 0, 0, 1) 
+ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0) 
        ZEND_ARG_INFO(0, path)
-       ZEND_ARG_INFO(0, flags)
 ZEND_END_ARG_INFO()
 
 /* the method table */
@@ -1692,7 +1689,6 @@
        SPL_ME(DirectoryIterator, key,           NULL, ZEND_ACC_PUBLIC)
        SPL_ME(DirectoryIterator, current,       NULL, ZEND_ACC_PUBLIC)
        SPL_ME(DirectoryIterator, next,          NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(DirectoryIterator, count,         NULL, ZEND_ACC_PUBLIC)
        SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename, 
NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
@@ -1708,12 +1704,17 @@
        ZEND_ARG_INFO(0, allow_links)
 ZEND_END_ARG_INFO()
 
+static const zend_function_entry spl_FilesystemIterator_functions[] = {
+       SPL_ME(FilesystemIterator, __construct,   arginfo_r_dir___construct, 
ZEND_ACC_PUBLIC)
+       SPL_ME(FilesystemIterator, rewind,        NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(FilesystemIterator, next,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(FilesystemIterator, key,           NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(FilesystemIterator, current,       NULL, ZEND_ACC_PUBLIC)
+       {NULL, NULL, NULL}
+};
+
 static const zend_function_entry spl_RecursiveDirectoryIterator_functions[] = {
        SPL_ME(RecursiveDirectoryIterator, __construct,   
arginfo_r_dir___construct, 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, current,       NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, hasChildren,   
arginfo_r_dir_hasChildren, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getChildren,   NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getSubPath,    NULL, ZEND_ACC_PUBLIC)
@@ -1721,6 +1722,12 @@
        {NULL, NULL, NULL}
 };
 
+static const zend_function_entry spl_GlobIterator_functions[] = {
+       SPL_ME(GlobIterator, __construct,   arginfo_r_dir___construct, 
ZEND_ACC_PUBLIC)
+       SPL_ME(GlobIterator, count,         NULL,                      
ZEND_ACC_PUBLIC)
+       {NULL, NULL, NULL}
+};
+
 static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent 
TSRMLS_DC) /* {{{ */
 {
        char *buf;
@@ -2207,7 +2214,7 @@
                                RETURN_FALSE;
                        }
                        escape = esc[0];
-                       
+                       /* no break */
                case 2:
                        if (e_len != 1) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"enclosure must be a character");
@@ -2583,6 +2590,8 @@
  */
 PHP_MINIT_FUNCTION(spl_directory)
 {
+       u_charsToUChars("glob://", u_glob, sizeof("glob://"));
+
        REGISTER_SPL_STD_CLASS_EX(SplFileInfo, spl_filesystem_object_new, 
spl_SplFileInfo_functions);
        memcpy(&spl_filesystem_object_handlers, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
        spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
@@ -2592,24 +2601,26 @@
        REGISTER_SPL_SUB_CLASS_EX(DirectoryIterator, SplFileInfo, 
spl_filesystem_object_new, spl_DirectoryIterator_functions);
        zend_class_implements(spl_ce_DirectoryIterator TSRMLS_CC, 1, 
zend_ce_iterator);
 
-       REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "GLOB",            
SPL_FILE_DIR_GLOB_USE);
-       REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "GLOB_CHILD",      
SPL_FILE_DIR_GLOB_CHILD);
-
        spl_ce_DirectoryIterator->get_iterator = 
spl_filesystem_dir_get_iterator;
 
-       REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, 
DirectoryIterator, spl_filesystem_object_new, 
spl_RecursiveDirectoryIterator_functions);
-       REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
+       REGISTER_SPL_SUB_CLASS_EX(FilesystemIterator, DirectoryIterator, 
spl_filesystem_object_new, spl_FilesystemIterator_functions);
 
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"CURRENT_MODE_MASK",   SPL_FILE_DIR_CURRENT_MODE_MASK);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"CURRENT_AS_FILEINFO", SPL_FILE_DIR_CURRENT_AS_FILEINFO);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"CURRENT_AS_SELF",     0);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"KEY_MODE_MASK",       SPL_FILE_DIR_KEY_MODE_MASK);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"KEY_AS_PATHNAME",     0);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"KEY_AS_FILENAME",     SPL_FILE_DIR_KEY_AS_FILENAME);
-       REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator, 
"NEW_CURRENT_AND_KEY", 
SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_MODE_MASK",  
 SPL_FILE_DIR_CURRENT_MODE_MASK);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, 
"CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, 
"CURRENT_AS_FILEINFO", SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_AS_SELF",    
 0);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_MODE_MASK",      
 SPL_FILE_DIR_KEY_MODE_MASK);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_PATHNAME",    
 0);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_FILENAME",    
 SPL_FILE_DIR_KEY_AS_FILENAME);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, 
"NEW_CURRENT_AND_KEY", 
SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+
+       spl_ce_FilesystemIterator->get_iterator = 
spl_filesystem_tree_get_iterator;
+
+       REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, 
FilesystemIterator, spl_filesystem_object_new, 
spl_RecursiveDirectoryIterator_functions);
+       REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
 
-       spl_ce_RecursiveDirectoryIterator->get_iterator = 
spl_filesystem_tree_get_iterator;
+       REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, 
spl_filesystem_object_new, spl_GlobIterator_functions);
+       REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable);
 
        REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, 
spl_filesystem_object_new, spl_SplFileObject_functions);
        REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator);
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.38&r2=1.39&diff_format=u
Index: php-src/ext/spl/spl_directory.h
diff -u php-src/ext/spl/spl_directory.h:1.38 
php-src/ext/spl/spl_directory.h:1.39
--- php-src/ext/spl/spl_directory.h:1.38        Wed Jan 30 23:49:49 2008
+++ php-src/ext/spl/spl_directory.h     Sat Feb  2 22:53:05 2008
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.h,v 1.38 2008/01/30 23:49:49 helly Exp $ */
+/* $Id: spl_directory.h,v 1.39 2008/02/02 22:53:05 helly Exp $ */
 
 #ifndef SPL_DIRECTORY_H
 #define SPL_DIRECTORY_H
@@ -26,7 +26,9 @@
 
 extern PHPAPI zend_class_entry *spl_ce_SplFileInfo;
 extern PHPAPI zend_class_entry *spl_ce_DirectoryIterator;
+extern PHPAPI zend_class_entry *spl_ce_FilesystemIterator;
 extern PHPAPI zend_class_entry *spl_ce_RecursiveDirectoryIterator;
+extern PHPAPI zend_class_entry *spl_ce_GlobIterator;
 extern PHPAPI zend_class_entry *spl_ce_SplFileObject;
 extern PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
 
@@ -108,7 +110,7 @@
 
 static inline spl_filesystem_object* 
spl_filesystem_iterator_to_object(spl_filesystem_iterator *it)
 {
-       return (spl_filesystem_object*)((char*)it - 
offsetof(spl_filesystem_object, it));
+       return (spl_filesystem_object*)((char*)it - 
XtOffsetOf(spl_filesystem_object, it));
 }
 
 #define SPL_FILE_OBJECT_DROP_NEW_LINE      0x00000001 /* drop new lines */
@@ -123,10 +125,6 @@
 #define SPL_FILE_DIR_KEY_AS_FILENAME       0x00000100 /* make 
RecursiveDirectoryTree::key() return getFilename() */
 #define SPL_FILE_DIR_KEY_MODE_MASK         0x00000F00 /* mask 
RecursiveDirectoryTree::key() */
 
-#define SPL_FILE_DIR_GLOB_USE              0x00001000 /* use glob for open 
dir*/
-#define SPL_FILE_DIR_GLOB_REFETCH_PATH     0x00002000 /* whether we need to 
refetch the path in glob mode */
-#define SPL_FILE_DIR_GLOB_CHILD            0x00004000 /* do use glob on childs 
*/
-
 #endif /* SPL_DIRECTORY_H */
 
 /*

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

Reply via email to