helly Tue Nov 18 17:14:20 2003 EDT
Modified files:
/spl spl_directory.c spl_functions.h spl_iterators.c
Log:
- Rename DirectoryTreeIterator to RecursiveDirectoryiterator (what it
effectively is).
- Add DirectoryIterator::__toString ->getFilename
- Add RecursiveDirecetoryIterator::__toString ->getPathname
- Add RecursiveIteratorIterator::getSubIterator.
Index: spl/spl_directory.c
diff -u spl/spl_directory.c:1.12 spl/spl_directory.c:1.13
--- spl/spl_directory.c:1.12 Sun Nov 9 18:00:50 2003
+++ spl/spl_directory.c Tue Nov 18 17:14:19 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_directory.c,v 1.12 2003/11/09 23:00:50 helly Exp $ */
+/* $Id: spl_directory.c,v 1.13 2003/11/18 22:14:19 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -53,11 +53,12 @@
SPL_METHOD(DirectoryIterator, isDot);
SPL_METHOD(DirectoryIterator, isDir);
-SPL_METHOD(DirectoryTreeIterator, rewind);
-SPL_METHOD(DirectoryTreeIterator, next);
-SPL_METHOD(DirectoryTreeIterator, key);
-SPL_METHOD(DirectoryTreeIterator, hasChildren);
-SPL_METHOD(DirectoryTreeIterator, getChildren);
+SPL_METHOD(RecursiveDirectoryIterator, rewind);
+SPL_METHOD(RecursiveDirectoryIterator, next);
+SPL_METHOD(RecursiveDirectoryIterator, key);
+SPL_METHOD(RecursiveDirectoryIterator, hasChildren);
+SPL_METHOD(RecursiveDirectoryIterator, getChildren);
+SPL_METHOD(RecursiveDirectoryIterator, __toString);
/* declare method parameters */
@@ -82,15 +83,17 @@
SPL_ME(DirectoryIterator, getPathname, NULL, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, isDot, NULL, ZEND_ACC_PUBLIC)
SPL_ME(DirectoryIterator, isDir, NULL, ZEND_ACC_PUBLIC)
+ SPL_MA(DirectoryIterator, __toString, DirectoryIterator, getFilename, NULL,
ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
static zend_function_entry spl_ce_dir_tree_class_functions[] = {
- SPL_ME(DirectoryTreeIterator, rewind, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(DirectoryTreeIterator, next, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(DirectoryTreeIterator, key, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(DirectoryTreeIterator, hasChildren, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(DirectoryTreeIterator, getChildren, NULL, 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, hasChildren, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveDirectoryIterator, getChildren, NULL, ZEND_ACC_PUBLIC)
+ SPL_MA(RecursiveDirectoryIterator, __toString, DirectoryIterator, getPathname,
NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
@@ -101,7 +104,7 @@
/* decalre the class entry */
zend_class_entry *spl_ce_DirectoryIterator;
-zend_class_entry *spl_ce_DirectoryTreeIterator;
+zend_class_entry *spl_ce_RecursiveDirectoryIterator;
/* the overloaded class structure */
@@ -358,15 +361,19 @@
zval *object = getThis();
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
- char *filename;
- int filename_len = spprintf(&filename, 0, "%s/%s", intern->path,
intern->entry.d_name);
- RETURN_STRINGL(filename, filename_len, 0);
+ if (intern->entry.d_name[0]) {
+ char *filename;
+ int filename_len = spprintf(&filename, 0, "%s/%s", intern->path,
intern->entry.d_name);
+ RETURN_STRINGL(filename, filename_len, 0);
+ } else {
+ RETURN_BOOL(0);
+ }
}
/* }}} */
-/* {{{ proto string DirectoryTreeIterator::key()
+/* {{{ proto string RecursiveDirectoryIterator::key()
Return path and filename of current dir entry */
-SPL_METHOD(DirectoryTreeIterator, key)
+SPL_METHOD(RecursiveDirectoryIterator, key)
{
zval *object = getThis();
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -404,9 +411,9 @@
}
/* }}} */
-/* {{{ proto void DirectoryTreeIterator::rewind()
+/* {{{ proto void RecursiveDirectoryIterator::rewind()
Rewind dir back to the start */
-SPL_METHOD(DirectoryTreeIterator, rewind)
+SPL_METHOD(RecursiveDirectoryIterator, rewind)
{
zval *object = getThis();
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -423,9 +430,9 @@
}
/* }}} */
-/* {{{ proto void DirectoryTreeIterator::next()
+/* {{{ proto void RecursiveDirectoryIterator::next()
Move to next entry */
-SPL_METHOD(DirectoryTreeIterator, next)
+SPL_METHOD(RecursiveDirectoryIterator, next)
{
zval *object = getThis();
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -439,9 +446,9 @@
}
/* }}} */
-/* {{{ proto bool DirectoryTreeIterator::hasChildren()
+/* {{{ proto bool RecursiveDirectoryIterator::hasChildren()
Returns whether current entry is a directory and not '.' or '..' */
-SPL_METHOD(DirectoryTreeIterator, hasChildren)
+SPL_METHOD(RecursiveDirectoryIterator, hasChildren)
{
zval *object = getThis();
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -458,9 +465,9 @@
}
/* }}} */
-/* {{{ proto DirectoryTreeIterator DirectoryIterator::getChildren()
+/* {{{ proto RecursiveDirectoryIterator DirectoryIterator::getChildren()
Returns an iterator fo rthe current entry if it is a directory */
-SPL_METHOD(DirectoryTreeIterator, getChildren)
+SPL_METHOD(RecursiveDirectoryIterator, getChildren)
{
zval *object = getThis(), zpath;
spl_ce_dir_object *intern =
(spl_ce_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
@@ -470,7 +477,7 @@
ZVAL_STRINGL(&zpath, path, path_len, 0);
- spl_instantiate_arg_ex1(spl_ce_DirectoryTreeIterator, &return_value, 0, &zpath
TSRMLS_CC);
+ spl_instantiate_arg_ex1(spl_ce_RecursiveDirectoryIterator, &return_value, 0,
&zpath TSRMLS_CC);
zval_dtor(&zpath);
}
/* }}} */
@@ -624,17 +631,11 @@
spl_ce_dir_object *object = iterator->object;
object->index++;
- zval_dtor(iterator->current);
-skip_dots:
- if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
- object->entry.d_name[0] = '\0';
- ZVAL_NULL(iterator->current);
- } else {
- if (!strcmp(object->entry.d_name, ".") ||
!strcmp(object->entry.d_name, "..")) {
- goto skip_dots;
+ do {
+ if (!object->dirp || !php_stream_readdir(object->dirp,
&object->entry)) {
+ object->entry.d_name[0] = '\0';
}
- ZVAL_STRING(iterator->current, object->entry.d_name, 1);
- }
+ } while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name,
".."));
}
/* }}} */
@@ -648,21 +649,14 @@
if (object->dirp) {
php_stream_rewinddir(object->dirp);
}
- zval_dtor(iterator->current);
-skip_dots:
- if (!object->dirp || !php_stream_readdir(object->dirp, &object->entry)) {
- object->entry.d_name[0] = '\0';
- ZVAL_NULL(iterator->current);
- } else {
- if (!strcmp(object->entry.d_name, ".") ||
!strcmp(object->entry.d_name, "..")) {
- goto skip_dots;
+ do {
+ if (!object->dirp || !php_stream_readdir(object->dirp,
&object->entry)) {
+ object->entry.d_name[0] = '\0';
}
- ZVAL_STRING(iterator->current, object->entry.d_name, 1);
- }
+ } while (!strcmp(object->entry.d_name, ".") || !strcmp(object->entry.d_name,
".."));
}
/* }}} */
-
/* iterator handler table */
zend_object_iterator_funcs spl_ce_dir_tree_it_funcs = {
spl_ce_dir_it_dtor,
@@ -682,7 +676,8 @@
object->refcount++;
iterator->intern.data = (void*)object;
iterator->intern.funcs = &spl_ce_dir_tree_it_funcs;
- MAKE_STD_ZVAL(iterator->current);
+ iterator->current = object;
+ object->refcount++;
iterator->object = dir_object;
return (zend_object_iterator*)iterator;
@@ -701,10 +696,10 @@
spl_ce_DirectoryIterator->get_iterator = spl_ce_dir_get_iterator;
- REGISTER_SPL_SUB_CLASS_EX(DirectoryTreeIterator, DirectoryIterator,
spl_ce_dir_object_new, spl_ce_dir_tree_class_functions);
- REGISTER_SPL_IMPLEMENTS(DirectoryTreeIterator, RecursiveIterator);
+ REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, DirectoryIterator,
spl_ce_dir_object_new, spl_ce_dir_tree_class_functions);
+ REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
- spl_ce_DirectoryTreeIterator->get_iterator = spl_ce_dir_tree_get_iterator;
+ spl_ce_RecursiveDirectoryIterator->get_iterator = spl_ce_dir_tree_get_iterator;
return SUCCESS;
}
Index: spl/spl_functions.h
diff -u spl/spl_functions.h:1.10 spl/spl_functions.h:1.11
--- spl/spl_functions.h:1.10 Sun Nov 9 09:05:35 2003
+++ spl/spl_functions.h Tue Nov 18 17:14:19 2003
@@ -71,6 +71,8 @@
#define SPL_METHOD(class_name, function_name) \
PHP_METHOD(spl_ ## class_name, function_name)
+#define SPL_MA(class_name, function_name, alias_class, alias_function, arg_info,
flags) \
+ ZEND_MALIAS(function_name, spl_ ## alias_class, alias_function, arg_info,
flags)
#endif /* PHP_FUNCTIONS_H */
/*
Index: spl/spl_iterators.c
diff -u spl/spl_iterators.c:1.3 spl/spl_iterators.c:1.4
--- spl/spl_iterators.c:1.3 Sun Nov 16 19:57:01 2003
+++ spl/spl_iterators.c Tue Nov 18 17:14:19 2003
@@ -47,6 +47,7 @@
SPL_METHOD(RecursiveIteratorIterator, current);
SPL_METHOD(RecursiveIteratorIterator, next);
SPL_METHOD(RecursiveIteratorIterator, getLevel);
+SPL_METHOD(RecursiveIteratorIterator, getSubIterator);
static
ZEND_BEGIN_ARG_INFO(arginfo_recursive_it___construct, 0)
@@ -54,6 +55,12 @@
ZEND_ARG_INFO(0, mode)
ZEND_END_ARG_INFO();
+static
+ZEND_BEGIN_ARG_INFO(arginfo_recursive_it_getSubIterator, 0)
+ ZEND_ARG_INFO(0, iterator)
+ ZEND_ARG_INFO(0, mode)
+ZEND_END_ARG_INFO();
+
static zend_function_entry spl_funcs_RecursiveIteratorIterator[] = {
SPL_ME(RecursiveIteratorIterator, __construct,
arginfo_recursive_it___construct, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, rewind, NULL, ZEND_ACC_PUBLIC)
@@ -62,6 +69,7 @@
SPL_ME(RecursiveIteratorIterator, current, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, next, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, getLevel, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator,
getSubIterator,arginfo_recursive_it_getSubIterator, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
@@ -377,6 +385,22 @@
RETURN_LONG(object->level);
}
+SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
+{
+ spl_recursive_it_object *object =
(spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ int level;
+ zval *zobject;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &level) == FAILURE) {
+ return;
+ }
+ if (level < 0 || level > object->level) {
+ RETURN_NULL();
+ }
+ zobject = object->iterators[level].zobject;
+ REPLACE_ZVAL_VALUE(&return_value, zobject, 1);
+}
+
/* {{{ spl_dtor_RecursiveIteratorIterator */
static void spl_dtor_RecursiveIteratorIterator(void *_object, zend_object_handle
handle TSRMLS_DC)
{
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php