helly Tue Mar 10 23:28:17 2009 UTC
Modified files: (Branch: PHP_5_3)
/php-src/ext/spl spl_directory.c
Log:
- MFH Safer flag handling as requested by Greg
http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.45.2.27.2.23.2.40&r2=1.45.2.27.2.23.2.41&diff_format=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.40
php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.41
--- php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.40 Wed Dec 31 11:15:43 2008
+++ php-src/ext/spl/spl_directory.c Tue Mar 10 23:28:17 2009
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.40 2008/12/31 11:15:43 sebastian
Exp $ */
+/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.41 2009/03/10 23:28:17 helly Exp $
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -44,6 +44,8 @@
#include "ext/standard/basic_functions.h"
#include "ext/standard/php_filestat.h"
+#define SPL_HAS_FLAG(flags, test_flag) ((flags & test_flag) ? 1 : 0)
+
/* declare the class handlers */
static zend_object_handlers spl_filesystem_object_handlers;
@@ -175,7 +177,7 @@
static inline void spl_filesystem_object_get_file_name(spl_filesystem_object
*intern TSRMLS_DC) /* {{{ */
{
- char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' :
DEFAULT_SLASH;
+ char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/'
: DEFAULT_SLASH;
if (!intern->file_name) {
switch (intern->type) {
@@ -215,7 +217,7 @@
/* open a directory resource */
static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path
TSRMLS_DC)
{
- int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
+ int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
intern->type = SPL_FS_DIR;
intern->_path_len = strlen(path);
@@ -314,7 +316,7 @@
case SPL_FS_DIR:
spl_filesystem_dir_open(intern, source->_path TSRMLS_CC);
/* read until we hit the position in which we were before */
- skip_dots = source->flags & SPL_FILE_DIR_SKIPDOTS;
+ skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS);
for(index = 0; index < source->u.dir.index; ++index) {
do {
spl_filesystem_dir_read(intern TSRMLS_CC);
@@ -600,7 +602,7 @@
#define DIT_CTOR_FLAGS 0x00000001
#define DIT_CTOR_GLOB 0x00000002
-void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int
ctor_flags) /* {{{ */
+void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, long
ctor_flags) /* {{{ */
{
spl_filesystem_object *intern;
char *path;
@@ -610,17 +612,17 @@
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException,
&error_handling TSRMLS_CC);
- if (ctor_flags & DIT_CTOR_FLAGS) {
+ if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_FLAGS)) {
flags =
SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO;
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"s|l", &path, &len, &flags);
} else {
flags =
SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
&path, &len);
}
- if (ctor_flags & SPL_FILE_DIR_SKIPDOTS) {
+ if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_SKIPDOTS)) {
flags |= SPL_FILE_DIR_SKIPDOTS;
}
- if (ctor_flags & SPL_FILE_DIR_UNIXPATHS) {
+ if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_UNIXPATHS)) {
flags |= SPL_FILE_DIR_UNIXPATHS;
}
if (parsed == FAILURE) {
@@ -635,7 +637,7 @@
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis()
TSRMLS_CC);
intern->flags = flags;
- if ((ctor_flags & DIT_CTOR_GLOB) && strstr(path, "glob://") != path) {
+ if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && strstr(path, "glob://")
!= path) {
spprintf(&path, 0, "glob://%s", path);
spl_filesystem_dir_open(intern, path TSRMLS_CC);
efree(path);
@@ -698,7 +700,7 @@
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;
+ int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
intern->u.dir.index++;
do {
@@ -1262,7 +1264,7 @@
zval zpath, zflags;
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
spl_filesystem_object *subdir;
- char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' :
DEFAULT_SLASH;
+ char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/'
: DEFAULT_SLASH;
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
@@ -1309,7 +1311,7 @@
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
char *sub_name;
int len;
- char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' :
DEFAULT_SLASH;
+ char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/'
: DEFAULT_SLASH;
if (intern->u.dir.sub_path) {
len = spprintf(&sub_name, 0, "%s%c%s", intern->u.dir.sub_path,
slash, intern->u.dir.entry.d_name);
@@ -1764,7 +1766,7 @@
intern->u.file.current_line = estrdup("");
intern->u.file.current_line_len = 0;
} else {
- if (intern->flags & SPL_FILE_OBJECT_DROP_NEW_LINE) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE))
{
line_len = strcspn(buf, "\r\n");
buf[line_len] = '\0';
}
@@ -1845,7 +1847,7 @@
do {
ret = spl_filesystem_file_read(intern, 1 TSRMLS_CC);
- } while (ret == SUCCESS && !intern->u.file.current_line_len &&
(intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY));
+ } while (ret == SUCCESS && !intern->u.file.current_line_len &&
SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY));
if (ret == SUCCESS) {
size_t buf_len = intern->u.file.current_line_len;
@@ -1874,14 +1876,14 @@
zval *retval = NULL;
/* 1) use fgetcsv? 2) overloaded call the function, 3) do it directly */
- if (intern->flags & SPL_FILE_OBJECT_READ_CSV ||
intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) ||
intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
if (php_stream_eof(intern->u.file.stream)) {
if (!silent) {
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot read from
file %s", intern->file_name);
}
return FAILURE;
}
- if (intern->flags & SPL_FILE_OBJECT_READ_CSV) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
return spl_filesystem_file_read_csv(intern,
intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL
TSRMLS_CC);
} else {
zend_call_method_with_0_params(&this_ptr,
Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
@@ -1917,7 +1919,7 @@
case IS_STRING:
return Z_STRLEN_P(intern->u.file.current_zval) == 0;
case IS_ARRAY:
- if ((intern->flags & SPL_FILE_OBJECT_READ_CSV)
+ if (SPL_HAS_FLAG(intern->flags,
SPL_FILE_OBJECT_READ_CSV)
&&
zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 1) {
zval ** first =
Z_ARRVAL_P(intern->u.file.current_zval)->pListHead->pData;
@@ -1939,7 +1941,7 @@
{
int ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent
TSRMLS_CC);
- while ((intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS
&& spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
+ while (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY) && ret
== SUCCESS && spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
spl_filesystem_file_free_line(intern TSRMLS_CC);
ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent
TSRMLS_CC);
}
@@ -1956,7 +1958,7 @@
spl_filesystem_file_free_line(intern TSRMLS_CC);
intern->u.file.current_line_num = 0;
}
- if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
spl_filesystem_file_read_line(this_ptr, intern, 1 TSRMLS_CC);
}
} /* }}} */
@@ -2076,7 +2078,7 @@
{
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
- if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
RETURN_BOOL(intern->u.file.current_line ||
intern->u.file.current_zval);
} else {
RETVAL_BOOL(!php_stream_eof(intern->u.file.stream));
@@ -2104,7 +2106,7 @@
if (!intern->u.file.current_line && !intern->u.file.current_zval) {
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
}
- if (intern->u.file.current_line && (!(intern->flags &
SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
+ if (intern->u.file.current_line && (!SPL_HAS_FLAG(intern->flags,
SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
RETURN_STRINGL(intern->u.file.current_line,
intern->u.file.current_line_len, 1);
} else if (intern->u.file.current_zval) {
RETURN_ZVAL(intern->u.file.current_zval, 1, 0);
@@ -2132,7 +2134,7 @@
spl_filesystem_object *intern =
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
spl_filesystem_file_free_line(intern TSRMLS_CC);
- if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
+ if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
}
intern->u.file.current_line_num++;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php