From 9b1b25354813cc981497388714158e2246a021dd Mon Sep 17 00:00:00 2001 From: Hartmut Holzgraefe Date: Thu, 14 Dec 2000 14:18:36 +0000 Subject: [PATCH] fgetcsv() will now work correct with empty fields in tab delimited files # fix for bug #8258 and regression test --- ext/standard/file.c | 10 +++++----- ext/standard/tests/general_functions/004.data | 4 ++++ ext/standard/tests/general_functions/004.phpt | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 ext/standard/tests/general_functions/004.data create mode 100644 ext/standard/tests/general_functions/004.phpt diff --git a/ext/standard/file.c b/ext/standard/file.c index 854bdeb083..f9fb41f10c 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1741,7 +1741,7 @@ PHP_FUNCTION(fread) } /* }}} */ -/* {{{ proto array fgetcsv(int fp, int length) +/* {{{ proto array fgetcsv(int fp, int length [, string delimiter]) Get line from file pointer and parse for CSV fields */ PHP_FUNCTION(fgetcsv) { @@ -1813,7 +1813,7 @@ PHP_FUNCTION(fgetcsv) { lineEnd = emalloc(sizeof(char) * (len + 1)); bptr = buf; tptr = buf + strlen(buf) -1; - while ( isspace((int)*tptr) && (tptr > bptr) ) tptr--; + while ( isspace((int)*tptr) && (*tptr!=delimiter) && (tptr > bptr) ) tptr--; tptr++; strcpy(lineEnd, tptr); @@ -1839,7 +1839,7 @@ PHP_FUNCTION(fgetcsv) { do { /* 1. Strip any leading space */ - while(isspace((int)*bptr)) bptr++; + while(isspace((int)*bptr) && (*bptr!=delimiter)) bptr++; /* 2. Read field, leaving bptr pointing at start of next field */ if (*bptr == '"') { /* 2A. handle quote delimited field */ @@ -1874,7 +1874,7 @@ PHP_FUNCTION(fgetcsv) { } bptr = buf; tptr = buf + strlen(buf) -1; - while ( isspace((int)*tptr) && (tptr > bptr) ) tptr--; + while ( isspace((int)*tptr) && (*tptr!=delimiter) && (tptr > bptr) ) tptr--; tptr++; strcpy(lineEnd, tptr); *tptr++ = ' '; *tptr = 0; @@ -1889,7 +1889,7 @@ PHP_FUNCTION(fgetcsv) { *tptr=0; /* terminate temporary string */ if (strlen(temp)) { tptr--; - while (isspace((int)*tptr)) *tptr-- = 0; /* strip any trailing spaces */ + while (isspace((int)*tptr) && (*tptr!=delimiter)) *tptr-- = 0; /* strip any trailing spaces */ } if (*bptr == delimiter) bptr++; } diff --git a/ext/standard/tests/general_functions/004.data b/ext/standard/tests/general_functions/004.data new file mode 100644 index 0000000000..5dd0832842 --- /dev/null +++ b/ext/standard/tests/general_functions/004.data @@ -0,0 +1,4 @@ +name value comment +true 1 boolean true +false 0 boolean false +empty nothing diff --git a/ext/standard/tests/general_functions/004.phpt b/ext/standard/tests/general_functions/004.phpt new file mode 100644 index 0000000000..0566502ab5 --- /dev/null +++ b/ext/standard/tests/general_functions/004.phpt @@ -0,0 +1,17 @@ +--TEST-- +fgetcsv() with tab delimited fields (BUG #8258) +--POST-- +--GET-- +--FILE-- + +--EXPECT-- +name,value,comment +true,1,boolean true +false,0,boolean false +empty,,nothing -- 2.40.0