summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorPeter Cowburn <salathe@php.net>2010-12-23 22:32:52 +0000
committerPeter Cowburn <salathe@php.net>2010-12-23 22:32:52 +0000
commit064a254483428dad4ca1c84826e7197b70e89c88 (patch)
treeb9f51030aa602fe614d3ac5374eb130d6d00f0c3 /ext
parent73c49036ced3af5c740cde2ba9788a4f2ba93aef (diff)
downloadphp-git-064a254483428dad4ca1c84826e7197b70e89c88.tar.gz
Implemented FR #48767 (SplFileInfo::getExtension())
Diffstat (limited to 'ext')
-rwxr-xr-xext/spl/spl_directory.c62
-rw-r--r--ext/spl/tests/DirectoryIterator_getExtension_basic.phpt51
-rw-r--r--ext/spl/tests/SplFileInfo_getExtension_basic.phpt31
3 files changed, 144 insertions, 0 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index cacb11f180..543401bec1 100755
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -844,6 +844,66 @@ SPL_METHOD(DirectoryIterator, getFilename)
}
/* }}} */
+/* {{{ proto string SplFileInfo::getExtension()
+ Returns file extension component of path */
+SPL_METHOD(SplFileInfo, getExtension)
+{
+ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ char *fname, *p;
+ size_t flen;
+ int path_len, idx;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC);
+
+ if (path_len && path_len < intern->file_name_len) {
+ fname = intern->file_name + path_len + 1;
+ flen = intern->file_name_len - (path_len + 1);
+ } else {
+ fname = intern->file_name;
+ flen = intern->file_name_len;
+ }
+
+ php_basename(fname, flen, NULL, 0, &fname, &flen TSRMLS_CC);
+
+ p = zend_memrchr(fname, '.', flen);
+ if (p) {
+ idx = p - fname;
+ RETURN_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+ }
+
+ RETURN_EMPTY_STRING();
+}
+/* }}}*/
+
+/* {{{ proto string DirectoryIterator::getExtension()
+ Returns the file extension component of path */
+SPL_METHOD(DirectoryIterator, getExtension)
+{
+ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ char *fname, *p;
+ size_t flen;
+ int idx;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), NULL, 0, &fname, &flen TSRMLS_CC);
+
+ p = zend_memrchr(fname, '.', flen);
+ if (p) {
+ idx = p - fname;
+ RETURN_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+ }
+
+ RETURN_EMPTY_STRING();
+}
+/* }}} */
+
/* {{{ proto string SplFileInfo::getBasename([string $suffix]) U
Returns filename component of path */
SPL_METHOD(SplFileInfo, getBasename)
@@ -1778,6 +1838,7 @@ static const zend_function_entry spl_SplFileInfo_functions[] = {
SPL_ME(SplFileInfo, __construct, arginfo_info___construct, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, getPath, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, getFilename, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFileInfo, getExtension, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, getBasename, arginfo_optinalSuffix, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, getPathname, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
SPL_ME(SplFileInfo, getPerms, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
@@ -1821,6 +1882,7 @@ ZEND_END_ARG_INFO();
static const zend_function_entry spl_DirectoryIterator_functions[] = {
SPL_ME(DirectoryIterator, __construct, arginfo_dir___construct, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, getFilename, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
+ SPL_ME(DirectoryIterator, getExtension, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, getBasename, arginfo_optinalSuffix, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, isDot, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, rewind, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
diff --git a/ext/spl/tests/DirectoryIterator_getExtension_basic.phpt b/ext/spl/tests/DirectoryIterator_getExtension_basic.phpt
new file mode 100644
index 0000000000..20ef3bf36e
--- /dev/null
+++ b/ext/spl/tests/DirectoryIterator_getExtension_basic.phpt
@@ -0,0 +1,51 @@
+--TEST--
+SPL: DirectoryIterator::getExtension() basic test
+--FILE--
+<?php
+$dir = __DIR__ . DIRECTORY_SEPARATOR . md5('DirectoryIterator::getExtension') . DIRECTORY_SEPARATOR;
+mkdir($dir);
+
+$files = array('test.txt', 'test.extension', 'test..', 'test.', 'test');
+foreach ($files as $file) {
+ touch($dir . $file);
+}
+
+$dit_exts = array();
+$nfo_exts = array();
+$skip = array('.', '..');
+
+foreach (new DirectoryIterator($dir) as $file) {
+ if (in_array($file->getFilename(), $skip)) {
+ continue;
+ }
+ $dit_exts[] = $file->getExtension();
+ $nfo_exts[] = pathinfo($file->getFilename(), PATHINFO_EXTENSION);
+}
+var_dump($dit_exts === $nfo_exts);
+sort($dit_exts);
+var_dump($dit_exts);
+?>
+--CLEAN--
+<?php
+$dir = __DIR__ . DIRECTORY_SEPARATOR . md5('DirectoryIterator::getExtension') . DIRECTORY_SEPARATOR;
+$files = array('test.txt', 'test.extension', 'test..', 'test.', 'test');
+foreach ($files as $file) {
+ unlink($dir . $file);
+}
+rmdir($dir);
+?>
+--EXPECTF--
+bool(true)
+array(5) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(9) "extension"
+ [4]=>
+ string(3) "txt"
+}
+
diff --git a/ext/spl/tests/SplFileInfo_getExtension_basic.phpt b/ext/spl/tests/SplFileInfo_getExtension_basic.phpt
new file mode 100644
index 0000000000..b47b6bb4d0
--- /dev/null
+++ b/ext/spl/tests/SplFileInfo_getExtension_basic.phpt
@@ -0,0 +1,31 @@
+--TEST--
+SPL: SplFileInfo::getExtension() basic test
+--FILE--
+<?php
+$file = md5('SplFileInfo::getExtension');
+$exts = array('.txt', '.extension', '..', '.', '');
+foreach ($exts as $ext) {
+ touch($file . $ext);
+ $info = new SplFileInfo($file . $ext);
+ var_dump($info->getExtension(), pathinfo($file . $ext, PATHINFO_EXTENSION));
+}
+?>
+--CLEAN--
+<?php
+$file = md5('SplFileInfo::getExtension');
+$exts = array('.txt', '.extension', '..', '.', '');
+foreach ($exts as $ext) {
+ unlink($file . $ext);
+}
+?>
+--EXPECTF--
+string(3) "txt"
+string(3) "txt"
+string(9) "extension"
+string(9) "extension"
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""