From 9a1568c1134535179366b105d7ae8578bc6bfda4 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Fri, 26 Nov 2010 09:52:28 +0000 Subject: [PATCH] Implemented FR #53407 (make scandir()'s directory sorting optional). --- NEWS | 4 + UPGRADING | 7 ++ ext/standard/dir.c | 8 +- ext/standard/php_dir.h | 4 + ext/standard/tests/dir/scandir_basic.phpt | 2 +- .../tests/dir/scandir_variation10.phpt | 79 +++++++++++++++++++ .../tests/dir/scandir_variation3.phpt | 2 +- 7 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 ext/standard/tests/dir/scandir_variation10.phpt diff --git a/NEWS b/NEWS index 2c3d7504df..ca5e34810f 100644 --- a/NEWS +++ b/NEWS @@ -128,6 +128,10 @@ PHP NEWS . PDO_mysql: Removed support for linking with MySQL client libraries older than 4.1. (Johannes) +- Improved filesystem functions: + . scandir() now accepts SCANDIR_SORT_NONE as a possible sorting_order value. + FR #53407. (Adam) + - Improved HASH extension: . Added Jenkins's one-at-a-time hash support. (Martin Jansen) . Added FNV-1 hash support. (Michael Maclean) diff --git a/UPGRADING b/UPGRADING index 7218e65d29..d1c3357eb3 100755 --- a/UPGRADING +++ b/UPGRADING @@ -136,6 +136,10 @@ UPGRADE NOTES - PHP X.Y - The third parameter ($matches) to preg_match_all() is now optional. If omitted, the function will simply return the number of times the pattern was matched in the subject and will have no other side effects. +- The second argument of scandir() now accepts SCANDIR_SORT_NONE (2) as a + possible value. This value results in scandir() performing no sorting: on + local filesystems, this allows files to be returned in native filesystem + order. =================================== @@ -298,6 +302,9 @@ UPGRADE NOTES - PHP X.Y - ENT_XML1 - ENT_XHTML - ENT_HTML5 + - SCANDIR_SORT_ASCENDING + - SCANDIR_SORT_DESCENDING + - SCANDIR_SORT_NONE g. New classes diff --git a/ext/standard/dir.c b/ext/standard/dir.c index a788706a34..f572e2ff32 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -148,6 +148,10 @@ PHP_MINIT_FUNCTION(dir) pathsep_str[1] = '\0'; REGISTER_STRING_CONSTANT("PATH_SEPARATOR", pathsep_str, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SCANDIR_SORT_ASCENDING", PHP_SCANDIR_SORT_ASCENDING, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SCANDIR_SORT_DESCENDING", PHP_SCANDIR_SORT_DESCENDING, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SCANDIR_SORT_NONE", PHP_SCANDIR_SORT_NONE, CONST_CS | CONST_PERSISTENT); + #ifdef HAVE_GLOB #ifdef GLOB_BRACE @@ -563,8 +567,10 @@ PHP_FUNCTION(scandir) context = php_stream_context_from_zval(zcontext, 0); } - if (!flags) { + if (flags == PHP_SCANDIR_SORT_ASCENDING) { n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasort); + } else if (flags == PHP_SCANDIR_SORT_NONE) { + n = php_stream_scandir(dirn, &namelist, context, NULL); } else { n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasortr); } diff --git a/ext/standard/php_dir.h b/ext/standard/php_dir.h index 157480d328..63b7a9b860 100644 --- a/ext/standard/php_dir.h +++ b/ext/standard/php_dir.h @@ -37,4 +37,8 @@ PHP_FUNCTION(getdir); PHP_FUNCTION(glob); PHP_FUNCTION(scandir); +#define PHP_SCANDIR_SORT_ASCENDING 0 +#define PHP_SCANDIR_SORT_DESCENDING 1 +#define PHP_SCANDIR_SORT_NONE 2 + #endif /* PHP_DIR_H */ diff --git a/ext/standard/tests/dir/scandir_basic.phpt b/ext/standard/tests/dir/scandir_basic.phpt index 25700a7a4f..7a044da529 100644 --- a/ext/standard/tests/dir/scandir_basic.phpt +++ b/ext/standard/tests/dir/scandir_basic.phpt @@ -25,7 +25,7 @@ echo "\n-- scandir() with mandatory arguments --\n"; var_dump(scandir($directory)); echo "\n-- scandir() with all arguments --\n"; -$sorting_order = 1; +$sorting_order = SCANDIR_SORT_DESCENDING; $context = stream_context_create(); var_dump(scandir($directory, $sorting_order, $context)); diff --git a/ext/standard/tests/dir/scandir_variation10.phpt b/ext/standard/tests/dir/scandir_variation10.phpt new file mode 100644 index 0000000000..412836b2ba --- /dev/null +++ b/ext/standard/tests/dir/scandir_variation10.phpt @@ -0,0 +1,79 @@ +--TEST-- +Test scandir() function : usage variations - different sorting constants +--FILE-- + +===DONE=== +--CLEAN-- + +--EXPECTF-- +SCANDIR_SORT_ASCENDING: 0 +SCANDIR_SORT_DESCENDING: 1 +SCANDIR_SORT_NONE: 2 +*** Testing scandir() : usage variations *** +array(4) { + [0]=> + string(1) "." + [1]=> + string(2) ".." + [2]=> + string(9) "file1.tmp" + [3]=> + string(9) "file2.tmp" +} +array(4) { + [0]=> + string(9) "file2.tmp" + [1]=> + string(9) "file1.tmp" + [2]=> + string(2) ".." + [3]=> + string(1) "." +} +int(4) +bool(true) +bool(true) +bool(true) +bool(true) +===DONE=== diff --git a/ext/standard/tests/dir/scandir_variation3.phpt b/ext/standard/tests/dir/scandir_variation3.phpt index 8e23faf2d4..58da5e2c53 100644 --- a/ext/standard/tests/dir/scandir_variation3.phpt +++ b/ext/standard/tests/dir/scandir_variation3.phpt @@ -16,7 +16,7 @@ echo "*** Testing scandir() : usage variations ***\n"; // Initialise function arguments not being substituted $dir = dirname(__FILE__) . '/scandir_variation3'; mkdir($dir); -$sorting_order = 0; +$sorting_order = SCANDIR_SORT_ASCENDING; //get an unset variable $unset_var = 10; -- 2.40.0