pollita Mon Oct 2 02:24:29 2006 UTC Modified files: /php-src/main php_streams.h /php-src/ext/standard file.c Log: Try out simplified API for encoding paths/filenames http://cvs.php.net/viewvc.cgi/php-src/main/php_streams.h?r1=1.115&r2=1.116&diff_format=u Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.115 php-src/main/php_streams.h:1.116 --- php-src/main/php_streams.h:1.115 Sun Sep 24 20:33:14 2006 +++ php-src/main/php_streams.h Mon Oct 2 02:24:29 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams.h,v 1.115 2006/09/24 20:33:14 pollita Exp $ */ +/* $Id: php_streams.h,v 1.116 2006/10/02 02:24:29 pollita Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -388,6 +388,61 @@ END_EXTERN_C() +#define php_stream_path_param_encode(ppzval, ppath, ppath_len, options, context) \ + _php_stream_path_param_encode((ppzval), (ppath), (ppath_len), (options), (context) TSRMLS_CC) +static inline int _php_stream_path_param_encode(zval **ppzval, char **ppath, int *ppath_len, int options, php_stream_context *context TSRMLS_DC) +{ + if (Z_TYPE_PP(ppzval) == IS_UNICODE) { + zval *zpath; + char *path; + int path_len; + + /* Convert the path and put it into a fresh new zval */ + if (FAILURE == php_stream_path_encode(NULL, &path, &path_len, Z_USTRVAL_PP(ppzval), Z_USTRLEN_PP(ppzval), options, context)) { + return FAILURE; + } + MAKE_STD_ZVAL(zpath); + ZVAL_STRINGL(zpath, path, path_len, 0); + zpath->is_ref = 0; + zpath->refcount = 1; + + /* Replace the param stack with the new zval */ + zval_ptr_dtor(ppzval); + *ppzval = zpath; + } else if (Z_TYPE_PP(ppzval) != IS_STRING) { + if ((*ppzval)->is_ref || + (*ppzval)->refcount > 1) { + zval *zpath; + + /* Produce a new zval of type string */ + MAKE_STD_ZVAL(zpath); + *zpath = **ppzval; + zval_copy_ctor(zpath); + convert_to_string(zpath); + zpath->is_ref = 0; + zpath->refcount = 1; + + /* Replace the param stack with it */ + zval_ptr_dtor(ppzval); + *ppzval = zpath; + } else { + /* Convert the value on the param stack directly */ + convert_to_string(*ppzval); + } + } + + /* Populate convenience params if requested */ + if (ppath) { + *ppath = Z_STRVAL_PP(ppzval); + } + if (ppath_len) { + *ppath_len = Z_STRLEN_PP(ppzval); + } + + return SUCCESS; +} + + /* Flags for mkdir method in wrapper ops */ #define PHP_STREAM_MKDIR_RECURSIVE 1 /* define REPORT ERRORS 8 (below) */ http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.457&r2=1.458&diff_format=u Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.457 php-src/ext/standard/file.c:1.458 --- php-src/ext/standard/file.c:1.457 Sun Sep 24 21:40:44 2006 +++ php-src/ext/standard/file.c Mon Oct 2 02:24:29 2006 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.457 2006/09/24 21:40:44 pollita Exp $ */ +/* $Id: file.c,v 1.458 2006/10/02 02:24:29 pollita Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -1016,30 +1016,25 @@ Open a file or a URL and return a file pointer */ PHP_NAMED_FUNCTION(php_if_fopen) { + zval **ppfilename; char *filename, *mode; int filename_len, mode_len; - zend_uchar filename_type; zend_bool use_include_path = 0; zval *zcontext = NULL; php_stream *stream; php_stream_context *context = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ts|br", &filename, &filename_len, &filename_type, - &mode, &mode_len, &use_include_path, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs|br", &ppfilename, &mode, &mode_len, &use_include_path, &zcontext) == FAILURE) { RETURN_FALSE; } context = php_stream_context_from_zval(zcontext, 0); - if (filename_type == IS_UNICODE) { - if (php_stream_path_encode(NULL, &filename, &filename_len, (UChar*)filename, filename_len, REPORT_ERRORS, context) == FAILURE) { - RETURN_FALSE; - } + if (FAILURE == php_stream_path_param_encode(ppfilename, &filename, &filename_len, REPORT_ERRORS, context)) { + RETURN_FALSE; } + stream = php_stream_open_wrapper_ex(filename, mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context); - if (filename_type == IS_UNICODE) { - efree(filename); - } if (stream == NULL) { RETURN_FALSE; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php