helly Sat Feb 2 22:53:05 2008 UTC
Modified files:
/php-src/ext/spl spl_directory.c spl_directory.h
Log:
- MFB glob handling
- Add GlobIterator and FilesystemIterator
# Commit to 5.3 for more
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.142&r2=1.143&diff_format=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.142
php-src/ext/spl/spl_directory.c:1.143
--- php-src/ext/spl/spl_directory.c:1.142 Thu Jan 31 11:09:50 2008
+++ php-src/ext/spl/spl_directory.c Sat Feb 2 22:53:05 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_directory.c,v 1.142 2008/01/31 11:09:50 rrichards Exp $ */
+/* $Id: spl_directory.c,v 1.143 2008/02/02 22:53:05 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -43,15 +43,6 @@
#include "ext/standard/basic_functions.h"
#include "ext/standard/php_filestat.h"
-#include "ext/standard/php_link.h"
-
-#ifdef HAVE_GLOB
-# ifndef PHP_WIN32
-# include <glob.h>
-# else
-# include "win32/glob.h"
-# endif
-#endif
/* declare the class handlers */
static zend_object_handlers spl_filesystem_object_handlers;
@@ -59,7 +50,9 @@
/* decalre the class entry */
PHPAPI zend_class_entry *spl_ce_SplFileInfo;
PHPAPI zend_class_entry *spl_ce_DirectoryIterator;
+PHPAPI zend_class_entry *spl_ce_FilesystemIterator;
PHPAPI zend_class_entry *spl_ce_RecursiveDirectoryIterator;
+PHPAPI zend_class_entry *spl_ce_GlobIterator;
PHPAPI zend_class_entry *spl_ce_SplFileObject;
PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
@@ -197,64 +190,49 @@
break;
case SPL_FS_DIR:
path = spl_filesystem_object_get_path(intern, NULL,
&path_type TSRMLS_CC);
- intern->file_name_len = zspprintf(path_type,
&intern->file_name, 0, "%R%c%s", path_type, path, DEFAULT_SLASH,
intern->u.dir.entry.d_name);
+ intern->file_name_len = zspprintf(path_type,
&intern->file_name, 0, "%R%c%s",
+ path_type, path,
+ DEFAULT_SLASH,
intern->u.dir.entry.d_name);
intern->file_name_type = path_type;
break;
}
}
} /* }}} */
-#define IS_SLASH_AT(type, zs, pos) (type == IS_UNICODE ? IS_U_SLASH(zs.u[pos])
: IS_SLASH(zs.s[pos]))
-
static int spl_filesystem_dir_read(spl_filesystem_object *intern TSRMLS_DC) /*
{{{ */
{
if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp,
&intern->u.dir.entry)) {
intern->u.dir.entry.d_name[0] = '\0';
return 0;
} else {
- if (intern->flags & SPL_FILE_DIR_GLOB_REFETCH_PATH) {
- if (intern->_path.v) {
- efree(intern->_path.v);
- }
- intern->_path.s =
php_glob_stream_get_path(intern->u.dir.dirp, 1, &intern->_path_len);
- intern->_path_type = IS_STRING;
- }
return 1;
}
}
/* }}} */
+#define IS_SLASH_AT(type, zs, pos) (type == IS_UNICODE ? IS_U_SLASH(zs.u[pos])
: IS_SLASH(zs.s[pos]))
+
/* {{{ spl_filesystem_dir_open */
/* open a directory resource */
static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_uchar
type, zstr path, int path_len TSRMLS_DC)
{
- int options = REPORT_ERRORS, flags;
-
- if (intern->flags & SPL_FILE_DIR_GLOB_USE) {
+ int options = REPORT_ERRORS;
+
+#if HELLY_0
+ if (php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) {
options |= STREAM_USE_GLOB_DIR_OPEN;
}
+#endif
intern->type = SPL_FS_DIR;
intern->_path_type= type;
intern->_path_len = path_len;
intern->u.dir.dirp = php_stream_u_opendir(type, path, path_len,
options, NULL);
- if (intern->u.dir.dirp && php_stream_is(intern->u.dir.dirp,
&php_glob_stream_ops)) {
- intern->_path.s = php_glob_stream_get_path(intern->u.dir.dirp,
1, &intern->_path_len);
- intern->_path_type = IS_STRING;
- intern->flags |= SPL_FILE_DIR_GLOB_USE;
- php_glob_stream_get_count(intern->u.dir.dirp, &flags);
- if (flags & GLOB_APPEND) {
- intern->flags |= SPL_FILE_DIR_GLOB_REFETCH_PATH;
- } else {
- intern->flags &= ~SPL_FILE_DIR_GLOB_REFETCH_PATH;
- }
- } else if (intern->_path_len && IS_SLASH_AT(type, path,
intern->_path_len-1)) {
+ if (intern->_path_len && IS_SLASH_AT(type, path, intern->_path_len-1)) {
intern->_path = ezstrndup(type, path, --intern->_path_len);
- intern->flags &=
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH);
} else {
intern->_path = ezstrndup(type, path, intern->_path_len);
- intern->flags &=
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_REFETCH_PATH);
}
intern->u.dir.index = 0;
@@ -399,7 +377,7 @@
{
spl_filesystem_object *intern;
zval *arg1;
-
+
if (!file_path.v || !file_path_len) {
#if defined(PHP_WIN32)
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC,
"Cannot create SplFileInfo for empty path");
@@ -550,6 +528,9 @@
zstr pnstr;
int pnlen;
char stmp[2];
+ int path_len;
+ zstr path;
+ zend_uchar path_type;
*is_temp = 1;
@@ -558,11 +539,12 @@
INIT_PZVAL(&zrv);
Z_ARRVAL(zrv) = rv;
-
+
zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t)
zval_add_ref, (void *) &tmp, sizeof(zval *));
+ path = spl_filesystem_object_get_path(intern, &path_len, &path_type
TSRMLS_CC);
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName",
sizeof("pathName")-1, &pnlen TSRMLS_CC);
- add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1,
intern->_path_type, intern->_path, intern->_path_len, 1);
+ add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr, pnlen+1, path_type,
path, path_len, 1);
efree(pnstr.v);
if (intern->file_name.v) {
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo,
"fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC);
@@ -570,7 +552,7 @@
efree(pnstr.v);
}
if (intern->type == SPL_FS_DIR) {
- pnstr =
spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "glob",
sizeof("glob")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator,
"glob", sizeof("glob")-1, &pnlen TSRMLS_CC);
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
add_u_assoc_zstrl_ex(&zrv, ZEND_STR_TYPE, pnstr,
pnlen+1, intern->_path_type, intern->_path, intern->_path_len, 1);
} else {
@@ -604,23 +586,32 @@
}
/* }}}} */
-/* {{{ proto void DirectoryIterator::__construct(string $path, [int $flags =
0]) U
- Cronstructs a new dir iterator from a path. */
-SPL_METHOD(DirectoryIterator, __construct)
+#define DIT_CTOR_FLAGS 0x00000001
+#define DIT_CTOR_GLOB 0x00000002
+
+UChar u_glob[sizeof("glob://")];
+
+void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int
ctor_flags) /* {{{ */
{
spl_filesystem_object *intern;
zstr path;
- int len;
+ int parsed, len;
zend_uchar path_type;
- long flags = 0;
+ long flags;
php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path,
&len, &path_type, &flags) == FAILURE) {
+ if (ctor_flags & DIT_CTOR_FLAGS) {
+ flags = SPL_FILE_DIR_CURRENT_AS_FILEINFO;
+ parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"t|l", &path, &len, &path_type, &flags);
+ } else {
+ flags = 0;
+ parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t",
&path, &len, &path_type);
+ }
+ if (parsed == FAILURE) {
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
return;
}
-
if (!len) {
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC,
"Directory name must not be empty.");
@@ -630,14 +621,32 @@
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis()
TSRMLS_CC);
intern->flags = flags;
- spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+ if ((ctor_flags & DIT_CTOR_GLOB) && (
+ (path_type == IS_STRING && strstr(path.s, "glob://") != path.s)
||
+ (path_type == IS_UNICODE && u_strstr(path.u, u_glob) != path.u)
+ )) {
+ len = zspprintf(path_type, &path, 0, "glob://%R", path_type,
path);
+ spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+ efree(path.v);
+ } else {
+ spl_filesystem_dir_open(intern, path_type, path, len TSRMLS_CC);
+ }
intern->u.dir.is_recursive = instanceof_function(intern->std.ce,
spl_ce_RecursiveDirectoryIterator TSRMLS_CC) ? 1 : 0;
+ intern->flags = flags;
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
}
/* }}} */
+/* {{{ proto void DirectoryIterator::__construct(string path) U
+ Cronstructs a new dir iterator from a path. */
+SPL_METHOD(DirectoryIterator, __construct)
+{
+ spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
/* {{{ proto void DirectoryIterator::rewind() U
Rewind dir back to the start */
SPL_METHOD(DirectoryIterator, rewind)
@@ -648,7 +657,6 @@
if (intern->u.dir.dirp) {
php_stream_rewinddir(intern->u.dir.dirp);
}
-
spl_filesystem_dir_read(intern TSRMLS_CC);
}
/* }}} */
@@ -700,19 +708,6 @@
}
/* }}} */
-/* {{{ proto string DirectoryIterator::count() U
- Return number of entries in directory, works only when USE_GLOB is in
effect */
-SPL_METHOD(DirectoryIterator, count)
-{
- spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
- if (intern->flags & SPL_FILE_DIR_GLOB_USE) {
- RETURN_LONG(php_glob_stream_get_count(intern->u.dir.dirp,
NULL));
- }
- zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Unable
to determine count unless USE_GLOG flag is in effect");
-}
-/* }}} */
-
/* {{{ proto string SplFileInfo::getPath() U
Return the path */
SPL_METHOD(SplFileInfo, getPath)
@@ -840,9 +835,9 @@
}
/* }}} */
-/* {{{ proto string RecursiveDirectoryIterator::key() U
+/* {{{ proto string FilesystemIterator::key() U
Return getPathname() or getFilename() depending on flags */
-SPL_METHOD(RecursiveDirectoryIterator, key)
+SPL_METHOD(FilesystemIterator, key)
{
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -855,9 +850,9 @@
}
/* }}} */
-/* {{{ proto string RecursiveDirectoryIterator::current() U
+/* {{{ proto string FilesystemIterator::current() U
Return getFilename(), getFileInfo() or $this depending on flags */
-SPL_METHOD(RecursiveDirectoryIterator, current)
+SPL_METHOD(FilesystemIterator, current)
{
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -1180,35 +1175,17 @@
}
/* }}} */
-/* {{{ proto void RecursiveDirectoryIterator::__construct(string path [, int
flags]) U
+/* {{{ proto void FilesystemIterator::__construct(string path [, int flags])
Cronstructs a new dir iterator from a path. */
-SPL_METHOD(RecursiveDirectoryIterator, __construct)
+SPL_METHOD(FilesystemIterator, __construct)
{
- spl_filesystem_object *intern;
- zstr path;
- zend_uchar path_type;
- int path_len;
- long flags = SPL_FILE_DIR_CURRENT_AS_FILEINFO;
-
- php_set_error_handling(EH_THROW, spl_ce_UnexpectedValueException
TSRMLS_CC);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path,
&path_len, &path_type, &flags) == FAILURE) {
- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
- return;
- }
-
- intern = (spl_filesystem_object*)zend_object_store_get_object(getThis()
TSRMLS_CC);
- intern->u.dir.is_recursive = instanceof_function(intern->std.ce,
spl_ce_RecursiveDirectoryIterator TSRMLS_CC) ? 1 : 0;
- intern->flags = flags;
- spl_filesystem_dir_open(intern, path_type, path, path_len TSRMLS_CC);
-
- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+ spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU,
DIT_CTOR_FLAGS);
}
/* }}} */
-/* {{{ proto void RecursiveDirectoryIterator::rewind() U
+/* {{{ proto void FilesystemIterator::rewind() U
Rewind dir back to the start */
-SPL_METHOD(RecursiveDirectoryIterator, rewind)
+SPL_METHOD(FilesystemIterator, rewind)
{
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -1222,9 +1199,9 @@
}
/* }}} */
-/* {{{ proto void RecursiveDirectoryIterator::next() U
+/* {{{ proto void FilesystemIterator::next() U
Move to next entry */
-SPL_METHOD(RecursiveDirectoryIterator, next)
+SPL_METHOD(FilesystemIterator, next)
{
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -1276,17 +1253,8 @@
INIT_PZVAL(&zflags);
INIT_PZVAL(&zpath);
- if ((intern->flags & (SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD))
== (SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD)) {
- ZVAL_LONG(&zflags, intern->flags);
- Z_TYPE(zpath) = IS_STRING;
- Z_STRLEN(zpath) = spprintf(&Z_STRVAL(zpath), 0, "%R%c%s",
- intern->file_name_type, intern->file_name,
- DEFAULT_SLASH,
- php_glob_stream_get_pattern(intern->u.dir.dirp, 0,
NULL));
- } else {
- ZVAL_LONG(&zflags, intern->flags &
~(SPL_FILE_DIR_GLOB_USE|SPL_FILE_DIR_GLOB_CHILD));
- ZVAL_ZSTRL(&zpath, intern->file_name_type, intern->file_name,
intern->file_name_len, 1);
- }
+ ZVAL_LONG(&zflags, intern->flags);
+ ZVAL_ZSTRL(&zpath, intern->file_name_type, intern->file_name,
intern->file_name_len, 1);
spl_instantiate_arg_ex2(spl_ce_RecursiveDirectoryIterator,
&return_value, 0, &zpath, &zflags TSRMLS_CC);
@@ -1340,6 +1308,37 @@
}
/* }}} */
+/* {{{ proto int RecursiveDirectoryIterator::__construct(string path [, int
flags])
+ Cronstructs a new dir iterator from a path. */
+SPL_METHOD(RecursiveDirectoryIterator, __construct)
+{
+ spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU,
DIT_CTOR_FLAGS);
+}
+/* }}} */
+
+/* {{{ proto int GlobIterator::__construct(string path [, int flags]) U
+ Cronstructs a new dir iterator from a glob expression (no glob:// needed). */
+SPL_METHOD(GlobIterator, __construct)
+{
+ spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU,
DIT_CTOR_FLAGS|DIT_CTOR_GLOB);
+}
+/* }}} */
+
+/* {{{ proto int GlobIterator::cont() U
+ Return the number of directories and files found by globbing */
+SPL_METHOD(GlobIterator, count)
+{
+ spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
+ RETURN_LONG(php_glob_stream_get_count(intern->u.dir.dirp,
NULL));
+ } else {
+ /* should not happen */
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "GlobIterator lost
glob state");
+ }
+}
+/* }}} */
+
/* forward declarations to the iterator handlers */
static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC);
static int spl_filesystem_dir_it_valid(zend_object_iterator *iter TSRMLS_DC);
@@ -1370,8 +1369,7 @@
dir_object =
(spl_filesystem_object*)zend_object_store_get_object(object TSRMLS_CC);
iterator = spl_filesystem_object_to_iterator(dir_object);
- Z_ADDREF_P(object);
- Z_ADDREF_P(object);
+ Z_SET_REFCOUNT_P(object, Z_REFCOUNT_P(object) + 2);
iterator->intern.data = (void*)object;
iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
iterator->current = object;
@@ -1675,9 +1673,8 @@
};
static
-ZEND_BEGIN_ARG_INFO_EX(arginfo_dir___construct, 0, 0, 1)
+ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0)
ZEND_ARG_INFO(0, path)
- ZEND_ARG_INFO(0, flags)
ZEND_END_ARG_INFO()
/* the method table */
@@ -1692,7 +1689,6 @@
SPL_ME(DirectoryIterator, key, NULL, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, current, NULL, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, next, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(DirectoryIterator, count, NULL, ZEND_ACC_PUBLIC)
SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename,
NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
@@ -1708,12 +1704,17 @@
ZEND_ARG_INFO(0, allow_links)
ZEND_END_ARG_INFO()
+static const zend_function_entry spl_FilesystemIterator_functions[] = {
+ SPL_ME(FilesystemIterator, __construct, arginfo_r_dir___construct,
ZEND_ACC_PUBLIC)
+ SPL_ME(FilesystemIterator, rewind, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(FilesystemIterator, next, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(FilesystemIterator, key, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(FilesystemIterator, current, NULL, ZEND_ACC_PUBLIC)
+ {NULL, NULL, NULL}
+};
+
static const zend_function_entry spl_RecursiveDirectoryIterator_functions[] = {
SPL_ME(RecursiveDirectoryIterator, __construct,
arginfo_r_dir___construct, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveDirectoryIterator, rewind, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveDirectoryIterator, next, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveDirectoryIterator, key, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveDirectoryIterator, current, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveDirectoryIterator, hasChildren,
arginfo_r_dir_hasChildren, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveDirectoryIterator, getChildren, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveDirectoryIterator, getSubPath, NULL, ZEND_ACC_PUBLIC)
@@ -1721,6 +1722,12 @@
{NULL, NULL, NULL}
};
+static const zend_function_entry spl_GlobIterator_functions[] = {
+ SPL_ME(GlobIterator, __construct, arginfo_r_dir___construct,
ZEND_ACC_PUBLIC)
+ SPL_ME(GlobIterator, count, NULL,
ZEND_ACC_PUBLIC)
+ {NULL, NULL, NULL}
+};
+
static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent
TSRMLS_DC) /* {{{ */
{
char *buf;
@@ -2207,7 +2214,7 @@
RETURN_FALSE;
}
escape = esc[0];
-
+ /* no break */
case 2:
if (e_len != 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"enclosure must be a character");
@@ -2583,6 +2590,8 @@
*/
PHP_MINIT_FUNCTION(spl_directory)
{
+ u_charsToUChars("glob://", u_glob, sizeof("glob://"));
+
REGISTER_SPL_STD_CLASS_EX(SplFileInfo, spl_filesystem_object_new,
spl_SplFileInfo_functions);
memcpy(&spl_filesystem_object_handlers, zend_get_std_object_handlers(),
sizeof(zend_object_handlers));
spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
@@ -2592,24 +2601,26 @@
REGISTER_SPL_SUB_CLASS_EX(DirectoryIterator, SplFileInfo,
spl_filesystem_object_new, spl_DirectoryIterator_functions);
zend_class_implements(spl_ce_DirectoryIterator TSRMLS_CC, 1,
zend_ce_iterator);
- REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "GLOB",
SPL_FILE_DIR_GLOB_USE);
- REGISTER_SPL_CLASS_CONST_LONG(DirectoryIterator, "GLOB_CHILD",
SPL_FILE_DIR_GLOB_CHILD);
-
spl_ce_DirectoryIterator->get_iterator =
spl_filesystem_dir_get_iterator;
- REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator,
DirectoryIterator, spl_filesystem_object_new,
spl_RecursiveDirectoryIterator_functions);
- REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
+ REGISTER_SPL_SUB_CLASS_EX(FilesystemIterator, DirectoryIterator,
spl_filesystem_object_new, spl_FilesystemIterator_functions);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"CURRENT_MODE_MASK", SPL_FILE_DIR_CURRENT_MODE_MASK);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"CURRENT_AS_FILEINFO", SPL_FILE_DIR_CURRENT_AS_FILEINFO);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"CURRENT_AS_SELF", 0);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"KEY_MODE_MASK", SPL_FILE_DIR_KEY_MODE_MASK);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"KEY_AS_PATHNAME", 0);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"KEY_AS_FILENAME", SPL_FILE_DIR_KEY_AS_FILENAME);
- REGISTER_SPL_CLASS_CONST_LONG(RecursiveDirectoryIterator,
"NEW_CURRENT_AND_KEY",
SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_MODE_MASK",
SPL_FILE_DIR_CURRENT_MODE_MASK);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator,
"CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator,
"CURRENT_AS_FILEINFO", SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_AS_SELF",
0);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_MODE_MASK",
SPL_FILE_DIR_KEY_MODE_MASK);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_PATHNAME",
0);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_FILENAME",
SPL_FILE_DIR_KEY_AS_FILENAME);
+ REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator,
"NEW_CURRENT_AND_KEY",
SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
+
+ spl_ce_FilesystemIterator->get_iterator =
spl_filesystem_tree_get_iterator;
+
+ REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator,
FilesystemIterator, spl_filesystem_object_new,
spl_RecursiveDirectoryIterator_functions);
+ REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
- spl_ce_RecursiveDirectoryIterator->get_iterator =
spl_filesystem_tree_get_iterator;
+ REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator,
spl_filesystem_object_new, spl_GlobIterator_functions);
+ REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable);
REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo,
spl_filesystem_object_new, spl_SplFileObject_functions);
REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator);
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.38&r2=1.39&diff_format=u
Index: php-src/ext/spl/spl_directory.h
diff -u php-src/ext/spl/spl_directory.h:1.38
php-src/ext/spl/spl_directory.h:1.39
--- php-src/ext/spl/spl_directory.h:1.38 Wed Jan 30 23:49:49 2008
+++ php-src/ext/spl/spl_directory.h Sat Feb 2 22:53:05 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_directory.h,v 1.38 2008/01/30 23:49:49 helly Exp $ */
+/* $Id: spl_directory.h,v 1.39 2008/02/02 22:53:05 helly Exp $ */
#ifndef SPL_DIRECTORY_H
#define SPL_DIRECTORY_H
@@ -26,7 +26,9 @@
extern PHPAPI zend_class_entry *spl_ce_SplFileInfo;
extern PHPAPI zend_class_entry *spl_ce_DirectoryIterator;
+extern PHPAPI zend_class_entry *spl_ce_FilesystemIterator;
extern PHPAPI zend_class_entry *spl_ce_RecursiveDirectoryIterator;
+extern PHPAPI zend_class_entry *spl_ce_GlobIterator;
extern PHPAPI zend_class_entry *spl_ce_SplFileObject;
extern PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
@@ -108,7 +110,7 @@
static inline spl_filesystem_object*
spl_filesystem_iterator_to_object(spl_filesystem_iterator *it)
{
- return (spl_filesystem_object*)((char*)it -
offsetof(spl_filesystem_object, it));
+ return (spl_filesystem_object*)((char*)it -
XtOffsetOf(spl_filesystem_object, it));
}
#define SPL_FILE_OBJECT_DROP_NEW_LINE 0x00000001 /* drop new lines */
@@ -123,10 +125,6 @@
#define SPL_FILE_DIR_KEY_AS_FILENAME 0x00000100 /* make
RecursiveDirectoryTree::key() return getFilename() */
#define SPL_FILE_DIR_KEY_MODE_MASK 0x00000F00 /* mask
RecursiveDirectoryTree::key() */
-#define SPL_FILE_DIR_GLOB_USE 0x00001000 /* use glob for open
dir*/
-#define SPL_FILE_DIR_GLOB_REFETCH_PATH 0x00002000 /* whether we need to
refetch the path in glob mode */
-#define SPL_FILE_DIR_GLOB_CHILD 0x00004000 /* do use glob on childs
*/
-
#endif /* SPL_DIRECTORY_H */
/*
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php