helly Sat Mar 3 15:08:59 2007 UTC Modified files: (Branch: PHP_5_2) /php-src NEWS /php-src/ext/spl spl_directory.c Log: - MFH [DOC] Add SplFileInfo::getBasename(), DirectoryIterator::getBasename - MFH Add SplFileInfo::getLinkTarget(), SplFileInfo::getRealPath() # All based on suggestions by Arnold Daniels http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.567&r2=1.2027.2.547.2.568&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.567 php-src/NEWS:1.2027.2.547.2.568 --- php-src/NEWS:1.2027.2.547.2.567 Sat Mar 3 02:06:43 2007 +++ php-src/NEWS Sat Mar 3 15:08:58 2007 @@ -7,6 +7,10 @@ . libmysql (MySQL) to version 5.0.36 - Upgraded SQLite 3 to version 3.3.13 (Ilia) - Upgraded PCRE to version 7.0 (Nuno) +- Improved SPL (Marcus) + . Added SplFileInfo::getBasename(), DirectoryIterator::getBasename(). + . Added SplFileInfo::getLinkTarget(), SplFileInfo::getRealPath(). +# All based on suggestions by Arnold Davies - Added --ri switch to CLI which allows to check extension information. (Marcus) - Added tidyNode::getParent() method (John, Nuno) - Fixed zend_llist_remove_tail (Michael Wallner, Dmitry) http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.45.2.27.2.16&r2=1.45.2.27.2.17&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.45.2.27.2.16 php-src/ext/spl/spl_directory.c:1.45.2.27.2.17 --- php-src/ext/spl/spl_directory.c:1.45.2.27.2.16 Tue Feb 27 03:28:16 2007 +++ php-src/ext/spl/spl_directory.c Sat Mar 3 15:08:59 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.45.2.27.2.16 2007/02/27 03:28:16 iliaa Exp $ */ +/* $Id: spl_directory.c,v 1.45.2.27.2.17 2007/03/03 15:08:59 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -577,6 +577,50 @@ } /* }}} */ +/* {{{ proto string SplFileInfo::getBasename([string $suffix]) U + Returns filename component of path */ +SPL_METHOD(SplFileInfo, getBasename) +{ + spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char *fname, *suffix = 0; + int flen, slen = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) { + return; + } + + if (intern->path_len && intern->path_len < intern->file_name_len) { + fname = intern->file_name + intern->path_len + 1; + flen = intern->file_name_len - (intern->path_len + 1); + } else { + fname = intern->file_name; + flen = intern->file_name_len; + } + + php_basename(fname, flen, suffix, slen, &fname, &flen TSRMLS_CC); + + RETURN_STRINGL(fname, flen, 0); +} +/* }}}*/ + +/* {{{ proto string DirectoryIterator::getBasename([string $suffix]) U + Returns filename component of current dir entry */ +SPL_METHOD(DirectoryIterator, getBasename) +{ + spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char *suffix = 0, *fname; + int slen = 0, flen; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) { + return; + } + + php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen, &fname, &flen TSRMLS_CC); + + RETURN_STRINGL(fname, flen, 0); +} +/* }}} */ + /* {{{ proto string SplFileInfo::getPathname() Return path and filename */ SPL_METHOD(SplFileInfo, getPathname) @@ -761,6 +805,56 @@ FileInfoFunction(isLink, FS_IS_LINK) /* }}} */ +/* {{{ proto string SplFileInfo::getLinkTarget() U + Return the target of a symbolic link */ +SPL_METHOD(SplFileInfo, getLinkTarget) +{ + spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + int ret; + char buff[MAXPATHLEN]; + + php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC); + + ret = readlink(intern->file_name, buff, MAXPATHLEN-1); + + if (ret == -1) { + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Unable to read link %s, error: %s", intern->file_name, strerror(errno)); + RETVAL_FALSE; + } else { + /* Append NULL to the end of the string */ + buff[ret] = '\0'; + + RETVAL_STRINGL(buff, ret, 1); + } + php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); +} +/* }}} */ + +#if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS) +/* {{{ proto string SplFileInfo::getRealPath() + Return the resolved path */ +SPL_METHOD(SplFileInfo, getRealPath) +{ + spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char buff[MAXPATHLEN]; + + php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC); + + if (VCWD_REALPATH(intern->file_name, buff)) { +#ifdef ZTS + if (VCWD_ACCESS(buff, F_OK)) { + RETVAL_FALSE; + } else +#endif + RETVAL_STRING(buff, 1); + } else { + RETVAL_FALSE; + } + php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); +} +/* }}} */ +#endif + /* {{{ proto SplFileObject SplFileInfo::openFile([string mode = 'r' [, bool use_include_path [, resource context]]]) Open the current file */ SPL_METHOD(SplFileInfo, openFile) @@ -1286,12 +1380,18 @@ ZEND_ARG_INFO(0, class_name) ZEND_END_ARG_INFO() +static +ZEND_BEGIN_ARG_INFO_EX(arginfo_optinalSuffix, 0, 0, 0) + ZEND_ARG_INFO(0, suffix) +ZEND_END_ARG_INFO() + /* the method table */ /* each method can have its own parameters and visibility */ static zend_function_entry spl_SplFileInfo_functions[] = { SPL_ME(SplFileInfo, __construct, arginfo_info___construct, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getPath, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getFilename, NULL, ZEND_ACC_PUBLIC) + SPL_ME(SplFileInfo, getBasename, arginfo_optinalSuffix, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getPathname, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getPerms, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getInode, NULL, ZEND_ACC_PUBLIC) @@ -1308,6 +1408,10 @@ SPL_ME(SplFileInfo, isFile, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, isDir, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, isLink, NULL, ZEND_ACC_PUBLIC) + SPL_ME(SplFileInfo, getLinkTarget, NULL, ZEND_ACC_PUBLIC) +#if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS) + SPL_ME(SplFileInfo, getRealPath, NULL, ZEND_ACC_PUBLIC) +#endif SPL_ME(SplFileInfo, getFileInfo, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, getPathInfo, arginfo_info_optinalFileClass, ZEND_ACC_PUBLIC) SPL_ME(SplFileInfo, openFile, arginfo_info_openFile, ZEND_ACC_PUBLIC) @@ -1327,6 +1431,7 @@ static zend_function_entry spl_DirectoryIterator_functions[] = { SPL_ME(DirectoryIterator, __construct, arginfo_dir___construct, ZEND_ACC_PUBLIC) SPL_ME(DirectoryIterator, getFilename, NULL, ZEND_ACC_PUBLIC) + SPL_ME(DirectoryIterator, getBasename, arginfo_optinalSuffix, ZEND_ACC_PUBLIC) SPL_ME(DirectoryIterator, isDot, NULL, ZEND_ACC_PUBLIC) SPL_ME(DirectoryIterator, rewind, NULL, ZEND_ACC_PUBLIC) SPL_ME(DirectoryIterator, valid, NULL, ZEND_ACC_PUBLIC)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php