Re: [PATCH] unix path separators in spl

From: Date: Wed, 23 Jul 2008 20:24:35 +0000
Subject: Re: [PATCH] unix path separators in spl
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-39245@lists.php.net to get a copy of this message
Hi Marcus,
how about having this as an option inside the SPL classes that gets turned on by Phar automatically? Inside SPL we could have it as a user set-only flag.
The attached patch does this, at the SPL end. Can I commit it (or something very close) before the 5_3 freeze please? NB The patch was created with DOS line endings and then converted to *nix, it won't apply cleanly in its current state. It's just for review. Thanks, - Steph

Index: ext/spl/spl_directory.c =================================================================== RCS file: /repository/php-src/ext/spl/spl_directory.c,v retrieving revision 1.45.2.27.2.23.2.26 diff -u -r1.45.2.27.2.23.2.26 spl_directory.c --- ext/spl/spl_directory.c 23 Jul 2008 06:12:29 -0000 1.45.2.27.2.23.2.26 +++ ext/spl/spl_directory.c 23 Jul 2008 20:19:29 -0000 @@ -175,6 +175,8 @@ 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; + if (!intern->file_name) { switch (intern->type) { case SPL_FS_INFO: @@ -184,7 +186,7 @@ case SPL_FS_DIR: intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s", spl_filesystem_object_get_path(intern, NULL TSRMLS_CC), - DEFAULT_SLASH, intern->u.dir.entry.d_name); + slash, intern->u.dir.entry.d_name); break; } } @@ -615,6 +617,9 @@ if (ctor_flags & SPL_FILE_DIR_SKIPDOTS) { flags |= SPL_FILE_DIR_SKIPDOTS; } + if (ctor_flags & SPL_FILE_DIR_UNIXPATHS) { + flags |= SPL_FILE_DIR_UNIXPATHS; + } if (parsed == FAILURE) { php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); return; @@ -1244,6 +1249,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; spl_filesystem_object_get_file_name(intern TSRMLS_CC); @@ -1257,7 +1263,7 @@ subdir = (spl_filesystem_object*)zend_object_store_get_object(return_value TSRMLS_CC); if (subdir) { if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) { - subdir->u.dir.sub_path_len = spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, DEFAULT_SLASH, intern->u.dir.entry.d_name); + subdir->u.dir.sub_path_len = spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name); } else { subdir->u.dir.sub_path_len = strlen(intern->u.dir.entry.d_name); subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len); @@ -1290,9 +1296,10 @@ 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; if (intern->u.dir.sub_path) { - len = spprintf(&sub_name, 0, "%s%c%s", intern->u.dir.sub_path, DEFAULT_SLASH, intern->u.dir.entry.d_name); + len = spprintf(&sub_name, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name); RETURN_STRINGL(sub_name, len, 0); } else { RETURN_STRING(intern->u.dir.entry.d_name, 1); @@ -2624,6 +2631,7 @@ 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); REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "SKIP_DOTS", SPL_FILE_DIR_SKIPDOTS); + REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "UNIX_PATHS", SPL_FILE_DIR_UNIXPATHS); spl_ce_FilesystemIterator->get_iterator = spl_filesystem_tree_get_iterator; Index: ext/spl/spl_directory.h =================================================================== RCS file: /repository/php-src/ext/spl/spl_directory.h,v retrieving revision 1.12.2.5.2.4.2.11 diff -u -r1.12.2.5.2.4.2.11 spl_directory.h --- ext/spl/spl_directory.h 19 Jul 2008 11:20:18 -0000 1.12.2.5.2.4.2.11 +++ ext/spl/spl_directory.h 23 Jul 2008 20:20:36 -0000 @@ -133,6 +133,7 @@ #define SPL_FILE_DIR_KEY(intern,mode) ((intern->flags&SPL_FILE_DIR_KEY_MODE_MASK)==mode) #define SPL_FILE_DIR_SKIPDOTS 0x00001000 /* Tells whether it should skip dots or not */ +#define SPL_FILE_DIR_UNIXPATHS 0x00002000 /* Whether to unixify path separators */ #endif /* SPL_DIRECTORY_H */
« previous php.internals (#39245) next »