]> granicus.if.org Git - php/commitdiff
- Fix a minor issue with glob support - forgot to set length of string
authorMarcus Boerger <helly@php.net>
Sun, 4 Mar 2007 00:23:07 +0000 (00:23 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 4 Mar 2007 00:23:07 +0000 (00:23 +0000)
- Add ability to not use glob on subdirs

ext/spl/spl_directory.c
ext/spl/spl_directory.h

index 1f971f51d3f23d7ba5e00c26210bbe8de39ac781..9e0c355a6a0908a89cf48a6a62ba04e7d03a32ae 100755 (executable)
@@ -1206,24 +1206,22 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
        spl_filesystem_object_get_file_name(intern TSRMLS_CC);
 
        INIT_PZVAL(&zflags);
-       ZVAL_LONG(&zflags, intern->flags);
-
        INIT_PZVAL(&zpath);
-       if (intern->flags & SPL_FILE_DIR_USE_GLOB) {
+       if ((intern->flags & (SPL_FILE_DIR_USE_GLOB|SPL_FILE_DIR_NO_GLOB_CHILD)) == SPL_FILE_DIR_USE_GLOB) {
+               ZVAL_LONG(&zflags, intern->flags);
                Z_TYPE(zpath) = IS_STRING;
-               spprintf(&Z_STRVAL(zpath), 0, "%R%c%s",
+               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_ZSTRL(&zpath, intern->file_name_type, intern->file_name, intern->file_name_len, 0);
+               ZVAL_LONG(&zflags, intern->flags & ~SPL_FILE_DIR_USE_GLOB);
+               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);
 
-       if (intern->flags & SPL_FILE_DIR_USE_GLOB) {
-               efree(Z_STRVAL(zpath));
-       }
+       zval_dtor(&zpath);
 
        subdir = (spl_filesystem_object*)zend_object_store_get_object(return_value TSRMLS_CC);
        if (subdir) {
@@ -2509,7 +2507,8 @@ PHP_MINIT_FUNCTION(spl_directory)
        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, "USE_GLOB", SPL_FILE_DIR_USE_GLOB);
+       REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "USE_GLOB",        SPL_FILE_DIR_USE_GLOB);
+       REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "NO_GLOB_CHILD",   SPL_FILE_DIR_NO_GLOB_CHILD);
 
        spl_ce_DirectoryIterator->get_iterator = spl_filesystem_dir_get_iterator;
 
index 3f9c0d43c71185a65d4d4d826bdf1e51792f17ba..53709767caf82afd4492aa08c822dd0a3f5bee91 100755 (executable)
@@ -122,6 +122,7 @@ static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_files
 
 #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 */
+#define SPL_FILE_DIR_NO_GLOB_CHILD         0x00004000 /* do not use glob on childs */
 
 #endif /* SPL_DIRECTORY_H */