Hello David,

  can you MFH this to 5.3.

marcus

Wednesday, October 3, 2007, 12:31:04 PM, you wrote:

> http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.136&r2=1.137&diff_format=u
> Index: php-src/ext/spl/spl_directory.c
> diff -u php-src/ext/spl/spl_directory.c:1.136
> php-src/ext/spl/spl_directory.c:1.137
> --- php-src/ext/spl/spl_directory.c:1.136       Thu Sep 27 18:28:42 2007
> +++ php-src/ext/spl/spl_directory.c     Wed Oct  3 10:31:03 2007
> @@ -16,7 +16,7 @@
>     +----------------------------------------------------------------------+
>   */
>  
> -/* $Id: spl_directory.c,v 1.136 2007/09/27 18:28:42 dmitry Exp $ */
> +/* $Id: spl_directory.c,v 1.137 2007/10/03 10:31:03 dsp Exp $ */
>  
>  #ifdef HAVE_CONFIG_H
>  # include "config.h"
> @@ -1771,7 +1771,7 @@
>         spl_filesystem_file_call(intern, func_ptr, pass_num_args, 
> return_value, arg2
> TSRMLS_CC); \
>  }
>  
> -static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char 
> delimiter, char
> enclosure, zval *return_value TSRMLS_DC) /* {{{ */
> +static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char 
> delimiter, char
> enclosure, char escape, zval *return_value TSRMLS_DC) /* {{{ */
>  {
>         int ret = SUCCESS;
>         
> @@ -1788,7 +1788,7 @@
>                 }
>                 ALLOC_INIT_ZVAL(intern->u.file.current_zval);
>  
> -               php_fgetcsv(intern->u.file.stream, delimiter, enclosure, 
> buf_len, buf,
> intern->u.file.current_zval TSRMLS_CC);
> +               php_fgetcsv(intern->u.file.stream, delimiter, enclosure, 
> escape, buf_len, buf,
> intern->u.file.current_zval TSRMLS_CC);
>                 if (return_value) {
>                         if (Z_TYPE_P(return_value) != IS_NULL) {
>                                 zval_dtor(return_value);
> @@ -1814,7 +1814,7 @@
>                         return FAILURE;
>                 }
>                 if (intern->flags & SPL_FILE_OBJECT_READ_CSV) {
> -                       return spl_filesystem_file_read_csv(intern, 
> intern->u.file.delimiter,
> intern->u.file.enclosure, NULL TSRMLS_CC);
> +                       return spl_filesystem_file_read_csv(intern, 
> intern->u.file.delimiter,
> intern->u.file.enclosure, intern->u.file.escape, NULL TSRMLS_CC);
>                 } else {
>                         zend_call_method_with_0_params(&this_ptr, 
> Z_OBJCE_P(getThis()),
> &intern->u.file.func_getCurr, "getCurrentLine", &retval);
>                 }
> @@ -2149,13 +2149,20 @@
>  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;
> +       char delimiter = intern->u.file.delimiter, enclosure = 
> intern->u.file.enclosure, escape
> = intern->u.file.escape;
> +       char *delim, *enclo, *esc;
> +       int d_len, e_len, esc_len;
>         
> -       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &delim, 
> &d_len, &enclo,
> &e_len) == SUCCESS) {
> +       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &delim, 
> &d_len, &enclo,
> &e_len, &esc, &esc_len) == SUCCESS) {
>                 switch(ZEND_NUM_ARGS())
>                 {
> +                   case 3:
> +                               if (esc_len != 1) {
> +                                       php_error_docref(NULL TSRMLS_CC, 
> E_WARNING, "escape
> must be a character");
> +                                       RETURN_FALSE;
> +                               }
> +                               escape = esc[0];
> +
>                         case 2:
>                                 if (e_len != 1) {
>                                         php_error_docref(NULL TSRMLS_CC, 
> E_WARNING, "enclosure
> must be a character");
> @@ -2173,23 +2180,30 @@
>                         case 0:
>                                 break;
>                 }
> -               spl_filesystem_file_read_csv(intern, delimiter, enclosure, 
> return_value
> TSRMLS_CC);
> +               spl_filesystem_file_read_csv(intern, delimiter, enclosure, 
> escape, return_value
> TSRMLS_CC);
>         }
>  }
>  /* }}} */
>  
> -/* {{{ proto void SplFileObject::setCsvControl([string delimiter = ',' [, 
> string enclosure =
> '"']])
> +/* {{{ proto void SplFileObject::setCsvControl([string delimiter = ',' [, 
> string enclosure =
> '"' [, string escape = '\\']]])
>     Set the delimiter and enclosure character used in fgetcsv */
>  SPL_METHOD(SplFileObject, setCsvControl)
>  {
>         spl_filesystem_object *intern =
> (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
> -       char delimiter = ',', enclosure = '"';
> -       char *delim, *enclo;
> -       int d_len, e_len;
> +       char delimiter = ',', enclosure = '"', escape='\\';
> +       char *delim, *enclo, *esc;
> +       int d_len, e_len, esc_len;
>         
> -       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &delim, 
> &d_len, &enclo,
> &e_len) == SUCCESS) {
> +       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &delim, 
> &d_len, &enclo,
> &e_len, &esc, &esc_len) == SUCCESS) {
>                 switch(ZEND_NUM_ARGS())
>                 {
> +                    case 3:
> +                               if (esc_len != 1) {
> +                                       php_error_docref(NULL TSRMLS_CC, 
> E_WARNING, "escape
> must be a character");
> +                                       RETURN_FALSE;
> +                               }
> +                               escape = esc[0];
> +                /* no break */
>                         case 2:
>                                 if (e_len != 1) {
>                                         php_error_docref(NULL TSRMLS_CC, 
> E_WARNING, "enclosure
> must be a character");
> @@ -2209,6 +2223,7 @@
>                 }
>                 intern->u.file.delimiter = delimiter;
>                 intern->u.file.enclosure = enclosure;
> +               intern->u.file.escape    = escape;
>         }
>  }
>  /* }}} */
> http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.34&r2=1.35&diff_format=u
> Index: php-src/ext/spl/spl_directory.h
> diff -u php-src/ext/spl/spl_directory.h:1.34 
> php-src/ext/spl/spl_directory.h:1.35
> --- php-src/ext/spl/spl_directory.h:1.34        Sun Mar  4 00:42:30 2007
> +++ php-src/ext/spl/spl_directory.h     Wed Oct  3 10:31:03 2007
> @@ -16,7 +16,7 @@
>     +----------------------------------------------------------------------+
>   */
>  
> -/* $Id: spl_directory.h,v 1.34 2007/03/04 00:42:30 helly Exp $ */
> +/* $Id: spl_directory.h,v 1.35 2007/10/03 10:31:03 dsp Exp $ */
>  
>  #ifndef SPL_DIRECTORY_H
>  #define SPL_DIRECTORY_H
> @@ -93,6 +93,7 @@
>                         zend_function      *func_getCurr;
>                         char               delimiter;
>                         char               enclosure;
> +                       char               escape;
>                 } file;
>         } u;
>         spl_filesystem_iterator    it;
> http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.500&r2=1.501&diff_format=u
> Index: php-src/ext/standard/file.c
> diff -u php-src/ext/standard/file.c:1.500 php-src/ext/standard/file.c:1.501
> --- php-src/ext/standard/file.c:1.500   Wed Sep  5 12:55:36 2007
> +++ php-src/ext/standard/file.c Wed Oct  3 10:31:04 2007
> @@ -21,7 +21,7 @@
>     +----------------------------------------------------------------------+
>   */
>  
> -/* $Id: file.c,v 1.500 2007/09/05 12:55:36 iliaa Exp $ */
> +/* $Id: file.c,v 1.501 2007/10/03 10:31:04 dsp Exp $ */
>  
>  /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
>  
> @@ -2260,12 +2260,12 @@
>  /* }}} */
>  
>  PHPAPI void php_fgetcsv(php_stream *stream, /* {{{ */
> -               char delimiter, char enclosure, 
> -               size_t buf_len, char *buf,
> -               zval *return_value TSRMLS_DC)
> +                                               char delimiter, char 
> enclosure, char escape,
> +                                               size_t buf_len, char *buf,
> +                                               zval *return_value TSRMLS_DC)
>  {
> -       char *delim = &delimiter, *enc = &enclosure, *buffer = buf;
> -       int delim_len = 1, enc_len = 1, buffer_len = buf_len;
> +       char *delim = &delimiter, *enc = &enclosure, *buffer = buf, *esc;
> +       int delim_len = 1, enc_len = 1, esc_len = 1, buffer_len = buf_len;
>         zend_uchar type = IS_STRING;
>  
>         if (stream) {
> @@ -2285,22 +2285,30 @@
>                         INIT_PZVAL(return_value);
>                         return;
>                 }
> +               if (FAILURE ==
> zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), 
> (UChar**)&esc, &esc_len,
> &escape, 1 TSRMLS_CC)) {
> +                       efree(delim);
> +                       efree(enc);
> +                       INIT_PZVAL(return_value);
> +                       return;
> +               }
>                 if (FAILURE ==
> zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), 
> (UChar**)&buffer,
> &buffer_len, buf, buf_len TSRMLS_CC)) {
>                         efree(delim);
>                         efree(enc);
> +                       efree(esc);
>                         INIT_PZVAL(return_value);
>                         return;
>                 }
>  
> -               php_u_fgetcsv(stream, (UChar*)delim, delim_len, (UChar*)enc, 
> enc_len, &esc, 1,
> +               php_u_fgetcsv(stream, (UChar*)delim, delim_len, (UChar*)enc, 
> enc_len,
> (UChar*)esc, esc_len,
>                                 (UChar*)buffer, buffer_len, return_value 
> TSRMLS_CC);
>  
>                 /* Types converted, free storage */
>                 efree(delim);
>                 efree(enc);
> +               efree(esc);
>         } else {
>                 /* Binary stream with binary delimiter/enclosures/prefetch */
> -               php_fgetcsv_ex(stream, delim, delim_len, enc, enc_len, "\\", 
> 1, buffer,
> buffer_len, return_value TSRMLS_CC);
> +               php_fgetcsv_ex(stream, delim, delim_len, enc, enc_len, esc, 
> esc_len, buffer,
> buffer_len, return_value TSRMLS_CC);
>         }
>  }
>  
> @@ -2365,8 +2373,12 @@
>                                 }
>  
>                                 /* Is it an escape character? */
> -                               if (PHP_FGETCSV_BIN_CHECK(p, e, escape, 
> escape_len)) {
> -                                       /* Skip escape sequence and let next 
> char be treated as
> literal */
> +                               if ((PHP_FGETCSV_BIN_CHECK(p, e, escape, 
> escape_len) && escape
> != enclosure)
> +                                       || (PHP_FGETCSV_BIN_CHECK(p, e, 
> escape, escape_len)
> +                                               &&
> PHP_FGETCSV_BIN_CHECK(p+1, e, escape,
> escape_len) && escape == enclosure)) {
> +                                       /* Skip escape sequence and let next 
> char be treated as
> literal 
> +                                          If enclosure is the same character 
> as esacpe, it is
> considered as esacped
> +                                          if it appears twice */
>                                         p += escape_len;
>                                         /* FALL THROUGH */
>                                 }
> @@ -2569,8 +2581,12 @@
>                                 }
>  
>                                 /* Is it an escape character? */
> -                               if (PHP_FGETCSV_UNI_CHECK(p, e, escape, 
> escape_len)) {
> -                                       /* Skip escape sequence and let next 
> char be treated as
> literal */
> +                               if ((PHP_FGETCSV_UNI_CHECK(p, e, escape, 
> escape_len) && escape
> != enclosure)
> +                                       || (PHP_FGETCSV_UNI_CHECK(p, e, 
> escape, escape_len)
> +                                               &&
> PHP_FGETCSV_UNI_CHECK(p+1, e, escape,
> escape_len) && escape == enclosure)) {
> +                                       /* Skip escape sequence and let next 
> char be treated as
> literal 
> +                                          If enclosure is the same character 
> as esacpe, it is
> considered as esacped
> +                                          if it appears twice */
>                                         p += escape_len;
>                                         /* FALL THROUGH */
>                                 }
> http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.h?r1=1.104&r2=1.105&diff_format=u
> Index: php-src/ext/standard/file.h
> diff -u php-src/ext/standard/file.h:1.104 php-src/ext/standard/file.h:1.105
> --- php-src/ext/standard/file.h:1.104   Wed Jan 10 15:06:58 2007
> +++ php-src/ext/standard/file.h Wed Oct  3 10:31:04 2007
> @@ -16,7 +16,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: file.h,v 1.104 2007/01/10 15:06:58 bjori Exp $ */
> +/* $Id: file.h,v 1.105 2007/10/03 10:31:04 dsp Exp $ */
>  
>  /* Synced with php 3.0 revision 1.30 1999-06-16 [ssb] */
>  
> @@ -78,7 +78,7 @@
>  PHPAPI int php_copy_file_ex(char *src, char *dest, int src_chk 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);
> +PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, 
> char escape,
> size_t buf_len, char *buf, zval *return_value TSRMLS_DC);
>  PHPAPI void php_fgetcsv_ex(php_stream *stream, char *delimiter, int 
> delimiter_len, char
> *enclosure, int enclosure_len, char *escape, int escape_len,
>                 char *buffer, int buffer_len, zval *return_value TSRMLS_DC);
>  PHPAPI void php_u_fgetcsv(php_stream *stream, UChar *delimiter, int 
> delimiter_len, UChar
> *enclosure, int enclosure_len, UChar *escape, int escape_len,
> http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/fgetcsv_error.phpt?r1=1.2&r2=1.3&diff_format=u
> Index: php-src/ext/standard/tests/file/fgetcsv_error.phpt
> diff -u php-src/ext/standard/tests/file/fgetcsv_error.phpt:1.2
> php-src/ext/standard/tests/file/fgetcsv_error.phpt:1.3
> --- php-src/ext/standard/tests/file/fgetcsv_error.phpt:1.2      Wed Aug  8 
> 13:15:01 2007
> +++ php-src/ext/standard/tests/file/fgetcsv_error.phpt  Wed Oct  3 10:31:04 
> 2007
> @@ -36,7 +36,7 @@
>  for($loop_counter = 1; $loop_counter <= count($invalid_args); 
> $loop_counter++) {
>    echo "-- Iteration $loop_counter --\n";
>    var_dump( fgetcsv($invalid_args[$loop_counter - 1]) ); // with default args
> -  var_dump( fgetcsv($invalid_args[$loop_counter - 1], $len, $delim, 
> $enclosure) ); // all args
> specified
> +  var_dump( fgetcsv($invalid_args[$loop_counter - 1], $len, $delim, 
> $enclosure, $escape) ); //
> all args specified
>  }
>  
>  echo "Done\n";

> http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/bug40501.csv?view=markup&rev=1.1
> Index: php-src/ext/standard/tests/file/bug40501.csv
> +++ php-src/ext/standard/tests/file/bug40501.csv
> "this element contains the delimiter, and ends with an odd number of
> backslashes (ex: 1)\",and it isn't the last element$
> http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/bug40501.phpt?view=markup&rev=1.1
> Index: php-src/ext/standard/tests/file/bug40501.phpt
> +++ php-src/ext/standard/tests/file/bug40501.phpt
> --TEST--
> Bug #40501 (fgetcsv() can't handle trailing odd number of backslashes)
> --FILE--
> <?php
> $file = dirname(__FILE__).'/bug40501.csv';

> $h = fopen($file, 'r');
> $data = fgetcsv($h, NULL, ',', '"', '"');
> fclose($h);

> var_dump($data);
?>>
> --EXPECT--
> array(2) {
>   [0]=>
>   string(88) "this element contains the delimiter, and ends with an odd 
> number of
> backslashes (ex: 1)\"
>   [1]=>
>   string(30) "and it isn't the last element$"
> }



Best regards,
 Marcus

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to