helly Sat Jul 15 14:31:51 2006 UTC Modified files: /php-src/ext/standard file.c file.h /php-src/ext/spl spl_directory.c spl_directory.h Log: - Implement todo: SplFileObject: ability to set the CSV separator per object http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.447&r2=1.448&diff_format=u Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.447 php-src/ext/standard/file.c:1.448 --- php-src/ext/standard/file.c:1.447 Fri Jul 14 20:50:45 2006 +++ php-src/ext/standard/file.c Sat Jul 15 14:31:51 2006 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.447 2006/07/14 20:50:45 pollita Exp $ */ +/* $Id: file.c,v 1.448 2006/07/15 14:31:51 helly Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -2054,17 +2054,14 @@ /* UTODO: Accept unicode contents */ PHP_FUNCTION(fgetcsv) { - char *temp, *tptr, *bptr, *line_end, *limit; char delimiter = ','; /* allow this to be set as parameter */ char enclosure = '"'; /* allow this to be set as parameter */ - const char escape_char = '\\'; /* first section exactly as php_fgetss */ long len = 0; - size_t buf_len, temp_len, line_end_len; + size_t buf_len; char *buf; php_stream *stream; - int inc_len; { zval *fd, **len_zv = NULL; @@ -2126,6 +2123,22 @@ RETURN_FALSE; } } + + php_fgetcsv(stream, delimiter, enclosure, buf_len, buf, return_value TSRMLS_CC); +} +/* }}} */ + +PHPAPI void php_fgetcsv(php_stream *stream, /* {{{ */ + char delimiter, char enclosure, + size_t buf_len, char *buf, + zval *return_value TSRMLS_DC) +{ + char *temp, *tptr, *bptr, *line_end, *limit; + const char escape_char = '\\'; + + size_t temp_len, line_end_len; + int inc_len; + /* initialize internal state */ php_mblen(NULL, 0); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.h?r1=1.99&r2=1.100&diff_format=u Index: php-src/ext/standard/file.h diff -u php-src/ext/standard/file.h:1.99 php-src/ext/standard/file.h:1.100 --- php-src/ext/standard/file.h:1.99 Fri May 19 10:44:34 2006 +++ php-src/ext/standard/file.h Sat Jul 15 14:31:51 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.h,v 1.99 2006/05/19 10:44:34 hholzgra Exp $ */ +/* $Id: file.h,v 1.100 2006/07/15 14:31:51 helly Exp $ */ /* Synced with php 3.0 revision 1.30 1999-06-16 [ssb] */ @@ -75,6 +75,7 @@ PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC); PHPAPI int php_mkdir_ex(char *dir, long mode, int options TSRMLS_DC); PHPAPI int php_mkdir(char *dir, long mode TSRMLS_DC); +PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, size_t buf_len, char *buf, zval *return_value TSRMLS_DC); #define META_DEF_BUFSIZE 8192 http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.93&r2=1.94&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.93 php-src/ext/spl/spl_directory.c:1.94 --- php-src/ext/spl/spl_directory.c:1.93 Sat Jul 15 13:01:44 2006 +++ php-src/ext/spl/spl_directory.c Sat Jul 15 14:31:51 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.93 2006/07/15 13:01:44 helly Exp $ */ +/* $Id: spl_directory.c,v 1.94 2006/07/15 14:31:51 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -207,7 +207,7 @@ if (!intern->file_name_len || !intern->u.file.stream) { if (!EG(exception)) { - zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot open file '%s'", intern->file_name); + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot open file '%s'", intern->file_name_len ? intern->file_name : ""); } intern->file_name = NULL; /* until here it is not a copy */ intern->u.file.open_mode = NULL; @@ -232,6 +232,9 @@ /* avoid reference counting in debug mode, thus do it manually */ ZVAL_RESOURCE(&intern->u.file.zresource, php_stream_get_resource_id(intern->u.file.stream)); intern->u.file.zresource.refcount = 1; + + intern->u.file.delimiter = ','; + intern->u.file.enclosure = '"'; zend_hash_find(&intern->std.ce->function_table, "getcurrentline", sizeof("getcurrentline"), (void **) &intern->u.file.func_getCurr); @@ -1435,17 +1438,21 @@ spl_filesystem_file_call(intern, func_ptr, pass_num_args, return_value, arg2 TSRMLS_CC); \ } -static void spl_filesystem_file_read_csv(zval * this_ptr, spl_filesystem_object *intern, int pass_num_args, zval *return_value TSRMLS_DC) /* {{{ */ +static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, zval *return_value TSRMLS_DC) /* {{{ */ { - zval *arg2 = NULL; - MAKE_STD_ZVAL(arg2); - ZVAL_LONG(arg2, intern->u.file.max_line_len); - - spl_filesystem_file_free_line(intern TSRMLS_CC); - - FileFunctionCall(fgetcsv, pass_num_args, arg2); + int ret = SUCCESS; + + 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)); + + if (ret == SUCCESS) { + size_t buf_len = intern->u.file.current_line_len; + char *buf = estrndup(intern->u.file.current_line, buf_len); - zval_ptr_dtor(&arg2); + php_fgetcsv(intern->u.file.stream, delimiter, enclosure, buf_len, buf, return_value TSRMLS_CC); + } + return ret; } /* }}} */ @@ -1463,7 +1470,7 @@ } if (intern->flags & SPL_FILE_OBJECT_READ_CSV) { MAKE_STD_ZVAL(retval); - spl_filesystem_file_read_csv(this_ptr, intern, 0, retval TSRMLS_CC); + return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, retval TSRMLS_CC); } else { zend_call_method_with_0_params(&this_ptr, Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval); } @@ -1790,9 +1797,32 @@ SPL_METHOD(SplFileObject, fgetcsv) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure; + char *delim, *enclo; + int d_len, e_len; - spl_filesystem_file_read_csv(getThis(), intern, ZEND_NUM_ARGS(), return_value TSRMLS_CC); - intern->u.file.current_line_num++; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &delim, &d_len, &enclo, &e_len) == SUCCESS) { + switch(ZEND_NUM_ARGS()) + { + case 2: + if (e_len != 1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "enclosure must be a character"); + RETURN_FALSE; + } + enclosure = enclo[0]; + /* no break */ + case 1: + if (d_len != 1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "delimiter must be a character"); + RETURN_FALSE; + } + delimiter = delim[0]; + /* no break */ + case 0: + break; + } + spl_filesystem_file_read_csv(intern, delimiter, enclosure, return_value TSRMLS_CC); + } } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.24&r2=1.25&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.24 php-src/ext/spl/spl_directory.h:1.25 --- php-src/ext/spl/spl_directory.h:1.24 Thu Mar 9 23:07:48 2006 +++ php-src/ext/spl/spl_directory.h Sat Jul 15 14:31:51 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.24 2006/03/09 23:07:48 helly Exp $ */ +/* $Id: spl_directory.h,v 1.25 2006/07/15 14:31:51 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -82,6 +82,8 @@ long current_line_num; zval zresource; zend_function *func_getCurr; + char delimiter; + char enclosure; } file; } u; };
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php