colder Tue Jul 8 22:40:30 2008 UTC Modified files: /php-src/ext/spl spl_directory.c /php-src/ext/spl/tests dit_001.phpt fileobject_003.phpt fileobject_004.phpt fileobject_getfileinfo_basic.phpt Log: - Fix filename in debug_info - Fix #45345 (getPathInfo on the file instead of the dir) - Remove trailing / on input
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.157&r2=1.158&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.157 php-src/ext/spl/spl_directory.c:1.158 --- php-src/ext/spl/spl_directory.c:1.157 Wed Jul 2 10:46:52 2008 +++ php-src/ext/spl/spl_directory.c Tue Jul 8 22:40:29 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.157 2008/07/02 10:46:52 tony2001 Exp $ */ +/* $Id: spl_directory.c,v 1.158 2008/07/08 22:40:29 colder Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -374,29 +374,47 @@ intern->file_name = use_copy ? ezstrndup(type, path, len) : path; intern->file_name_len = len; - if (type == IS_UNICODE) { - p1.u = u_strrchr(path.u, '/'); - } else { - p1.s = strrchr(path.s, '/'); - } + while (1) { + if (type == IS_UNICODE) { + p1.u = u_strrchr(intern->file_name.u, '/'); + } else { + p1.s = strrchr(intern->file_name.s, '/'); + } #if defined(PHP_WIN32) || defined(NETWARE) - if (type == IS_UNICODE) { - p2.u = u_strrchr(path.u, '\\'); - } else { - p2.s = strrchr(path.s, '\\'); - } + if (type == IS_UNICODE) { + p2.u = u_strrchr(intern->file_name.u, '\\'); + } else { + p2.s = strrchr(intern->file_name.s, '\\'); + } #else - p2.v = 0; + p2.v = 0; #endif - if (p1.v || p2.v) { - if (type == IS_UNICODE) { - intern->_path_len = (p1.u > p2.u ? p1.u : p2.u) - path.u; + if (p1.v || p2.v) { + zstr slash_pos; + + if (type == IS_UNICODE) { + slash_pos.u = (p1.u > p2.u ? p1.u : p2.u); + if (IS_SLASH_AT(type, intern->file_name, intern->file_name_len)) { + intern->file_name_len = slash_pos.u - intern->file_name.u; + intern->file_name.u[intern->file_name_len] = 0; + continue; + } + intern->_path_len = slash_pos.u - intern->file_name.u; + } else { + slash_pos.s = (p1.s > p2.s ? p1.s : p2.s); + if (IS_SLASH_AT(type, intern->file_name, intern->file_name_len)) { + intern->file_name_len = slash_pos.s - intern->file_name.s; + intern->file_name.s[intern->file_name_len] = 0; + continue; + } + intern->_path_len = slash_pos.s - intern->file_name.s; + } } else { - intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - path.s; + intern->_path_len = 0; } - } else { - intern->_path_len = 0; + break; } + intern->_path_type = type; intern->_path = ezstrndup(type, path, intern->_path_len); } /* }}} */ @@ -542,6 +560,27 @@ } /* }}} */ +static zstr spl_filesystem_object_get_pathname(spl_filesystem_object *intern, int *len, zend_uchar *type TSRMLS_DC) { /* {{{ */ + switch (intern->type) { + case SPL_FS_INFO: + case SPL_FS_FILE: + *len = intern->file_name_len; + *type = intern->file_name_type; + return intern->file_name; + case SPL_FS_DIR: + if (intern->u.dir.entry.d_name[0]) { + spl_filesystem_object_get_file_name(intern TSRMLS_CC); + *len = intern->file_name_len; + *type = intern->file_name_type; + return intern->file_name; + } + } + *len = 0; + *type = IS_STRING; + return intern->file_name; /* dummy */ +} +/* }}} */ + static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{{ */ { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(obj TSRMLS_CC); @@ -564,13 +603,23 @@ zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); - path = spl_filesystem_object_get_path(intern, &path_len, &path_type TSRMLS_CC); + path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); 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, path_type, path, 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); + 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) { + path.u = intern->file_name.u + path_len + 1; + } else { + path.s = intern->file_name.s + path_len + 1; + } + add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, intern->file_name_type, path, intern->file_name_len - (path_len + 1), 1); + } else { + 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) { @@ -849,16 +898,13 @@ SPL_METHOD(SplFileInfo, getPathname) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + zstr path; + zend_uchar path_type; + int path_len; - switch (intern->type) { - case SPL_FS_INFO: - case SPL_FS_FILE: - RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); - case SPL_FS_DIR: - if (intern->u.dir.entry.d_name[0]) { - spl_filesystem_object_get_file_name(intern TSRMLS_CC); - RETURN_ZSTRL(intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); - } + path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); + if (path_len) { + RETURN_ZSTRL(path_type, path, path_len, ZSTR_DUPLICATE); } RETURN_BOOL(0); } @@ -1200,8 +1246,10 @@ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) { 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); + zstr path = spl_filesystem_object_get_pathname(intern, &path_len, &path_type TSRMLS_CC); + if (path_len) { + 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); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/dit_001.phpt?r1=1.7&r2=1.8&diff_format=u Index: php-src/ext/spl/tests/dit_001.phpt diff -u php-src/ext/spl/tests/dit_001.phpt:1.7 php-src/ext/spl/tests/dit_001.phpt:1.8 --- php-src/ext/spl/tests/dit_001.phpt:1.7 Sat May 24 14:11:59 2008 +++ php-src/ext/spl/tests/dit_001.phpt Tue Jul 8 22:40:30 2008 @@ -10,9 +10,11 @@ ?> ===DONE=== --EXPECTF-- -object(DirectoryIterator)#%d (3) { +object(DirectoryIterator)#%d (4) { %s"pathName"%s"SplFileInfo":private]=> - %s(1) "." + %s(%d) "./%s" + %s"fileName"%s"SplFileInfo":private]=> + %s(%d) "%s" %s"glob"%s"DirectoryIterator":private]=> bool(false) %s"subPathName"%s"RecursiveDirectoryIterator":private]=> http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/fileobject_003.phpt?r1=1.8&r2=1.9&diff_format=u Index: php-src/ext/spl/tests/fileobject_003.phpt diff -u php-src/ext/spl/tests/fileobject_003.phpt:1.8 php-src/ext/spl/tests/fileobject_003.phpt:1.9 --- php-src/ext/spl/tests/fileobject_003.phpt:1.8 Tue May 27 02:55:51 2008 +++ php-src/ext/spl/tests/fileobject_003.phpt Tue Jul 8 22:40:30 2008 @@ -47,13 +47,13 @@ [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%sfileobject_001a.txt" + unicode(%d) "fileobject_001a.txt" } object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%sfileobject_001a.txt" + unicode(%d) "fileobject_001a.txt" } bool(false) bool(true) @@ -63,7 +63,7 @@ bool(true) unicode(19) "fileobject_001a.txt" bool(true) -unicode(%d) "%stests" +string(%d) "%stests" bool(true) unicode(%d) "%sfileobject_001a.txt" unicode(19) "fileobject_001a.txt" @@ -73,13 +73,13 @@ [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%s" + unicode(%d) "" } object(SplFileInfo)#%d (2) { [u"pathName":u"SplFileInfo":private]=> unicode(%d) "%s" [u"fileName":u"SplFileInfo":private]=> - unicode(%d) "%s" + unicode(%d) "" } bool(false) bool(true) @@ -89,7 +89,7 @@ bool(true) unicode(5) "tests" bool(true) -unicode(%d) "%sspl" +string(%d) "%sspl" bool(true) unicode(%d) "%stests" unicode(%d) "%stests" @@ -115,7 +115,7 @@ bool(true) unicode(%d) "tests" bool(true) -unicode(%d) "%sspl" +string(%d) "%sspl" bool(true) unicode(%d) "%stests" unicode(5) "tests" http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/fileobject_004.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/spl/tests/fileobject_004.phpt diff -u php-src/ext/spl/tests/fileobject_004.phpt:1.3 php-src/ext/spl/tests/fileobject_004.phpt:1.4 --- php-src/ext/spl/tests/fileobject_004.phpt:1.3 Fri Jun 13 00:18:57 2008 +++ php-src/ext/spl/tests/fileobject_004.phpt Tue Jul 8 22:40:30 2008 @@ -16,7 +16,7 @@ ?> ==DONE== --EXPECTF-- -unicode(%d) "%sspl%stests" -unicode(19) "fileobject_004.phpt" -unicode(%d) "%sspl%stests%sfileobject_004.phpt" +%s(%d) "%sspl%stests" +%s(19) "fileobject_004.phpt" +%s(%d) "%sspl%stests%sfileobject_004.phpt" ==DONE== http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt diff -u php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt:1.1 php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt:1.2 --- php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt:1.1 Thu Jun 12 20:46:00 2008 +++ php-src/ext/spl/tests/fileobject_getfileinfo_basic.phpt Tue Jul 8 22:40:30 2008 @@ -18,16 +18,16 @@ --EXPECTF-- object(SplFileInfo)#2 (2) { [u"pathName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl%etests" - [u"fileName":u"SplFileInfo":private]=> %s(%d) "%sext%espl%etests%efileobject_getfileinfo_basic.php" + [u"fileName":u"SplFileInfo":private]=> + %s(%d) "fileobject_getfileinfo_basic.php" } %s(%d) "%sext%espl%etests%efileobject_getfileinfo_basic.php" object(SplFileInfo)#4 (2) { [u"pathName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl" + %s(%d) "%sext%espl%stests" [u"fileName":u"SplFileInfo":private]=> - %s(%d) "%sext%espl%etests" + %s(%d) "tests" } %s(%d) "%sext%espl%etests"
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php