helly Wed Jan 30 23:49:49 2008 UTC Modified files: /php-src/ext/spl spl_directory.c spl_directory.h Log: - MFB SplDirectoryIterator/glob:// stream integration
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.140&r2=1.141&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.140 php-src/ext/spl/spl_directory.c:1.141 --- php-src/ext/spl/spl_directory.c:1.140 Mon Dec 31 07:12:15 2007 +++ php-src/ext/spl/spl_directory.c Wed Jan 30 23:49:49 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.140 2007/12/31 07:12:15 sebastian Exp $ */ +/* $Id: spl_directory.c,v 1.141 2008/01/30 23:49:49 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -85,8 +85,8 @@ zend_object_std_dtor(&intern->std TSRMLS_CC); - if (intern->path.v) { - efree(intern->path.v); + if (intern->_path.v) { + efree(intern->_path.v); } if (intern->file_name.v) { efree(intern->file_name.v); @@ -164,8 +164,31 @@ } /* }}} */ +PHPAPI zstr spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len, zend_uchar *type TSRMLS_DC) /* {{{ */ +{ + if (intern->type == SPL_FS_DIR) { + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + if (type) { + *type = IS_STRING; + } + zstr ret; + ret.s = php_glob_stream_get_path(intern->u.dir.dirp, 0, len); + return ret; + } + } + if (len) { + *len = intern->_path_len; + } + if (type) { + *type = intern->_path_type; + } + return intern->_path; +} /* }}} */ + static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *intern TSRMLS_DC) /* {{{ */ { + zstr path; + zend_uchar path_type; if (!intern->file_name.v) { switch (intern->type) { case SPL_FS_INFO: @@ -173,8 +196,9 @@ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized"); break; case SPL_FS_DIR: - intern->file_name_len = zspprintf(intern->path_type, &intern->file_name, 0, "%R%c%s", intern->path_type, intern->path, DEFAULT_SLASH, intern->u.dir.entry.d_name); - intern->file_name_type = intern->path_type; + path = spl_filesystem_object_get_path(intern, NULL, &path_type TSRMLS_CC); + intern->file_name_len = zspprintf(path_type, &intern->file_name, 0, "%R%c%s", path_type, path, DEFAULT_SLASH, intern->u.dir.entry.d_name); + intern->file_name_type = path_type; break; } } @@ -189,10 +213,11 @@ return 0; } else { if (intern->flags & SPL_FILE_DIR_GLOB_REFETCH_PATH) { - if (intern->path.v) { - efree(intern->path.v); + if (intern->_path.v) { + efree(intern->_path.v); } - intern->path.s = php_glob_stream_get_path(intern->u.dir.dirp, 1, &intern->path_len); + intern->_path.s = php_glob_stream_get_path(intern->u.dir.dirp, 1, &intern->_path_len); + intern->_path_type = IS_STRING; } return 1; } @@ -210,13 +235,13 @@ } intern->type = SPL_FS_DIR; - intern->path_type= type; - intern->path_len = path_len; + intern->_path_type= type; + intern->_path_len = path_len; intern->u.dir.dirp = php_stream_u_opendir(type, path, path_len, options, NULL); if (intern->u.dir.dirp && php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) { - intern->path.s = php_glob_stream_get_path(intern->u.dir.dirp, 1, &intern->path_len); - intern->path_type = IS_STRING; + 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_GLOB_USE; php_glob_stream_get_count(intern->u.dir.dirp, &flags); if (flags & GLOB_APPEND) { @@ -224,11 +249,11 @@ } 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); + } 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_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH); } else { - intern->path = ezstrndup(type, path, intern->path_len); + intern->_path = ezstrndup(type, path, intern->_path_len); intern->flags &= ~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH); } intern->u.dir.index = 0; @@ -304,15 +329,15 @@ switch (source->type) { case SPL_FS_INFO: - intern->path_type = source->path_type; - intern->path_len = source->path_len; - intern->path = ezstrndup(source->path_type, source->path, source->path_len); + intern->_path_type = source->_path_type; + intern->_path_len = source->_path_len; + intern->_path = ezstrndup(source->_path_type, source->_path, source->_path_len); intern->file_name_type = source->file_name_type; intern->file_name_len = source->file_name_len; intern->file_name = ezstrndup(source->file_name_type, source->file_name, intern->file_name_len); break; case SPL_FS_DIR: - spl_filesystem_dir_open(intern, source->path_type, source->path, source->path_len TSRMLS_CC); + spl_filesystem_dir_open(intern, source->_path_type, source->_path, source->_path_len TSRMLS_CC); break; case SPL_FS_FILE: php_error_docref(NULL TSRMLS_CC, E_ERROR, "An object of class %v cannot be cloned", old_object->ce->name); @@ -359,15 +384,15 @@ #endif if (p1.v || p2.v) { if (type == IS_UNICODE) { - intern->path_len = (p1.u > p2.u ? p1.u : p2.u) - path.u; + intern->_path_len = (p1.u > p2.u ? p1.u : p2.u) - path.u; } else { - intern->path_len = (p1.s > p2.s ? p1.s : p2.s) - path.s; + intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - path.s; } } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path_type = type; - intern->path = ezstrndup(type, path, intern->path_len); + intern->_path_type = type; + intern->_path = ezstrndup(type, path, intern->_path_len); } /* }}} */ static spl_filesystem_object * spl_filesystem_object_create_info(spl_filesystem_object *source, zend_uchar file_type, zstr file_path, int file_path_len, int use_copy, zend_class_entry *ce, zval *return_value TSRMLS_DC) /* {{{ */ @@ -446,9 +471,8 @@ zend_call_method_with_1_params(&return_value, ce, &ce->constructor, "__construct", NULL, arg1); zval_ptr_dtor(&arg1); } else { - intern->path_type = source->path_type; - intern->path_len = source->path_len; - intern->path = ezstrndup(source->path_type, source->path, source->path_len); + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len, &intern->_path_type TSRMLS_CC); + intern->_path = ezstrndup(intern->_path_type, intern->_path, intern->_path_len); intern->file_name_type = source->file_name_type; intern->file_name_len = source->file_name_len; intern->file_name = ezstrndup(source->file_name_type, source->file_name, source->file_name_len); @@ -470,9 +494,8 @@ zval_ptr_dtor(&arg1); zval_ptr_dtor(&arg2); } else { - intern->path_type = source->path_type; - intern->path_len = source->path_len; - intern->path = ezstrndup(source->path_type, source->path, source->path_len); + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len, &intern->_path_type TSRMLS_CC); + intern->_path = ezstrndup(intern->_path_type, intern->_path, intern->_path_len); intern->file_name_type = source->file_name_type; intern->file_name_len = source->file_name_len; intern->file_name = source->file_name; @@ -539,16 +562,27 @@ zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1, &pnlen TSRMLS_CC); - add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->path_type, intern->path, intern->path_len, 1); + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->_path_type, intern->_path, intern->_path_len, 1); efree(pnstr.v); if (intern->file_name.v) { pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC); add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->file_name_type, intern->file_name, intern->file_name_len, 1); efree(pnstr.v); } - if (intern->type == SPL_FS_DIR && intern->u.dir.sub_path.v) { + if (intern->type == SPL_FS_DIR) { + pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "glob", sizeof("glob")-1, &pnlen TSRMLS_CC); + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->_path_type, intern->_path, intern->_path_len, 1); + } else { + add_u_assoc_bool_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, 0); + } + efree(pnstr.v); pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1, &pnlen TSRMLS_CC); - add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->u.dir.sub_path_type, intern->u.dir.sub_path, intern->u.dir.sub_path_len, 1); + if (intern->u.dir.sub_path.v) { + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->u.dir.sub_path_type, intern->u.dir.sub_path, intern->u.dir.sub_path_len, 1); + } else { + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, ZEND_STR_TYPE, EMPTY_ZSTR, 0, 1); + } efree(pnstr.v); } if (intern->type == SPL_FS_FILE) { @@ -684,8 +718,11 @@ SPL_METHOD(SplFileInfo, getPath) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + int path_len; + zend_uchar path_type; + zstr path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); - RETURN_ZSTRL(intern->path_type, intern->path, intern->path_len, ZSTR_DUPLICATE); + RETURN_ZSTRL(path_type, path, path_len, ZSTR_DUPLICATE); } /* }}} */ @@ -694,15 +731,18 @@ SPL_METHOD(SplFileInfo, getFilename) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - zstr ret; + zstr ret, path; + zend_uchar path_type; + int path_len; - if (intern->path_len && intern->path_len < intern->file_name_len) { + path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + if (path_len && path_len < intern->file_name_len) { if (intern->file_name_type == IS_UNICODE) { - ret.u = intern->file_name.u + intern->path_len + 1; + ret.u = intern->file_name.u + path_len + 1; } else { - ret.s = intern->file_name.s + intern->path_len + 1; + ret.s = intern->file_name.s + path_len + 1; } - RETURN_ZSTRL(intern->file_name_type, ret, intern->file_name_len - (intern->path_len + 1), ZSTR_DUPLICATE); + RETURN_ZSTRL(intern->file_name_type, ret, intern->file_name_len - (path_len + 1), ZSTR_DUPLICATE); } else { RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); } @@ -724,8 +764,9 @@ SPL_METHOD(SplFileInfo, getBasename) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - zstr fname, suffix; - int flen, slen = 0; + zstr fname, suffix, path; + int flen, slen = 0, path_len; + zend_uchar path_type; suffix.v = 0; if (intern->file_name_type == IS_UNICODE) { @@ -738,13 +779,14 @@ } } - if (intern->path_len && intern->path_len < intern->file_name_len) { + path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + if (path_len && path_len < intern->file_name_len) { if (intern->file_name_type == IS_UNICODE) { - fname.u = intern->file_name.u + intern->path_len + 1; + fname.u = intern->file_name.u + path_len + 1; } else { - fname.s = intern->file_name.s + intern->path_len + 1; + fname.s = intern->file_name.s + path_len + 1; } - flen = intern->file_name_len - (intern->path_len + 1); + flen = intern->file_name_len - (path_len + 1); } else { fname = intern->file_name; flen = intern->file_name_len; @@ -1128,7 +1170,10 @@ php_set_error_handling(EH_THROW, spl_ce_UnexpectedValueException TSRMLS_CC); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) { - spl_filesystem_object_create_info(intern, intern->path_type, intern->path, intern->path_len, 1, ce, return_value TSRMLS_CC); + zend_uchar path_type; + int path_len; + zstr path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + spl_filesystem_object_create_info(intern, path_type, path, path_len, 1, ce, return_value TSRMLS_CC); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1933,15 +1978,15 @@ #endif if (p1.v || p2.v) { if (intern->file_name_type == IS_UNICODE) { - intern->path_len = (p1.u > p2.u ? p1.u : p2.u) - intern->file_name.u; + intern->_path_len = (p1.u > p2.u ? p1.u : p2.u) - intern->file_name.u; } else { - intern->path_len = (p1.s > p2.s ? p1.s : p2.s) - intern->file_name.s; + intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - intern->file_name.s; } } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path_type = intern->file_name_type; - intern->path = ezstrndup(intern->file_name_type, intern->file_name, intern->path_len); + intern->_path_type = intern->file_name_type; + intern->_path = ezstrndup(intern->file_name_type, intern->file_name, intern->_path_len); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1980,9 +2025,9 @@ intern->u.file.zcontext = NULL; if (spl_filesystem_file_open(intern, 0, 0 TSRMLS_CC) == SUCCESS) { - intern->path_type = IS_STRING; - intern->path_len = 0; - intern->path.s = estrndup("", 0); + intern->_path_type = IS_STRING; + intern->_path_len = 0; + intern->_path.s = estrndup("", 0); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.37&r2=1.38&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.37 php-src/ext/spl/spl_directory.h:1.38 --- php-src/ext/spl/spl_directory.h:1.37 Mon Dec 31 07:12:15 2007 +++ php-src/ext/spl/spl_directory.h Wed Jan 30 23:49:49 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.37 2007/12/31 07:12:15 sebastian Exp $ */ +/* $Id: spl_directory.h,v 1.38 2008/01/30 23:49:49 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -43,6 +43,8 @@ typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object TSRMLS_DC); typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst TSRMLS_DC); +PHPAPI zstr spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len, zend_uchar *type TSRMLS_DC); + typedef struct _spl_other_handler { spl_foreign_dtor_t dtor; spl_foreign_clone_t clone; @@ -58,9 +60,9 @@ zend_object std; void *oth; spl_other_handler *oth_handler; - zend_uchar path_type; - zstr path; - int path_len; + zend_uchar _path_type; + zstr _path; + int _path_len; zend_uchar file_name_type; zstr file_name; int file_name_len;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php