#define IS_SLASH_AT(type, zs, pos) (type == IS_UNICODE ? IS_U_SLASH(zs.u[pos]) : IS_SLASH(zs.s[pos]))
+static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */
+{
+ return !strcmp(d_name, ".") || !strcmp(d_name, "..");
+}
+/* }}} */
+
/* {{{ 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;
+ int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
#if HELLY_0
if (php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) {
/* throw exception: should've been already happened */
intern->u.dir.entry.d_name[0] = '\0';
} else {
- spl_filesystem_dir_read(intern TSRMLS_CC);
+ do {
+ spl_filesystem_dir_read(intern TSRMLS_CC);
+ } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name));
}
}
/* }}} */
spl_filesystem_object *intern;
spl_filesystem_object *source;
int index;
+ int skip_dots;
old_object = zend_objects_get_address(zobject TSRMLS_CC);
source = (spl_filesystem_object*)old_object;
+ skip_dots = source->flags & SPL_FILE_DIR_SKIPDOTS;
+
new_obj_val = spl_filesystem_object_new_ex(old_object->ce, &intern TSRMLS_CC);
new_object = &intern->std;
+ intern->flags = source->flags;
+
switch (source->type) {
case SPL_FS_INFO:
intern->_path_type = source->_path_type;
spl_filesystem_dir_open(intern, source->_path_type, source->_path, source->_path_len TSRMLS_CC);
/* read until we hit the position in which we were before */
for(index = 0; index < source->u.dir.index; ++index) {
- spl_filesystem_dir_read(intern TSRMLS_CC);
+ do {
+ spl_filesystem_dir_read(intern TSRMLS_CC);
+ } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name));
}
intern->u.dir.index = index;
break;
intern->file_class = source->file_class;
intern->info_class = source->info_class;
- intern->flags = source->flags;
intern->oth = source->oth;
intern->oth_handler = source->oth_handler;
return NULL;
} /* }}} */
-static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */
-{
- return !strcmp(d_name, ".") || !strcmp(d_name, "..");
-}
-/* }}} */
-
static int spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */
{
return d_name[0] == '\0' || spl_filesystem_is_dot(d_name);
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &path, &len, &path_type);
}
+
+ if (ctor_flags & SPL_FILE_DIR_SKIPDOTS) {
+ flags |= SPL_FILE_DIR_SKIPDOTS;
+ }
+
if (parsed == FAILURE) {
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
return;
}
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ intern->flags = flags;
+
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)
}
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);
}
SPL_METHOD(DirectoryIterator, next)
{
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
intern->u.dir.index++;
- spl_filesystem_dir_read(intern TSRMLS_CC);
+ do {
+ spl_filesystem_dir_read(intern TSRMLS_CC);
+ } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name));
if (intern->file_name.v) {
efree(intern->file_name.v);
intern->file_name = NULL_ZSTR;
Cronstructs a new dir iterator from a path. */
SPL_METHOD(FilesystemIterator, __construct)
{
- spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIT_CTOR_FLAGS);
+ spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIT_CTOR_FLAGS | SPL_FILE_DIR_SKIPDOTS);
}
/* }}} */
}
/* }}} */
-/* {{{ proto void FilesystemIterator::next() U
- Move to next entry */
-SPL_METHOD(FilesystemIterator, next)
-{
- spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-
- intern->u.dir.index++;
- do {
- spl_filesystem_dir_read(intern TSRMLS_CC);
- } while (spl_filesystem_is_dot(intern->u.dir.entry.d_name));
- if (intern->file_name.v) {
- efree(intern->file_name.v);
- intern->file_name = NULL_ZSTR;
- }
-}
-/* }}} */
-
/* {{{ proto int FilesystemIterator::getFlags() U
Get handling flags */
SPL_METHOD(FilesystemIterator, getFlags)
{
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
- RETURN_LONG(intern->flags);
+ RETURN_LONG(intern->flags & (SPL_FILE_DIR_KEY_MODE_MASK | SPL_FILE_DIR_CURRENT_MODE_MASK));
} /* }}} */
/* {{{ proto void FilesystemIterator::setFlags(long $flags) U
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(DirectoryIterator, next, NULL, ZEND_ACC_PUBLIC)
SPL_ME(FilesystemIterator, key, NULL, ZEND_ACC_PUBLIC)
SPL_ME(FilesystemIterator, current, NULL, ZEND_ACC_PUBLIC)
SPL_ME(FilesystemIterator, getFlags, NULL, ZEND_ACC_PUBLIC)
{
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
- RETURN_LONG(intern->flags);
+ RETURN_LONG(intern->flags & SPL_FILE_OBJECT_MASK);
} /* }}} */
/* {{{ proto void SplFileObject::setMaxLineLen(int max_len) U