moriyoshi Wed Dec 24 16:30:44 2003 EDT Modified files: /php-src/ext/standard file.c Log: - fixes for compatibility. now fgetcsv() treats a null line to be a single null component. Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.370 php-src/ext/standard/file.c:1.371 --- php-src/ext/standard/file.c:1.370 Fri Dec 12 23:07:14 2003 +++ php-src/ext/standard/file.c Wed Dec 24 16:30:43 2003 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.370 2003/12/13 04:07:14 pollita Exp $ */ +/* $Id: file.c,v 1.371 2003/12/24 21:30:43 moriyoshi Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -1710,6 +1710,7 @@ size_t buf_len, temp_len, line_end_len; char *buf; php_stream *stream; + int inc_len; { zval *fd, **len_zv = NULL; @@ -1764,7 +1765,7 @@ } } else { buf = emalloc(len + 1); - if (php_stream_get_line(stream, buf, len, &buf_len) == NULL) { + if (php_stream_get_line(stream, buf, len + 1, &buf_len) == NULL) { efree(buf); RETURN_FALSE; } @@ -1791,8 +1792,7 @@ /* Main loop to read CSV fields */ /* NB this routine will return a single null entry for a blank line */ - for (;;) { - int inc_len; + do { char *comp_end, *hunk_begin; tptr = temp; @@ -1807,7 +1807,7 @@ php_mblen(NULL, 0); break; case 0: - goto quit_loop_0; + goto quit_loop_1; case 1: if (!isspace((int)*(unsigned char *)bptr) || *bptr == delimiter) { goto quit_loop_1; @@ -1818,9 +1818,10 @@ } bptr += inc_len; } + quit_loop_1: /* 2. Read field, leaving bptr pointing at start of next field */ - if (*bptr == enclosure) { + if (inc_len != 0 && *bptr == enclosure) { int state = 0; bptr++; /* move on to first character in field */ @@ -1828,7 +1829,6 @@ /* 2A. handle enclosure delimited field */ for (;;) { - inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0); switch (inc_len) { case 0: switch (state) { @@ -1942,13 +1942,16 @@ } break; } + inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0); } + quit_loop_2: /* look up for a delimiter */ for (;;) { switch (inc_len) { case 0: goto quit_loop_3; + case -2: case -1: inc_len = 1; @@ -1956,6 +1959,7 @@ /* break is omitted intentionally */ case 1: if (*bptr == delimiter) { + bptr += inc_len; goto quit_loop_3; } break; @@ -1965,19 +1969,15 @@ bptr += inc_len; inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0); } + quit_loop_3: comp_end = tptr; - - if (*bptr == delimiter) { - bptr++; - } } else { /* 2B. Handle non-enclosure field */ hunk_begin = bptr; for (;;) { - inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0); switch (inc_len) { case 0: goto quit_loop_4; @@ -1995,6 +1995,7 @@ break; } bptr += inc_len; + inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0); } quit_loop_4: memcpy(tptr, hunk_begin, bptr - hunk_begin); @@ -2009,8 +2010,8 @@ /* 3. Now pass our field back to php */ *comp_end = '\0'; add_next_index_stringl(return_value, temp, comp_end - temp, 1); - } -quit_loop_0: + } while (inc_len > 0); + out: efree(temp); efree(buf);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php