Re: [PATCH] unix path separators in spl
| From: | Steph Fox | 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,
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 */
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 */