]> granicus.if.org Git - php/commitdiff
MFH - Added SplFileInfo::getExtension() (FR #48767)
authorPeter Cowburn <salathe@php.net>
Fri, 11 Feb 2011 22:07:22 +0000 (22:07 +0000)
committerPeter Cowburn <salathe@php.net>
Fri, 11 Feb 2011 22:07:22 +0000 (22:07 +0000)
NEWS
UPGRADING
ext/spl/spl_directory.c
ext/spl/tests/DirectoryIterator_getExtension_basic.phpt [new file with mode: 0644]
ext/spl/tests/SplFileInfo_getExtension_basic.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 4ef711fadc8e0ced8059ff4d4f15bc2386cbab21..2dee23ad1562a6abf0e97eed4a920e8e8afe4635 100644 (file)
--- a/NEWS
+++ b/NEWS
   . Fixed bug #53914 (SPL assumes HAVE_GLOB is defined). (Chris Jones)
   . Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
     values). (Felipe)
-    
+  . Added SplFileInfo::getExtension(). FR #48767. (Peter Cowburn)
+
 - SQLite3 extension:
   . Fixed memory leaked introduced by the NULL poisoning patch.
     (Mateusz Kocielski, Pierre)
index de6127699f3ad6169dee267d55245a8f493f6225..310bcfdb0315c7c243e4f673c3e92f5f8e141099 100755 (executable)
--- a/UPGRADING
+++ b/UPGRADING
@@ -670,7 +670,9 @@ UPGRADE NOTES - PHP 5.3
                        ReflectionClass::inNamespace()
                        ReflectionClass::getNamespaceName()
                        ReflectionClass::getShortName()
-       - SPL           SplObjectStorage::addAll()
+       - SPL:          DirectoryIterator::getExtension()
+                       SplFileObject::getExtension()
+                       SplObjectStorage::addAll()
                        SplObjectStorage::removeAll()
        - XSL:          XSLTProcessor::setProfiling()
 
index 04c2c114b2b04108f28d90e48d0f0a5f7ee47c8f..c143cd0ead13b8f7871fcf020d6ba0b00510a773 100755 (executable)
@@ -849,6 +849,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)
@@ -1786,6 +1846,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)
@@ -1829,6 +1890,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 (file)
index 0000000..20ef3bf
--- /dev/null
@@ -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 (file)
index 0000000..b47b6bb
--- /dev/null
@@ -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) ""