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