Browse Source

Implemented FR #48767 (SplFileInfo::getExtension())

experimental/with_scalar_types
Peter Cowburn 16 years ago
parent
commit
064a254483
  1. 6
      UPGRADING
  2. 62
      ext/spl/spl_directory.c
  3. 51
      ext/spl/tests/DirectoryIterator_getExtension_basic.phpt
  4. 31
      ext/spl/tests/SplFileInfo_getExtension_basic.phpt

6
UPGRADING

@ -329,6 +329,9 @@ UPGRADE NOTES - PHP X.Y
h. New methods
- DirectoryIterator
- DirectoryIterator::getExtension()
- Reflection:
- ReflectionClass::isCloneable()
- ReflectionClass::getTraits()
@ -339,6 +342,9 @@ UPGRADE NOTES - PHP X.Y
- PDO_dblib
- PDO::newRowset()
- SplFileInfo
- SplFileInfo::getExtension()
- SplFileObject
- SplFileObject::fputcsv()

62
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)

51
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"
}

31
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) ""
Loading…
Cancel
Save