]> granicus.if.org Git - php/commitdiff
- Really fix flag handling
authorMarcus Boerger <helly@php.net>
Mon, 4 Feb 2008 19:33:03 +0000 (19:33 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 4 Feb 2008 19:33:03 +0000 (19:33 +0000)
ext/spl/spl_directory.c
ext/spl/spl_directory.h

index 60bc4093f00b93e8b1050981c5de3f6e3ac16416..b3cd03b82e239da04902eef2b692754db4e2d83f 100755 (executable)
@@ -597,13 +597,15 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flag
        zstr path;
        int parsed, len;
        zend_uchar path_type;
-       long flags = 0;
+       long flags;
        
        php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC);
 
        if (ctor_flags & DIT_CTOR_FLAGS) {
+               flags = 0;
                parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path, &len, &path_type, &flags);
        } else {
+               flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
                parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &path, &len, &path_type);
        }
        if (parsed == FAILURE) {
@@ -837,7 +839,7 @@ SPL_METHOD(FilesystemIterator, key)
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
-       if (intern->flags & SPL_FILE_DIR_KEY_AS_FILENAME) {
+       if (SPL_FILE_DIR_KEY(intern, SPL_FILE_DIR_KEY_AS_FILENAME)) {
                RETURN_RT_STRING(intern->u.dir.entry.d_name, ZSTR_DUPLICATE);
        } else {
                spl_filesystem_object_get_file_name(intern TSRMLS_CC);
@@ -852,10 +854,10 @@ SPL_METHOD(FilesystemIterator, current)
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
-       if (intern->flags & SPL_FILE_DIR_CURRENT_AS_PATHNAME) {
+       if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) {
                spl_filesystem_object_get_file_name(intern TSRMLS_CC);
                RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE);
-       } else if (intern->flags & SPL_FILE_DIR_CURRENT_AS_FILEINFO) {
+       } else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) {
                spl_filesystem_object_get_file_name(intern TSRMLS_CC);
                spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value TSRMLS_CC);
        } else {
@@ -1460,14 +1462,14 @@ static void spl_filesystem_tree_it_current_data(zend_object_iterator *iter, zval
        spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
        spl_filesystem_object   *object   = spl_filesystem_iterator_to_object(iterator);
 
-       if (object->flags & SPL_FILE_DIR_CURRENT_AS_PATHNAME) {
+       if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) {
                if (!iterator->current) {
                        ALLOC_INIT_ZVAL(iterator->current);
                        spl_filesystem_object_get_file_name(object TSRMLS_CC);
                        ZVAL_ZSTRL(iterator->current, object->file_name_type, object->file_name, object->file_name_len, ZSTR_DUPLICATE);
                }
                *data = &iterator->current;
-       } else if (object->flags & SPL_FILE_DIR_CURRENT_AS_FILEINFO) {
+       } else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) {
                if (!iterator->current) {
                        ALLOC_INIT_ZVAL(iterator->current);
                        spl_filesystem_object_get_file_name(object TSRMLS_CC);
@@ -1485,7 +1487,7 @@ static int spl_filesystem_tree_it_current_key(zend_object_iterator *iter, zstr *
 {
        spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter);
        
-       if (object->flags & SPL_FILE_DIR_KEY_AS_FILENAME) {
+       if (SPL_FILE_DIR_KEY(object, SPL_FILE_DIR_KEY_AS_FILENAME)) {
                *str_key_len = strlen(object->u.dir.entry.d_name) + 1;
                str_key->s = estrndup(object->u.dir.entry.d_name, *str_key_len - 1);
                return HASH_KEY_IS_STRING;
@@ -1898,11 +1900,11 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern TSRML
                case IS_UNICODE:
                        return Z_STRLEN_P(intern->u.file.current_zval) == 0;
                case IS_ARRAY:
-                       if ((intern->flags & SPL_FILE_OBJECT_READ_CSV) 
+                       if ((intern->flags & SPL_FILE_OBJECT_READ_CSV)
                        && zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 1) {
                                zval ** first = Z_ARRVAL_P(intern->u.file.current_zval)->pListHead->pData;
                                        
-                               return (Z_TYPE_PP(first) == IS_STRING || Z_TYPE_PP(first) == IS_UNICODE) 
+                               return (Z_TYPE_PP(first) == IS_STRING || Z_TYPE_PP(first) == IS_UNICODE)
                                        && Z_STRLEN_PP(first) == 0;
                        }
                        return zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 0;
@@ -2482,17 +2484,17 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object___construct, 0, 0, 1)
 ZEND_END_ARG_INFO()
 
 static
-ZEND_BEGIN_ARG_INFO(arginfo_file_object_setFlags, 0) 
+ZEND_BEGIN_ARG_INFO(arginfo_file_object_setFlags, 0)
        ZEND_ARG_INFO(0, flags)
 ZEND_END_ARG_INFO()
 
 static
-ZEND_BEGIN_ARG_INFO(arginfo_file_object_setMaxLineLen, 0) 
+ZEND_BEGIN_ARG_INFO(arginfo_file_object_setMaxLineLen, 0)
        ZEND_ARG_INFO(0, max_len)
 ZEND_END_ARG_INFO()
 
 static
-ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetcsv, 0, 0, 0) 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetcsv, 0, 0, 0)
        ZEND_ARG_INFO(0, delimiter)
        ZEND_ARG_INFO(0, enclosure)
 ZEND_END_ARG_INFO()
@@ -2604,9 +2606,9 @@ PHP_MINIT_FUNCTION(spl_directory)
        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, "CURRENT_AS_SELF",     SPL_FILE_DIR_CURRENT_AS_SELF);
        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_PATHNAME",     SPL_FILE_DIR_KEY_AS_PATHNAME);
        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);
 
index e755340979d21975060edd11cf188f5d8447c076..2d3d1a674ec3f85ecbc04a1a5427e8423f54d3cf 100755 (executable)
@@ -118,12 +118,16 @@ static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_files
 #define SPL_FILE_OBJECT_SKIP_EMPTY         0x00000006 /* skip empty lines */
 #define SPL_FILE_OBJECT_READ_CSV           0x00000008 /* read via fgetcsv */
 
-#define SPL_FILE_DIR_CURRENT_AS_FILEINFO   0x00000010 /* make RecursiveDirectoryTree::current() return SplFileInfo */
+#define SPL_FILE_DIR_CURRENT_AS_FILEINFO   0x00000000 /* make RecursiveDirectoryTree::current() return SplFileInfo */
+#define SPL_FILE_DIR_CURRENT_AS_SELF       0x00000010 /* make RecursiveDirectoryTree::current() return getSelf() */
 #define SPL_FILE_DIR_CURRENT_AS_PATHNAME   0x00000020 /* make RecursiveDirectoryTree::current() return getPathname() */
 #define SPL_FILE_DIR_CURRENT_MODE_MASK     0x000000F0 /* mask RecursiveDirectoryTree::current() */
+#define SPL_FILE_DIR_CURRENT(intern,mode)  ((intern->flags&SPL_FILE_DIR_CURRENT_MODE_MASK)==mode)
 
+#define SPL_FILE_DIR_KEY_AS_PATHNAME       0x00000000 /* make RecursiveDirectoryTree::key() return getPathname() */
 #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_KEY(intern,mode)      ((intern->flags&SPL_FILE_DIR_KEY_MODE_MASK)==mode)
 
 #endif /* SPL_DIRECTORY_H */