]> granicus.if.org Git - php/commitdiff
Fixed bug #53848 (fgetcsv() ignores spaces at beginnings of fields).
authorIlia Alshanetsky <iliaa@php.net>
Sun, 29 May 2011 10:23:06 +0000 (10:23 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Sun, 29 May 2011 10:23:06 +0000 (10:23 +0000)
NEWS
ext/standard/file.c
ext/standard/tests/file/bug53848.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index f2327d8671f9f030f75632a58e2588db6e19a44a..c75b039e0d58bc6015b5ea940803c55510485861 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -44,6 +44,7 @@ PHP                                                                        NEWS
   . Fixed bug #54866 (incorrect accounting for realpath_cache_size) (Dustin Ward)
   . Fixed bug #54721 (Different Hashes on Windows, BSD and Linux on wrong Salt size) 
     (Pierre, os at irj dot ru)
+  . Fixed bug #53848 (fgetcsv() ignores spaces at beginnings of fields). (Ilia)
   . Fixed bug #50363 (Invalid parsing in convert.quoted-printable-decode filter).
     (slusarz at curecanti dot org)
   . Fixed bug #48465 (sys_get_temp_dir() possibly inconsistent when using 
index c17af315c4d574b559973173a13de2ec85c04482..8fa933096a688287ca66a0429a36e9125b535c63 100644 (file)
@@ -2196,30 +2196,17 @@ PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, char
                char *comp_end, *hunk_begin;
 
                tptr = temp;
-
-               /* 1. Strip any leading space */
-               for (;;) {
-                       inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
-                       switch (inc_len) {
-                               case -2:
-                               case -1:
-                                       inc_len = 1;
-                                       php_mblen(NULL, 0);
-                                       break;
-                               case 0:
-                                       goto quit_loop_1;
-                               case 1:
-                                       if (!isspace((int)*(unsigned char *)bptr) || *bptr == delimiter) {
-                                               goto quit_loop_1;
-                                       }
-                                       break;
-                               default:
-                                       goto quit_loop_1;
+               inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
+               if (inc_len == 1) {
+                       char *tmp = bptr;
+                       while (isspace((int)*(unsigned char *)tmp)) {
+                               tmp++;
+                       }
+                       if (*tmp == enclosure) {
+                               bptr = tmp;
                        }
-                       bptr += inc_len;
                }
 
-       quit_loop_1:
                if (first_field && bptr == line_end) {
                        add_next_index_null(return_value);
                        break;
diff --git a/ext/standard/tests/file/bug53848.phpt b/ext/standard/tests/file/bug53848.phpt
new file mode 100644 (file)
index 0000000..016d59d
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #53848 (fgetcsv removes leading spaces from fields)
+--FILE--
+<?php
+$file = dirname(__FILE__) . "/bug39538.csv";
+@unlink($file);
+file_put_contents($file, "a,b\n  c,  d");
+$fp = fopen($file, "r");
+while ($l = fgetcsv($fp)) var_dump($l);
+fclose($fp);
+@unlink($file);
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  string(1) "a"
+  [1]=>
+  string(1) "b"
+}
+array(2) {
+  [0]=>
+  string(3) "  c"
+  [1]=>
+  string(3) "  d"
+}