diff --git a/UPGRADING b/UPGRADING index 19ee6722734a0..5d503fd242640 100644 --- a/UPGRADING +++ b/UPGRADING @@ -581,11 +581,11 @@ PHP 8.4 UPGRADE NOTES - SPL: . The SplFixedArray::__wakeup() method has been deprecated as it implements __serialize() and __unserialize() which need to be overwritten instead. - . Passing a non-empty string for the $enclosure parameter of: + . Using the default value for $escape parameter of: - SplFileObject::setCsvControl() - SplFileObject::fputcsv() - SplFileObject::fgetcsv() - is now deprecated. + is now deprecated. It must be passed explicitly either positionally or via named arguments. RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_proprietary_csv_escaping_mechanism - Standard: @@ -595,11 +595,11 @@ PHP 8.4 UPGRADE NOTES RFC: https://wiki.php.net/rfc/raising_zero_to_power_of_negative_number . Unserializing strings using the uppercase 'S' tag is deprecated. RFC: https://wiki.php.net/rfc/deprecations_php_8_4#unserialize_s_s_tag - . Passing a non-empty string for the $enclosure parameter of: + . Using the default value for $escape parameter of: - fputcsv() - fgetcsv() - str_getcsv() - is now deprecated. + is now deprecated. It must be passed explicitly either positionally or via named arguments. RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_proprietary_csv_escaping_mechanism - XML: diff --git a/ext/phar/tests/phar_oo_008.phpt b/ext/phar/tests/phar_oo_008.phpt index 96ba8347ec754..f1ef081f12a62 100644 --- a/ext/phar/tests/phar_oo_008.phpt +++ b/ext/phar/tests/phar_oo_008.phpt @@ -33,7 +33,7 @@ class MyCSVFile extends SplFileObject { function current(): array|false { - return parent::fgetcsv(',', '"'); + return parent::fgetcsv(',', '"', escape: ''); } } @@ -44,14 +44,14 @@ $v = $phar['a.csv']; echo "===3===\n"; while(!$v->eof()) { - echo $v->key() . "=>" . join('|', $v->fgetcsv()) . "\n"; + echo $v->key() . "=>" . join('|', $v->fgetcsv(escape: '')) . "\n"; } echo "===4===\n"; $v->rewind(); while(!$v->eof()) { - $l = $v->fgetcsv(); + $l = $v->fgetcsv(escape: ''); echo $v->key() . "=>" . join('|', $l) . "\n"; } @@ -66,7 +66,7 @@ class MyCSVFile2 extends SplFileObject function getCurrentLine(): string { echo __METHOD__ . "\n"; - return implode('|', parent::fgetcsv(',', '"')); + return implode('|', parent::fgetcsv(',', '"', escape: '')); } } diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 1f75c4e3ae8f8..3097e95e18a6a 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -365,6 +365,7 @@ static zend_result spl_filesystem_file_open(spl_filesystem_object *intern, bool intern->u.file.delimiter = ','; intern->u.file.enclosure = '"'; intern->u.file.escape = (unsigned char) '\\'; + intern->u.file.is_escape_default = true; intern->u.file.func_getCurr = zend_hash_str_find_ptr(&intern->std.ce->function_table, "getcurrentline", sizeof("getcurrentline") - 1); @@ -2273,16 +2274,33 @@ PHP_METHOD(SplFileObject, getChildren) /* return NULL */ } /* }}} */ +static int spl_csv_enclosure_param_handling(const zend_string* escape_str, const spl_filesystem_object *intern, uint32_t arg_num) +{ + if (escape_str == NULL) { + if (intern->u.file.is_escape_default) { + php_error_docref(NULL, E_DEPRECATED, "the $escape parameter must be provided," + " as its default value will change," + " either explicitly or via SplFileObject::setCsvControl()"); + if (UNEXPECTED(EG(exception))) { + return PHP_CSV_ESCAPE_ERROR; + } + } + return intern->u.file.escape; + } else { + return php_csv_handle_escape_argument(escape_str, arg_num); + } +} + /* {{{ Return current line as CSV */ PHP_METHOD(SplFileObject, fgetcsv) { spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure; - int escape = intern->u.file.escape; - char *delim = NULL, *enclo = NULL, *esc = NULL; - size_t d_len = 0, e_len = 0, esc_len = 0; + char *delim = NULL, *enclo = NULL; + size_t d_len = 0, e_len = 0; + zend_string *escape_str = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ssS", &delim, &d_len, &enclo, &e_len, &escape_str) == FAILURE) { RETURN_THROWS(); } @@ -2302,23 +2320,12 @@ PHP_METHOD(SplFileObject, fgetcsv) } enclosure = enclo[0]; } - if (esc) { - if (esc_len > 1) { - zend_argument_value_error(3, "must be empty or a single character"); - RETURN_THROWS(); - } - if (esc_len == 0) { - escape = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - escape = (unsigned char) esc[0]; - } + int escape_char = spl_csv_enclosure_param_handling(escape_str, intern, 3); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); } - if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape, return_value, true) == FAILURE) { + if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape_char, return_value, true) == FAILURE) { RETURN_FALSE; } } @@ -2329,14 +2336,14 @@ PHP_METHOD(SplFileObject, fputcsv) { spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure; - int escape = intern->u.file.escape; - char *delim = NULL, *enclo = NULL, *esc = NULL; - size_t d_len = 0, e_len = 0, esc_len = 0; + char *delim = NULL, *enclo = NULL; + size_t d_len = 0, e_len = 0; zend_long ret; zval *fields = NULL; + zend_string *escape_str = NULL; zend_string *eol = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|sssS", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len, &eol) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|ssSS", &fields, &delim, &d_len, &enclo, &e_len, &escape_str, &eol) == FAILURE) { RETURN_THROWS(); } @@ -2354,23 +2361,12 @@ PHP_METHOD(SplFileObject, fputcsv) } enclosure = enclo[0]; } - if (esc) { - if (esc_len > 1) { - zend_argument_value_error(4, "must be empty or a single character"); - RETURN_THROWS(); - } - if (esc_len == 0) { - escape = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - escape = (unsigned char) esc[0]; - } + int escape_char = spl_csv_enclosure_param_handling(escape_str, intern, 4); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); } - ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol); + ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape_char, eol); if (ret < 0) { RETURN_FALSE; } @@ -2383,11 +2379,11 @@ PHP_METHOD(SplFileObject, setCsvControl) { spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS)); char delimiter = ',', enclosure = '"'; - int escape = (unsigned char) '\\'; - char *delim = NULL, *enclo = NULL, *esc = NULL; - size_t d_len = 0, e_len = 0, esc_len = 0; + char *delim = NULL, *enclo = NULL; + size_t d_len = 0, e_len = 0; + zend_string *escape_str = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ssS", &delim, &d_len, &enclo, &e_len, &escape_str) == FAILURE) { RETURN_THROWS(); } @@ -2405,25 +2401,17 @@ PHP_METHOD(SplFileObject, setCsvControl) } enclosure = enclo[0]; } - if (esc) { - if (esc_len > 1) { - zend_argument_value_error(3, "must be empty or a single character"); - RETURN_THROWS(); - } - if (esc_len == 0) { - escape = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - escape = (unsigned char) esc[0]; - } + int escape_char = php_csv_handle_escape_argument(escape_str, 3); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); + } + if (escape_str != NULL) { + intern->u.file.is_escape_default = false; } intern->u.file.delimiter = delimiter; intern->u.file.enclosure = enclosure; - intern->u.file.escape = escape; + intern->u.file.escape = escape_char; } /* }}} */ diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h index 5f104c48c9885..549dfb1dc4d0f 100644 --- a/ext/spl/spl_directory.h +++ b/ext/spl/spl_directory.h @@ -82,6 +82,7 @@ struct _spl_filesystem_object { char delimiter; char enclosure; int escape; + bool is_escape_default; } file; } u; zend_object std; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt index 2580021426fd3..dd42be924cdd5 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt @@ -3,15 +3,20 @@ SplFileObject::fgetcsv default path --FILE-- setCsvControl(escape: ''); var_dump($fo->fgetcsv()); ?> --CLEAN-- diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt index 6bf5b43f6bd9a..13bbfd9064abb 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt @@ -1,17 +1,23 @@ --TEST-- -SplFileObject::fgetcsv with alternative delimiter +SplFileObject::fgetcsv with alternative separator --FILE-- setCsvControl(escape: ''); var_dump($fo->fgetcsv('|')); ?> --CLEAN-- diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt index b14e7ca479f50..7bfd61bbc188d 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt @@ -1,17 +1,22 @@ --TEST-- -SplFileObject::fgetcsv with alternative delimiter +SplFileObject::fgetcsv() delimiter error --FILE-- setCsvControl(escape: ''); try { var_dump($fo->fgetcsv('invalid')); } catch (ValueError $e) { diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt index 971e44ba4d321..d200d440f7769 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt @@ -1,18 +1,24 @@ --TEST-- -SplFileObject::fgetcsv with alternative delimiter +SplFileObject::fgetcsv with alternative enclosure --FILE-- fgetcsv(',', '"')); +$fo->setCsvControl(escape: ''); +var_dump($fo->fgetcsv(enclosure: '"')); ?> --CLEAN-- setCsvControl(escape: ''); try { - var_dump($fo->fgetcsv(',', 'invalid')); + var_dump($fo->fgetcsv(enclosure: 'invalid')); } catch (ValueError $e) { echo $e->getMessage(), "\n"; } diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt index df66463db7896..4a8bccaf671a1 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt @@ -1,5 +1,5 @@ --TEST-- -SplFileObject::fgetcsv with alternative delimiter +SplFileObject::fgetcsv with alternative escape --FILE-- fgetcsv(',', '"', '"')); unlink('SplFileObject__fgetcsv6.csv'); ?> --EXPECTF-- -Deprecated: SplFileObject::fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array(3) { [0]=> string(3) "aaa" diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt index 9614f91d4149d..b6a878f3cf356 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt @@ -13,7 +13,8 @@ var_dump($fo->fgetcsv()); ---EXPECT-- +--EXPECTF-- +Deprecated: SplFileObject::fgetcsv(): the $escape parameter must be provided, as its default value will change, either explicitly or via SplFileObject::setCsvControl() in %s on line %d array(3) { [0]=> string(4) "aa\"" diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt index a1471c8e0e7d7..eb6fc49161119 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt @@ -1,5 +1,5 @@ --TEST-- -SplFileObject::fgetcsv with alternative delimiter +SplFileObject::fgetcsv() escape error --FILE-- setCsvControl(escape: '\\'); $list = array ( 0 => 'aaa,bbb', @@ -42,7 +44,7 @@ echo '$list = ';var_export($res);echo ";\n"; $fp = fopen($file, "r"); $res = array(); -while($l=fgetcsv($fp)) +while($l=fgetcsv($fp, escape: '\\')) { $res[] = join(',',$l); } diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt index 77f6d76bbf5cc..41b1db637f249 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt @@ -3,6 +3,7 @@ SplFileObject::fputcsv(): Checking data after calling the function --FILE-- setCsvControl(escape: ''); $data = array(1, 2, 'foo', 'haha', array(4, 5, 6), 1.3, null); diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt index 47f8c609be537..2b9e649678bdb 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt @@ -42,6 +42,7 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: ''); $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt index 49f77d4158883..6c6f5109df041 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt @@ -36,6 +36,8 @@ foreach ($fields as $field) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $csv_field = $field; // write to a file in csv format diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt index 77d041689c9c7..b59dfafcfcb72 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt @@ -42,6 +42,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt index 947d89b763b90..04fd4c30b2767 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt @@ -43,6 +43,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt index 898d89681e5da..468b66b44c238 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt @@ -42,6 +42,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt index 33bae5e48d22a..8a4fb8ed9c5df 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt @@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt index bae8962567d28..46642a4f52d76 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt @@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt index 2306c92ce3f9c..608a61bf3d57c 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt @@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) { } else { $fo = new SplFileObject($file, $file_modes[$mode_counter]); } + $fo->setCsvControl(escape: '\\'); + $delimiter = $csv_list[0]; $enclosure = $csv_list[1]; $csv_field = $csv_list[2]; diff --git a/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt b/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt index f54f8eeabd35a..8c8e52e9743c9 100644 --- a/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt +++ b/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt @@ -23,7 +23,8 @@ foreach ($s as $row) { ---EXPECT-- +--EXPECTF-- +Deprecated: SplFileObject::setCsvControl(): the $escape parameter must be provided as its default value will change in %s on line %d groene appelen : 10 gele bananen : 20 rode kersen : 30 diff --git a/ext/spl/tests/SplFileObject/bug46569.phpt b/ext/spl/tests/SplFileObject/bug46569.phpt index 0c1ab6ce1427e..be5d20ce99e3d 100644 --- a/ext/spl/tests/SplFileObject/bug46569.phpt +++ b/ext/spl/tests/SplFileObject/bug46569.phpt @@ -3,6 +3,7 @@ Bug #46569 (SplFileObject: fgetcsv after seek returns wrong line) --FILE-- setCsvControl(escape: ""); $file->seek(1); print_r($file->fgetcsv()); ?> diff --git a/ext/spl/tests/SplFileObject/bug75917.phpt b/ext/spl/tests/SplFileObject/bug75917.phpt index c9bc02869c2d1..27ce3f792c598 100644 --- a/ext/spl/tests/SplFileObject/bug75917.phpt +++ b/ext/spl/tests/SplFileObject/bug75917.phpt @@ -8,6 +8,7 @@ $expected = [ ]; $tmp = new SplTempFileObject(); +$tmp->setCsvControl(escape: ""); foreach ($expected as $row) { $tmp->fputcsv($row); } diff --git a/ext/spl/tests/SplFileObject/bug77024.phpt b/ext/spl/tests/SplFileObject/bug77024.phpt index d61dc941d4a65..a82713fb3a83d 100644 --- a/ext/spl/tests/SplFileObject/bug77024.phpt +++ b/ext/spl/tests/SplFileObject/bug77024.phpt @@ -4,6 +4,7 @@ Bug #77024 SplFileObject::__toString() may return array setCsvControl(escape: ""); $file->fputcsv(['foo', 'bar', 'baz']); $file->rewind(); $file->setFlags(SplFileObject::READ_CSV); diff --git a/ext/spl/tests/SplFileObject/bug78976.phpt b/ext/spl/tests/SplFileObject/bug78976.phpt index 059807eb74796..23123a34eb3b0 100644 --- a/ext/spl/tests/SplFileObject/bug78976.phpt +++ b/ext/spl/tests/SplFileObject/bug78976.phpt @@ -3,6 +3,7 @@ Bug #78976 (SplFileObject::fputcsv returns -1 on failure) --FILE-- setCsvControl(escape: ""); var_dump($file->fputcsv(['foo', 'bar'])); ?> --EXPECT-- diff --git a/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt b/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt index f34dafce48732..a2dadecae4139 100644 --- a/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt +++ b/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt @@ -3,9 +3,8 @@ SplFileObject: fgetcsv() on a blank line --FILE-- setCsvControl(escape: ""); // write to file $file->fwrite(""); @@ -18,11 +17,6 @@ $file->setFlags(SplFileObject::SKIP_EMPTY); $file->rewind(); var_dump($file->fgetcsv()); ?> ---CLEAN-- - --EXPECT-- array(1) { [0]=> diff --git a/ext/spl/tests/bug69181.phpt b/ext/spl/tests/bug69181.phpt index 729a5bd600b7a..085fccd326524 100644 --- a/ext/spl/tests/bug69181.phpt +++ b/ext/spl/tests/bug69181.phpt @@ -12,6 +12,7 @@ CSV; file_put_contents($filename, $csv); $file = new SplFileObject($filename); +$file->setCsvControl(escape: ""); $file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE | SplFileObject::READ_CSV); var_dump(iterator_to_array($file)); diff --git a/ext/standard/file.c b/ext/standard/file.c index 11d174cd9d5d3..7d0d2703ca587 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1677,6 +1677,28 @@ static const char *php_fgetcsv_lookup_trailing_spaces(const char *ptr, size_t le } /* }}} */ +PHPAPI int php_csv_handle_escape_argument(const zend_string *escape_str, uint32_t arg_num) +{ + if (escape_str != NULL) { + if (ZSTR_LEN(escape_str) > 1) { + zend_argument_value_error(arg_num, "must be empty or a single character"); + return PHP_CSV_ESCAPE_ERROR; + } + if (ZSTR_LEN(escape_str) < 1) { + return PHP_CSV_NO_ESCAPE; + } else { + /* use first character from string */ + return (unsigned char) ZSTR_VAL(escape_str)[0]; + } + } else { + php_error_docref(NULL, E_DEPRECATED, "the $escape parameter must be provided as its default value will change"); + if (UNEXPECTED(EG(exception))) { + return PHP_CSV_ESCAPE_ERROR; + } + return (unsigned char) '\\'; + } +} + #define FPUTCSV_FLD_CHK(c) memchr(ZSTR_VAL(field_str), c, ZSTR_LEN(field_str)) /* {{{ Format line as CSV and write to file pointer */ @@ -1684,12 +1706,12 @@ PHP_FUNCTION(fputcsv) { char delimiter = ','; /* allow this to be set as parameter */ char enclosure = '"'; /* allow this to be set as parameter */ - int escape_char = (unsigned char) '\\'; /* allow this to be set as parameter */ php_stream *stream; zval *fp = NULL, *fields = NULL; ssize_t ret; - char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL; - size_t delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0; + char *delimiter_str = NULL, *enclosure_str = NULL; + zend_string *escape_str = NULL; + size_t delimiter_str_len = 0, enclosure_str_len = 0; zend_string *eol_str = NULL; ZEND_PARSE_PARAMETERS_START(2, 6) @@ -1698,7 +1720,7 @@ PHP_FUNCTION(fputcsv) Z_PARAM_OPTIONAL Z_PARAM_STRING(delimiter_str, delimiter_str_len) Z_PARAM_STRING(enclosure_str, enclosure_str_len) - Z_PARAM_STRING(escape_str, escape_str_len) + Z_PARAM_STR(escape_str) Z_PARAM_STR_OR_NULL(eol_str) ZEND_PARSE_PARAMETERS_END(); @@ -1722,21 +1744,9 @@ PHP_FUNCTION(fputcsv) enclosure = *enclosure_str; } - if (escape_str != NULL) { - if (escape_str_len > 1) { - zend_argument_value_error(5, "must be empty or a single character"); - RETURN_THROWS(); - } - if (escape_str_len < 1) { - escape_char = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - /* use first character from string */ - escape_char = (unsigned char) *escape_str; - } + int escape_char = php_csv_handle_escape_argument(escape_str, 5); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); } PHP_STREAM_FROM_ZVAL(stream, fp); @@ -1819,80 +1829,64 @@ PHP_FUNCTION(fgetcsv) { char delimiter = ','; /* allow this to be set as parameter */ char enclosure = '"'; /* allow this to be set as parameter */ - int escape = (unsigned char) '\\'; zend_long len = 0; size_t buf_len; char *buf; php_stream *stream; - { - zval *fd; - bool len_is_null = 1; - char *delimiter_str = NULL; - size_t delimiter_str_len = 0; - char *enclosure_str = NULL; - size_t enclosure_str_len = 0; - char *escape_str = NULL; - size_t escape_str_len = 0; - - ZEND_PARSE_PARAMETERS_START(1, 5) - Z_PARAM_RESOURCE(fd) - Z_PARAM_OPTIONAL - Z_PARAM_LONG_OR_NULL(len, len_is_null) - Z_PARAM_STRING(delimiter_str, delimiter_str_len) - Z_PARAM_STRING(enclosure_str, enclosure_str_len) - Z_PARAM_STRING(escape_str, escape_str_len) - ZEND_PARSE_PARAMETERS_END(); - - if (delimiter_str != NULL) { - /* Make sure that there is at least one character in string */ - if (delimiter_str_len != 1) { - zend_argument_value_error(3, "must be a single character"); - RETURN_THROWS(); - } - - /* use first character from string */ - delimiter = delimiter_str[0]; - } + zval *fd; + bool len_is_null = 1; + char *delimiter_str = NULL; + size_t delimiter_str_len = 0; + char *enclosure_str = NULL; + size_t enclosure_str_len = 0; + zend_string *escape_str = NULL; - if (enclosure_str != NULL) { - if (enclosure_str_len != 1) { - zend_argument_value_error(4, "must be a single character"); - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 5) + Z_PARAM_RESOURCE(fd) + Z_PARAM_OPTIONAL + Z_PARAM_LONG_OR_NULL(len, len_is_null) + Z_PARAM_STRING(delimiter_str, delimiter_str_len) + Z_PARAM_STRING(enclosure_str, enclosure_str_len) + Z_PARAM_STR(escape_str) + ZEND_PARSE_PARAMETERS_END(); - /* use first character from string */ - enclosure = enclosure_str[0]; + if (delimiter_str != NULL) { + /* Make sure that there is at least one character in string */ + if (delimiter_str_len != 1) { + zend_argument_value_error(3, "must be a single character"); + RETURN_THROWS(); } - if (escape_str != NULL) { - if (escape_str_len > 1) { - zend_argument_value_error(5, "must be empty or a single character"); - RETURN_THROWS(); - } - - if (escape_str_len < 1) { - escape = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - escape = (unsigned char) escape_str[0]; - } - } + /* use first character from string */ + delimiter = delimiter_str[0]; + } - if (len_is_null || len == 0) { - len = -1; - } else if (len < 0 || len > (ZEND_LONG_MAX - 1)) { - zend_argument_value_error(2, "must be between 0 and " ZEND_LONG_FMT, (ZEND_LONG_MAX - 1)); + if (enclosure_str != NULL) { + if (enclosure_str_len != 1) { + zend_argument_value_error(4, "must be a single character"); RETURN_THROWS(); } - PHP_STREAM_FROM_ZVAL(stream, fd); + /* use first character from string */ + enclosure = enclosure_str[0]; + } + + int escape_char = php_csv_handle_escape_argument(escape_str, 5); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); } + if (len_is_null || len == 0) { + len = -1; + } else if (len < 0 || len > (ZEND_LONG_MAX - 1)) { + zend_argument_value_error(2, "must be between 0 and " ZEND_LONG_FMT, (ZEND_LONG_MAX - 1)); + RETURN_THROWS(); + } + + PHP_STREAM_FROM_ZVAL(stream, fd); + if (len < 0) { if ((buf = php_stream_get_line(stream, NULL, 0, &buf_len)) == NULL) { RETURN_FALSE; @@ -1905,7 +1899,7 @@ PHP_FUNCTION(fgetcsv) } } - HashTable *values = php_fgetcsv(stream, delimiter, enclosure, escape, buf_len, buf); + HashTable *values = php_fgetcsv(stream, delimiter, enclosure, escape_char, buf_len, buf); if (values == NULL) { values = php_bc_fgetcsv_empty_line(); } diff --git a/ext/standard/file.h b/ext/standard/file.h index eead935848877..d56934f20d271 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -47,7 +47,10 @@ PHPAPI void php_flock_common(php_stream *stream, zend_long operation, uint32_t o zval *wouldblock, zval *return_value); #define PHP_CSV_NO_ESCAPE EOF +#define PHP_CSV_ESCAPE_ERROR -500 + PHPAPI HashTable *php_bc_fgetcsv_empty_line(void); +PHPAPI int php_csv_handle_escape_argument(const zend_string *escape_str, uint32_t arg_num); PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int escape_char, size_t buf_len, char *buf); PHPAPI ssize_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char, zend_string *eol_str); diff --git a/ext/standard/string.c b/ext/standard/string.c index 6ebe7db08965f..c84b0adec6a4c 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -5416,16 +5416,16 @@ PHP_FUNCTION(str_getcsv) { zend_string *str; char delimiter = ',', enclosure = '"'; - int escape = (unsigned char) '\\'; - char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL; - size_t delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0; + char *delimiter_str = NULL, *enclosure_str = NULL; + size_t delimiter_str_len = 0, enclosure_str_len = 0; + zend_string *escape_str = NULL; ZEND_PARSE_PARAMETERS_START(1, 4) Z_PARAM_STR(str) Z_PARAM_OPTIONAL Z_PARAM_STRING(delimiter_str, delimiter_str_len) Z_PARAM_STRING(enclosure_str, enclosure_str_len) - Z_PARAM_STRING(escape_str, escape_str_len) + Z_PARAM_STR(escape_str) ZEND_PARSE_PARAMETERS_END(); if (delimiter_str != NULL) { @@ -5445,24 +5445,13 @@ PHP_FUNCTION(str_getcsv) /* use first character from string */ enclosure = enclosure_str[0]; } - if (escape_str != NULL) { - if (escape_str_len > 1) { - zend_argument_value_error(4, "must be empty or a single character"); - RETURN_THROWS(); - } - if (escape_str_len < 1) { - escape = PHP_CSV_NO_ESCAPE; - } else { - php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4"); - if (UNEXPECTED(EG(exception))) { - RETURN_THROWS(); - } - escape = (unsigned char) escape_str[0]; - } + int escape_char = php_csv_handle_escape_argument(escape_str, 4); + if (escape_char == PHP_CSV_ESCAPE_ERROR) { + RETURN_THROWS(); } - HashTable *values = php_fgetcsv(NULL, delimiter, enclosure, escape, ZSTR_LEN(str), ZSTR_VAL(str)); + HashTable *values = php_fgetcsv(NULL, delimiter, enclosure, escape_char, ZSTR_LEN(str), ZSTR_VAL(str)); if (values == NULL) { values = php_bc_fgetcsv_empty_line(); } diff --git a/ext/standard/tests/file/bug12556.phpt b/ext/standard/tests/file/bug12556.phpt index 83b39ad7822ae..586b1e6082274 100644 --- a/ext/standard/tests/file/bug12556.phpt +++ b/ext/standard/tests/file/bug12556.phpt @@ -3,7 +3,7 @@ Bug #12556 (fgetcsv() ignores lengths when quotes not closed) --FILE-- --EXPECTF-- array(2) { diff --git a/ext/standard/tests/file/bug39538.phpt b/ext/standard/tests/file/bug39538.phpt index 5f40192ec90d6..ea2bc9168065f 100644 --- a/ext/standard/tests/file/bug39538.phpt +++ b/ext/standard/tests/file/bug39538.phpt @@ -2,38 +2,53 @@ Bug #39538 (fgetcsv can't handle starting newlines and trailing odd number of backslashes) --FILE-- +--CLEAN-- + --EXPECT-- -Array -( - [0] => -this is an test - [1] => next data - [2] => p -arsed -) -Array -( - [0] => -this is an test - [1] => next data - [2] => p -arsed -) -Array -( - [0] => - this is an test - [1] => next data - [2] => p - arsed -) +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/file/bug40501.phpt b/ext/standard/tests/file/bug40501.phpt index e278609acab4e..42fcd296cfaaa 100644 --- a/ext/standard/tests/file/bug40501.phpt +++ b/ext/standard/tests/file/bug40501.phpt @@ -11,7 +11,6 @@ fclose($h); var_dump($data); ?> --EXPECTF-- -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array(2) { [0]=> string(%d) "this element contains the delimiter, and ends with an odd number of diff --git a/ext/standard/tests/file/bug53848.phpt b/ext/standard/tests/file/bug53848.phpt index d634838b458f9..cae8da9828683 100644 --- a/ext/standard/tests/file/bug53848.phpt +++ b/ext/standard/tests/file/bug53848.phpt @@ -6,7 +6,7 @@ $file = __DIR__ . "/bug53848.csv"; @unlink($file); file_put_contents($file, "a,b\n c, d"); $fp = fopen($file, "r"); -while ($l = fgetcsv($fp)) var_dump($l); +while ($l = fgetcsv($fp, escape: "\\")) var_dump($l); fclose($fp); @unlink($file); ?> diff --git a/ext/standard/tests/file/bug66588.phpt b/ext/standard/tests/file/bug66588.phpt index afb9ef36d500d..eb2650f99b5c3 100644 --- a/ext/standard/tests/file/bug66588.phpt +++ b/ext/standard/tests/file/bug66588.phpt @@ -9,13 +9,13 @@ and neither should return FALSE. $s = fopen("php://memory", "w+"); fwrite($s, "\",bar"); rewind($s); -var_dump(fgetcsv($s)); +var_dump(fgetcsv($s, escape: "\\")); fclose($s); $s = fopen("php://memory", "w+"); fwrite($s, "\",bar\n"); rewind($s); -var_dump(fgetcsv($s)); +var_dump(fgetcsv($s, escape: "\\")); fclose($s); ?> --EXPECT-- diff --git a/ext/standard/tests/file/bug72330.phpt b/ext/standard/tests/file/bug72330.phpt index d869b7171dccf..822be7d7b02b3 100644 --- a/ext/standard/tests/file/bug72330.phpt +++ b/ext/standard/tests/file/bug72330.phpt @@ -11,14 +11,13 @@ if (setlocale(LC_ALL, "en_US.utf8", "en_AU.utf8", "ko_KR.utf8", "zh_CN.utf8", "d setlocale(LC_ALL, "en_US.utf8", "en_AU.utf8", "ko_KR.utf8", "zh_CN.utf8", "de_DE.utf8", "es_EC.utf8", "fr_FR.utf8", "ja_JP.utf8", "el_GR.utf8", "nl_NL.utf8"); $utf_1 = chr(0xD1) . chr(0x81); // U+0440; -$utf_2 = chr(0xD8) . chr(0x80); // U+0600 +$utf_2 = chr(0xD8) . chr(0x80); // U+0600 $string = '"first #' . $utf_1 . $utf_2 . '";"second"'; $fields = str_getcsv($string, ';', '"', "#"); var_dump($fields); ?> --EXPECTF-- -Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array(2) { [0]=> string(11) "first #с؀" diff --git a/ext/standard/tests/file/fgetcsv.phpt b/ext/standard/tests/file/fgetcsv.phpt index 41e89699247ca..ba2aac5c41cf7 100644 --- a/ext/standard/tests/file/fgetcsv.phpt +++ b/ext/standard/tests/file/fgetcsv.phpt @@ -34,7 +34,7 @@ various fgetcsv() functionality tests fwrite($fp, $v); fclose($fp); - var_dump(fgetcsv(fopen($file, "r"), 1024)); + var_dump(fgetcsv(fopen($file, "r"), 1024, escape: "\\")); } @unlink($file); ?> diff --git a/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt b/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt new file mode 100644 index 0000000000000..b048c029f4e05 --- /dev/null +++ b/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt @@ -0,0 +1,27 @@ +--TEST-- +fgetcsv(): Deprecation if using default escape arg +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Deprecated: fgetcsv(): the $escape parameter must be provided as its default value will change in %s on line %d +array(2) { + [0]=> + string(5) "test1" + [1]=> + string(5) "test2" +} diff --git a/ext/standard/tests/file/fgetcsv_error_conditions.phpt b/ext/standard/tests/file/fgetcsv_error_conditions.phpt index cd07ece97ebde..3c1353cb3c20e 100644 --- a/ext/standard/tests/file/fgetcsv_error_conditions.phpt +++ b/ext/standard/tests/file/fgetcsv_error_conditions.phpt @@ -12,38 +12,38 @@ $enclosure = '"'; echo 'fgetcsv() with negative length' . \PHP_EOL; try { - var_dump( fgetcsv($file_handle, -10) ); + var_dump( fgetcsv($file_handle, -10, escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } try { - var_dump( fgetcsv($file_handle, -10, $delimiter) ); + var_dump( fgetcsv($file_handle, -10, $delimiter, escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } try { - var_dump( fgetcsv($file_handle, -10, $delimiter, $enclosure) ); + var_dump( fgetcsv($file_handle, -10, $delimiter, $enclosure, escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } echo 'fgetcsv() with delimiter as empty string' . \PHP_EOL; try { - var_dump( fgetcsv($file_handle, $length, '', $enclosure) ); + var_dump( fgetcsv($file_handle, $length, '', $enclosure, escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } echo 'fgetcsv() with enclosure as empty string' . \PHP_EOL; try { - var_dump( fgetcsv($file_handle, $length, $delimiter, '') ); + var_dump( fgetcsv($file_handle, $length, $delimiter, '', escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } echo 'fgetcsv() with delimiter & enclosure as empty string' . \PHP_EOL; try { - var_dump( fgetcsv($file_handle, $length, '', '') ); + var_dump( fgetcsv($file_handle, $length, '', '', escape: "\\") ); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } diff --git a/ext/standard/tests/general_functions/004.data b/ext/standard/tests/file/fgetcsv_tab_delimiter.data similarity index 100% rename from ext/standard/tests/general_functions/004.data rename to ext/standard/tests/file/fgetcsv_tab_delimiter.data diff --git a/ext/standard/tests/general_functions/004.phpt b/ext/standard/tests/file/fgetcsv_tab_delimiter.phpt similarity index 62% rename from ext/standard/tests/general_functions/004.phpt rename to ext/standard/tests/file/fgetcsv_tab_delimiter.phpt index 80a721693923e..8f772c8b0e338 100644 --- a/ext/standard/tests/general_functions/004.phpt +++ b/ext/standard/tests/file/fgetcsv_tab_delimiter.phpt @@ -2,9 +2,10 @@ fgetcsv() with tab delimited fields (BUG #8258) --FILE-- getMessage(), "\n"; } diff --git a/ext/standard/tests/file/fgetcsv_variation2.phpt b/ext/standard/tests/file/fgetcsv_variation2.phpt index 2f88dcad60ef2..6ef75e6b0a77e 100644 --- a/ext/standard/tests/file/fgetcsv_variation2.phpt +++ b/ext/standard/tests/file/fgetcsv_variation2.phpt @@ -69,7 +69,7 @@ foreach ($csv_lists as $csv_list) { // use length as 0 fseek($file_handle, 0, SEEK_SET); - var_dump( fgetcsv($file_handle, 0, $delimiter, $enclosure) ); + var_dump( fgetcsv($file_handle, 0, $delimiter, $enclosure, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation20.phpt b/ext/standard/tests/file/fgetcsv_variation20.phpt index a3c04992db8af..c7a98c4bec12d 100644 --- a/ext/standard/tests/file/fgetcsv_variation20.phpt +++ b/ext/standard/tests/file/fgetcsv_variation20.phpt @@ -48,7 +48,7 @@ $loop_counter = 1; // read the line which is without csv fields, provide delimiter and see the working of fgetcsv $fp_pos = ftell($file_handle); - var_dump( fgetcsv($file_handle, 1024) ); + var_dump( fgetcsv($file_handle, 1024, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation21.phpt b/ext/standard/tests/file/fgetcsv_variation21.phpt index d47a143d4c161..6a0b461a20679 100644 --- a/ext/standard/tests/file/fgetcsv_variation21.phpt +++ b/ext/standard/tests/file/fgetcsv_variation21.phpt @@ -48,7 +48,7 @@ $loop_counter = 1; // read the line which is a blank line to see the working of fgetcsv $fp_pos = ftell($file_handle); - var_dump( fgetcsv($file_handle, 1024, '+') ); + var_dump( fgetcsv($file_handle, 1024, '+', escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation22.phpt b/ext/standard/tests/file/fgetcsv_variation22.phpt index ba927e01901b3..a6981db52da00 100644 --- a/ext/standard/tests/file/fgetcsv_variation22.phpt +++ b/ext/standard/tests/file/fgetcsv_variation22.phpt @@ -66,7 +66,7 @@ foreach ($csv_lists as $csv_list) { // now file pointer should point to end of the file, try reading again var_dump( feof($file_handle) ); - var_dump( fgetcsv($file_handle, 1024, $delimiter) ); // with length, delimiter + var_dump( fgetcsv($file_handle, 1024, $delimiter, escape: "\\") ); // with length, delimiter // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation23.phpt b/ext/standard/tests/file/fgetcsv_variation23.phpt index e933ae54499a4..fc37594b10271 100644 --- a/ext/standard/tests/file/fgetcsv_variation23.phpt +++ b/ext/standard/tests/file/fgetcsv_variation23.phpt @@ -16,13 +16,13 @@ if (!$fp) { echo "Error: failed to create file $filename!\n"; exit(); } -var_dump( fgetcsv($fp) ); +var_dump( fgetcsv($fp, escape: "\\") ); var_dump( ftell($fp) ); -var_dump( fgetcsv($fp, 1024) ); +var_dump( fgetcsv($fp, 1024, escape: "\\") ); var_dump( ftell($fp) ); -var_dump( fgetcsv($fp, 1024, "+" ) ); +var_dump( fgetcsv($fp, 1024, "+", escape: "\\" ) ); var_dump( ftell($fp) ); -var_dump( fgetcsv($fp, 1024, "+", "%") ); +var_dump( fgetcsv($fp, 1024, "+", "%", escape: "\\") ); var_dump( ftell($fp) ); // close and delete the file diff --git a/ext/standard/tests/file/fgetcsv_variation29.phpt b/ext/standard/tests/file/fgetcsv_variation29.phpt index de39f3eb79361..1e84728515ff0 100644 --- a/ext/standard/tests/file/fgetcsv_variation29.phpt +++ b/ext/standard/tests/file/fgetcsv_variation29.phpt @@ -67,7 +67,7 @@ foreach ($csv_lists as $csv_list) { // now file pointer should point to end of the file, try reading again var_dump( feof($file_handle) ); - var_dump( fgetcsv($file_handle) ); + var_dump( fgetcsv($file_handle, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation30.phpt b/ext/standard/tests/file/fgetcsv_variation30.phpt index 7b3c13e108667..76a41cf59c314 100644 --- a/ext/standard/tests/file/fgetcsv_variation30.phpt +++ b/ext/standard/tests/file/fgetcsv_variation30.phpt @@ -66,7 +66,7 @@ foreach ($csv_lists as $csv_list) { // now file pointer should point to end of the file, try reading again var_dump( feof($file_handle) ); - var_dump( fgetcsv($file_handle, 1024) ); + var_dump( fgetcsv($file_handle, 1024, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation31.phpt b/ext/standard/tests/file/fgetcsv_variation31.phpt index 8edaa5787f0c6..d6ee23313ca84 100644 --- a/ext/standard/tests/file/fgetcsv_variation31.phpt +++ b/ext/standard/tests/file/fgetcsv_variation31.phpt @@ -68,7 +68,7 @@ foreach ($csv_lists as $csv_list) { // now file pointer should point to end of the file, try reading again var_dump( feof($file_handle) ); $enc = 'z'; - var_dump( fgetcsv($file_handle, 1024, $delimiter, $enc ) ); // with length, delimiter + var_dump( fgetcsv($file_handle, 1024, $delimiter, $enc, escape: "\\" ) ); // with length, delimiter // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation33.phpt b/ext/standard/tests/file/fgetcsv_variation33.phpt index 7dfb1437e9ea9..61ed844d776bb 100644 --- a/ext/standard/tests/file/fgetcsv_variation33.phpt +++ b/ext/standard/tests/file/fgetcsv_variation33.phpt @@ -9,7 +9,7 @@ EOS; $stream = fopen('php://memory', 'w+'); fwrite($stream, $contents); rewind($stream); -while (($data = fgetcsv($stream)) !== false) { +while (($data = fgetcsv($stream, escape: "\\")) !== false) { var_dump($data); } fclose($stream); diff --git a/ext/standard/tests/file/fgetcsv_variation6.phpt b/ext/standard/tests/file/fgetcsv_variation6.phpt index bd1442155d2c3..6528db85c8bf0 100644 --- a/ext/standard/tests/file/fgetcsv_variation6.phpt +++ b/ext/standard/tests/file/fgetcsv_variation6.phpt @@ -71,12 +71,12 @@ foreach ($csv_lists as $csv_list) { // use length as less than the actual size of the line fseek($file_handle, 0, SEEK_SET); - var_dump( fgetcsv($file_handle, 9, $delimiter, $enclosure) ); + var_dump( fgetcsv($file_handle, 9, $delimiter, $enclosure, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); // read rest of the line - var_dump( fgetcsv($file_handle, 1024, $delimiter, $enclosure) ); + var_dump( fgetcsv($file_handle, 1024, $delimiter, $enclosure, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation7.phpt b/ext/standard/tests/file/fgetcsv_variation7.phpt index 0d5c6dc11399c..14659f06d8290 100644 --- a/ext/standard/tests/file/fgetcsv_variation7.phpt +++ b/ext/standard/tests/file/fgetcsv_variation7.phpt @@ -72,7 +72,7 @@ foreach ($csv_lists as $csv_list) { // use only default arguments fseek($file_handle, 0, SEEK_SET); - var_dump( fgetcsv($file_handle) ); + var_dump( fgetcsv($file_handle, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation8.phpt b/ext/standard/tests/file/fgetcsv_variation8.phpt index 7978e82e318dc..be9610e6eb5f6 100644 --- a/ext/standard/tests/file/fgetcsv_variation8.phpt +++ b/ext/standard/tests/file/fgetcsv_variation8.phpt @@ -74,7 +74,7 @@ foreach ($csv_lists as $csv_list) { fseek($file_handle, 0, SEEK_SET); $del = "+"; $enc = "%"; - var_dump( fgetcsv($file_handle, 1024, $del, $enc) ); + var_dump( fgetcsv($file_handle, 1024, $del, $enc, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fgetcsv_variation9.phpt b/ext/standard/tests/file/fgetcsv_variation9.phpt index b1f14db1c8783..49f9bfda17db0 100644 --- a/ext/standard/tests/file/fgetcsv_variation9.phpt +++ b/ext/standard/tests/file/fgetcsv_variation9.phpt @@ -76,7 +76,7 @@ foreach ($csv_lists as $csv_list) { // use different delimiter but same enclosure char fseek($file_handle, 0, SEEK_SET); $del = "+"; - var_dump( fgetcsv($file_handle, 1024, $del, $enclosure) ); + var_dump( fgetcsv($file_handle, 1024, $del, $enclosure, escape: "\\") ); // check the file pointer position and if eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv.phpt b/ext/standard/tests/file/fputcsv.phpt index b303554e9c6e7..e5d5cae6e6234 100644 --- a/ext/standard/tests/file/fputcsv.phpt +++ b/ext/standard/tests/file/fputcsv.phpt @@ -31,7 +31,7 @@ $file = __DIR__ . '/fputcsv.csv'; $fp = fopen($file, "w"); foreach ($list as $v) { - fputcsv($fp, explode(',', $v)); + fputcsv($fp, explode(',', $v), escape: "\\"); } fclose($fp); @@ -44,7 +44,7 @@ echo '$list = ';var_export($res);echo ";\n"; $fp = fopen($file, "r"); $res = array(); -while($l=fgetcsv($fp)) +while($l=fgetcsv($fp, escape: "\\")) { $res[] = join(',',$l); } diff --git a/ext/standard/tests/file/fputcsv_002.phpt b/ext/standard/tests/file/fputcsv_002.phpt index 90999a9e701b6..7009fc54e7d84 100644 --- a/ext/standard/tests/file/fputcsv_002.phpt +++ b/ext/standard/tests/file/fputcsv_002.phpt @@ -9,7 +9,7 @@ $data = array(1, 2, 'foo', 'haha', array(4, 5, 6), 1.3, null); $fp = fopen($file, 'w'); -fputcsv($fp, $data); +fputcsv($fp, $data, escape: "\\"); var_dump($data); diff --git a/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt b/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt new file mode 100644 index 0000000000000..4f8ceb3bb1a77 --- /dev/null +++ b/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt @@ -0,0 +1,27 @@ +--TEST-- +fputcsv(): Deprecation if using default escape arg +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Deprecated: fputcsv(): the $escape parameter must be provided as its default value will change in %s on line %d +string(12) "test1,test2 +" diff --git a/ext/standard/tests/file/fputcsv_variation1.phpt b/ext/standard/tests/file/fputcsv_variation1.phpt index ba82b20428348..008cf1eabd1dd 100644 --- a/ext/standard/tests/file/fputcsv_variation1.phpt +++ b/ext/standard/tests/file/fputcsv_variation1.phpt @@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; - var_dump( fputcsv($file_handle, $csv_field, $delimiter, $enclosure) ); + var_dump( fputcsv($file_handle, $csv_field, $delimiter, $enclosure, escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation10.phpt b/ext/standard/tests/file/fputcsv_variation10.phpt index ecd184614320c..1baaa2f972f30 100644 --- a/ext/standard/tests/file/fputcsv_variation10.phpt +++ b/ext/standard/tests/file/fputcsv_variation10.phpt @@ -42,7 +42,7 @@ foreach ($fields as $field) { $csv_field = $field; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field) ); + var_dump( fputcsv($file_handle, $csv_field, escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation11.phpt b/ext/standard/tests/file/fputcsv_variation11.phpt index 2347b9332c4e4..d53c4606f935a 100644 --- a/ext/standard/tests/file/fputcsv_variation11.phpt +++ b/ext/standard/tests/file/fputcsv_variation11.phpt @@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field, $delimiter) ); + var_dump( fputcsv($file_handle, $csv_field, $delimiter, escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation12.phpt b/ext/standard/tests/file/fputcsv_variation12.phpt index e5e14c0c91a06..36519ea212d80 100644 --- a/ext/standard/tests/file/fputcsv_variation12.phpt +++ b/ext/standard/tests/file/fputcsv_variation12.phpt @@ -51,7 +51,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field, '+') ); + var_dump( fputcsv($file_handle, $csv_field, '+', escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation13.phpt b/ext/standard/tests/file/fputcsv_variation13.phpt index 297819f68165d..2a2e1ef0470d3 100644 --- a/ext/standard/tests/file/fputcsv_variation13.phpt +++ b/ext/standard/tests/file/fputcsv_variation13.phpt @@ -52,7 +52,7 @@ foreach ($csv_lists as $csv_list) { // write to a file in csv format try { - var_dump( fputcsv($file_handle, $csv_field, '+', '%%') ); + var_dump( fputcsv($file_handle, $csv_field, '+', '%%', escape: "\\") ); } catch (ValueError $e) { echo $e->getMessage(), "\n"; } diff --git a/ext/standard/tests/file/fputcsv_variation18.phpt b/ext/standard/tests/file/fputcsv_variation18.phpt index 7a6d84c21b03e..f232d843278d5 100644 --- a/ext/standard/tests/file/fputcsv_variation18.phpt +++ b/ext/standard/tests/file/fputcsv_variation18.phpt @@ -42,29 +42,12 @@ $file = __DIR__ . '/fputcsv_variation18.csv'; @unlink($file); ?> --EXPECTF-- -Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d $list = array ( 0 => 'aaa,"""/"bbb",ccc', 1 => '"aaa""/"a""","""bbb"""', 2 => '"""/"""","""aaa"""', 3 => '"""/"""""",aaa', ); - -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d - -Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d $list = array ( 0 => 'aaa,"/"bbb,ccc', 1 => 'aaa"/"a","bbb"', diff --git a/ext/standard/tests/file/fputcsv_variation5.phpt b/ext/standard/tests/file/fputcsv_variation5.phpt index 9261f1d2c134c..a705ee4052fb7 100644 --- a/ext/standard/tests/file/fputcsv_variation5.phpt +++ b/ext/standard/tests/file/fputcsv_variation5.phpt @@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field) ); + var_dump( fputcsv($file_handle, $csv_field, escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation6.phpt b/ext/standard/tests/file/fputcsv_variation6.phpt index a385c61ce91e5..b71b7267fded2 100644 --- a/ext/standard/tests/file/fputcsv_variation6.phpt +++ b/ext/standard/tests/file/fputcsv_variation6.phpt @@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field, '+', '%') ); + var_dump( fputcsv($file_handle, $csv_field, '+', '%', escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation7.phpt b/ext/standard/tests/file/fputcsv_variation7.phpt index 7d7586cebfcfe..93f2cbc755ff6 100644 --- a/ext/standard/tests/file/fputcsv_variation7.phpt +++ b/ext/standard/tests/file/fputcsv_variation7.phpt @@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field, '+', $enclosure) ); + var_dump( fputcsv($file_handle, $csv_field, '+', $enclosure, escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/fputcsv_variation8.phpt b/ext/standard/tests/file/fputcsv_variation8.phpt index ed981284f5c34..61aabeebcd7cf 100644 --- a/ext/standard/tests/file/fputcsv_variation8.phpt +++ b/ext/standard/tests/file/fputcsv_variation8.phpt @@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) { $csv_field = $csv_list[2]; // write to a file in csv format - var_dump( fputcsv($file_handle, $csv_field, $delimiter, '+') ); + var_dump( fputcsv($file_handle, $csv_field, $delimiter, '+', escape: "\\") ); // check the file pointer position and eof var_dump( ftell($file_handle) ); var_dump( feof($file_handle) ); diff --git a/ext/standard/tests/file/gh15653.phpt b/ext/standard/tests/file/gh15653.phpt index 2391dee959d42..2511ea0a8d202 100644 --- a/ext/standard/tests/file/gh15653.phpt +++ b/ext/standard/tests/file/gh15653.phpt @@ -7,12 +7,12 @@ touch($filename); $fp = fopen ($filename, "r"); try { - fgetcsv($fp, PHP_INT_MAX); + fgetcsv($fp, PHP_INT_MAX, escape: ''); } catch (\ValueError $e) { echo $e->getMessage() . PHP_EOL; } -fgetcsv($fp, PHP_INT_MAX-1); +fgetcsv($fp, PHP_INT_MAX-1, escape: ''); --CLEAN-- --EXPECT-- array(3) { diff --git a/ext/standard/tests/strings/bug65947.phpt b/ext/standard/tests/strings/bug65947.phpt index 0bd50cf1dc628..1df0e004a7695 100644 --- a/ext/standard/tests/strings/bug65947.phpt +++ b/ext/standard/tests/strings/bug65947.phpt @@ -5,7 +5,7 @@ Bug #65947 (basename is no more working after fgetcsv in certain situation) $filename = 'test.toto'; // é in ISO-8859-1 $csv = base64_decode('6Q=='); -$adata = str_getcsv($csv,";"); +$adata = str_getcsv($csv,";", escape: ''); $b2 = basename($filename); if ($filename != $b2) print "BUG"; diff --git a/ext/standard/tests/strings/gh11982.phpt b/ext/standard/tests/strings/gh11982.phpt index 9b500a63c93cb..e5e45e7e19684 100644 --- a/ext/standard/tests/strings/gh11982.phpt +++ b/ext/standard/tests/strings/gh11982.phpt @@ -2,9 +2,9 @@ GH-11982 (str_getcsv returns null byte for unterminated quoted string) --FILE-- --EXPECT-- array(1) { diff --git a/ext/standard/tests/strings/gh12151.phpt b/ext/standard/tests/strings/gh12151.phpt index dfbe3facde3ee..6a21f205c83fd 100644 --- a/ext/standard/tests/strings/gh12151.phpt +++ b/ext/standard/tests/strings/gh12151.phpt @@ -3,14 +3,13 @@ GH-12151 (str_getcsv ending with escape zero segfualt) --FILE-- ---EXPECTF-- -Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d +--EXPECT-- array ( 0 => '' . "\0" . '', ) -Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array ( 0 => '' . "\0" . '', 1 => '' . "\0" . '', diff --git a/ext/standard/tests/oss_fuzz_57392.phpt b/ext/standard/tests/strings/oss_fuzz_57392.phpt similarity index 94% rename from ext/standard/tests/oss_fuzz_57392.phpt rename to ext/standard/tests/strings/oss_fuzz_57392.phpt index 5a7e5b28d1caa..42e551d651038 100644 --- a/ext/standard/tests/oss_fuzz_57392.phpt +++ b/ext/standard/tests/strings/oss_fuzz_57392.phpt @@ -6,6 +6,7 @@ var_dump(str_getcsv( "aaaaaaaaaaaa\0 ", "\0", "\0", + escape: '', )); ?> --EXPECT-- diff --git a/ext/standard/tests/strings/str_getcsv_001.phpt b/ext/standard/tests/strings/str_getcsv_001.phpt index 795ce042b27be..3c8f36c686e0f 100644 --- a/ext/standard/tests/strings/str_getcsv_001.phpt +++ b/ext/standard/tests/strings/str_getcsv_001.phpt @@ -4,13 +4,13 @@ str_getcsv(): Testing using various arguments @@ -57,8 +57,6 @@ array(2) { string(3) "bar" } ----- - -Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array(3) { [0]=> string(2) "f." @@ -68,8 +66,6 @@ array(3) { string(4) "-|-." } ----- - -Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d array(1) { [0]=> string(7) "foo.bar"