helly Sat Mar 3 23:41:43 2007 UTC Modified files: /php-src/ext/spl spl_directory.c spl_directory.h Log: - Glob might require us to refetch the path for every entry http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.126&r2=1.127&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.126 php-src/ext/spl/spl_directory.c:1.127 --- php-src/ext/spl/spl_directory.c:1.126 Sat Mar 3 23:07:33 2007 +++ php-src/ext/spl/spl_directory.c Sat Mar 3 23:41:43 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.126 2007/03/03 23:07:33 helly Exp $ */ +/* $Id: spl_directory.c,v 1.127 2007/03/03 23:41:43 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -45,6 +45,14 @@ #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; @@ -174,11 +182,28 @@ #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); + } + return 1; + } +} +/* }}} */ + /* {{{ 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; + int options = REPORT_ERRORS, flags; if (intern->flags & SPL_FILE_DIR_USE_GLOB) { options |= STREAM_USE_GLOB_DIR_OPEN; @@ -193,12 +218,18 @@ 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_USE_GLOB; + 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)) { intern->path = ezstrndup(type, path, --intern->path_len); - intern->flags &= ~SPL_FILE_DIR_USE_GLOB; + intern->flags &= ~(SPL_FILE_DIR_USE_GLOB|SPL_FILE_DIR_GLOB_REFETCH_PATH); } else { intern->path = ezstrndup(type, path, intern->path_len); - intern->flags &= ~SPL_FILE_DIR_USE_GLOB; + intern->flags &= ~(SPL_FILE_DIR_USE_GLOB|SPL_FILE_DIR_GLOB_REFETCH_PATH); } intern->u.dir.index = 0; @@ -206,9 +237,7 @@ /* throw exception: should've been already happened */ intern->u.dir.entry.d_name[0] = '\0'; } else { - if (!php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) { - intern->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(intern TSRMLS_CC); } } /* }}} */ @@ -574,9 +603,8 @@ if (intern->u.dir.dirp) { php_stream_rewinddir(intern->u.dir.dirp); } - if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) { - intern->u.dir.entry.d_name[0] = '\0'; - } + + spl_filesystem_dir_read(intern TSRMLS_CC); } /* }}} */ @@ -609,9 +637,7 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); intern->u.dir.index++; - if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) { - intern->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(intern TSRMLS_CC); if (intern->file_name.v) { efree(intern->file_name.v); intern->file_name = NULL_ZSTR; @@ -636,7 +662,7 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); if (intern->flags & SPL_FILE_DIR_USE_GLOB) { - RETURN_LONG(php_glob_stream_get_count(intern->u.dir.dirp)); + 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"); } @@ -1122,9 +1148,7 @@ php_stream_rewinddir(intern->u.dir.dirp); } do { - if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) { - intern->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(intern TSRMLS_CC); } while (!strcmp(intern->u.dir.entry.d_name, ".") || !strcmp(intern->u.dir.entry.d_name, "..")); } /* }}} */ @@ -1137,9 +1161,7 @@ intern->u.dir.index++; do { - if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) { - intern->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(intern TSRMLS_CC); } while (!strcmp(intern->u.dir.entry.d_name, ".") || !strcmp(intern->u.dir.entry.d_name, "..")); if (intern->file_name.v) { efree(intern->file_name.v); @@ -1336,9 +1358,7 @@ spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter); object->u.dir.index++; - if (!object->u.dir.dirp || !php_stream_readdir(object->u.dir.dirp, &object->u.dir.entry)) { - object->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(object TSRMLS_CC); if (object->file_name.v) { efree(object->file_name.v); object->file_name = NULL_ZSTR; @@ -1355,9 +1375,7 @@ if (object->u.dir.dirp) { php_stream_rewinddir(object->u.dir.dirp); } - if (!object->u.dir.dirp || !php_stream_readdir(object->u.dir.dirp, &object->u.dir.entry)) { - object->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(object TSRMLS_CC); } /* }}} */ @@ -1426,9 +1444,7 @@ object->u.dir.index++; do { - if (!object->u.dir.dirp || !php_stream_readdir(object->u.dir.dirp, &object->u.dir.entry)) { - object->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(object TSRMLS_CC); } while (!strcmp(object->u.dir.entry.d_name, ".") || !strcmp(object->u.dir.entry.d_name, "..")); if (object->file_name.v) { efree(object->file_name.v); @@ -1452,9 +1468,7 @@ php_stream_rewinddir(object->u.dir.dirp); } do { - if (!object->u.dir.dirp || !php_stream_readdir(object->u.dir.dirp, &object->u.dir.entry)) { - object->u.dir.entry.d_name[0] = '\0'; - } + spl_filesystem_dir_read(object TSRMLS_CC); } while (!strcmp(object->u.dir.entry.d_name, ".") || !strcmp(object->u.dir.entry.d_name, "..")); if (iterator->current) { zval_ptr_dtor(&iterator->current); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.30&r2=1.31&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.30 php-src/ext/spl/spl_directory.h:1.31 --- php-src/ext/spl/spl_directory.h:1.30 Sat Mar 3 21:41:56 2007 +++ php-src/ext/spl/spl_directory.h Sat Mar 3 23:41:43 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.30 2007/03/03 21:41:56 helly Exp $ */ +/* $Id: spl_directory.h,v 1.31 2007/03/03 23:41:43 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -121,6 +121,7 @@ #define SPL_FILE_DIR_KEY_MODE_MASK 0x00000F00 /* mask RecursiveDirectoryTree::key() */ #define SPL_FILE_DIR_USE_GLOB 0x00001000 /* use glob for open dir*/ +#define SPL_FILE_DIR_GLOB_REFETCH_PATH 0x00002000 /* whether we need to refetch the path in glob mode */ #endif /* SPL_DIRECTORY_H */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php