summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHartmut Holzgraefe <hholzgra@php.net>2000-12-14 14:18:36 +0000
committerHartmut Holzgraefe <hholzgra@php.net>2000-12-14 14:18:36 +0000
commit9b1b25354813cc981497388714158e2246a021dd (patch)
treeb6d3cc1a3a949f99679f44e395e3cdef05e31aa9
parent9967b2e1491df3b02ae5b480ca33ab6d4e1df358 (diff)
downloadphp-git-9b1b25354813cc981497388714158e2246a021dd.tar.gz
fgetcsv() will now work correct with empty fields in tab delimited files
# fix for bug #8258 and regression test
-rw-r--r--ext/standard/file.c10
-rw-r--r--ext/standard/tests/general_functions/004.data4
-rw-r--r--ext/standard/tests/general_functions/004.phpt17
3 files changed, 26 insertions, 5 deletions
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--
+<?php
+$fp=fopen("004.data","r");
+while($a=fgetcsv($fp,100,"\t")) {
+ echo join(",",$a)."\n";
+}
+fclose($fp);
+?>
+--EXPECT--
+name,value,comment
+true,1,boolean true
+false,0,boolean false
+empty,,nothing