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

Reply via email to