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

Reply via email to