]> granicus.if.org Git - php/commitdiff
fgetcsv() will now work correct with empty fields in tab delimited files
authorHartmut Holzgraefe <hholzgra@php.net>
Thu, 14 Dec 2000 14:18:36 +0000 (14:18 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Thu, 14 Dec 2000 14:18:36 +0000 (14:18 +0000)
# fix for bug #8258 and regression test

ext/standard/file.c
ext/standard/tests/general_functions/004.data [new file with mode: 0644]
ext/standard/tests/general_functions/004.phpt [new file with mode: 0644]

index 854bdeb083b503670a9fcbd4b5c6832d1190b9aa..f9fb41f10cea17e65d130ad9f1594e28f5f70250 100644 (file)
@@ -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 (file)
index 0000000..5dd0832
--- /dev/null
@@ -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 (file)
index 0000000..0566502
--- /dev/null
@@ -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