Apologies for my previous attempt at submitting the patch for file.c. Here is the new patch file.
Basically it adds a fourth optional parameter to fgetcsv which means you can specify the enclosure character (currently assumes a double quote). This is only my first attempt at contributing code to the PHP project, so please be gentle with me! ;) Thanks Dean
? file.c.patch
Index: file.c
===================================================================
RCS file: /repository/php4/ext/standard/file.c,v
retrieving revision 1.229
diff -u -r1.229 file.c
--- file.c 12 May 2002 15:59:42 -0000 1.229
+++ file.c 22 May 2002 10:08:38 -0000
@@ -1930,10 +1930,11 @@
{
char *temp, *tptr, *bptr, *lineEnd;
char delimiter = ','; /* allow this to be set as parameter */
+ char enclosure = '"'; /* allow this to be set as parameter */
/* first section exactly as php_fgetss */
- zval **fd, **bytes, **p_delim;
+ zval **fd, **bytes, **p_delim, **p_enclosure;
int len, type;
char *buf;
php_stream *stream;
@@ -1958,6 +1959,28 @@
delimiter = Z_STRVAL_PP(p_delim)[0];
break;
+ case 4:
+ if (zend_get_parameters_ex(4, &fd, &bytes, &p_delim, &p_enclosure) ==
+FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string_ex(p_delim);
+ /* Make sure that there is at least one character in string */
+ if (Z_STRLEN_PP(p_delim) < 1) {
+ WRONG_PARAM_COUNT;
+ }
+ /* use first character from string */
+ delimiter = Z_STRVAL_PP(p_delim)[0];
+
+ convert_to_string_ex(p_enclosure);
+ /* Make sure that there is at least one character in string */
+ if (Z_STRLEN_PP(p_enclosure) < 1) {
+ WRONG_PARAM_COUNT;
+ }
+ /* use first character from string */
+ enclosure = Z_STRVAL_PP(p_enclosure)[0];
+
+ break;
+
default:
WRONG_PARAM_COUNT;
/* NOTREACHED */
@@ -1983,9 +2006,9 @@
RETURN_FALSE;
}
- /* Now into new section that parses buf for comma/quote delimited fields */
+ /* Now into new section that parses buf for delimiter/enclosure fields */
- /* Strip trailing space from buf, saving end of line in case required for
quoted field */
+ /* Strip trailing space from buf, saving end of line in case required for
+enclosure field */
lineEnd = emalloc(len + 1);
bptr = buf;
@@ -2013,14 +2036,14 @@
/* 1. Strip any leading space */
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 */
+ if (*bptr == enclosure) {
+ /* 2A. handle enclosure delimited field */
bptr++; /* move on to first character in field */
while (*bptr) {
- if (*bptr == '"') {
- /* handle the double-quote */
+ if (*bptr == enclosure) {
+ /* handle the enclosure */
if ( *(bptr+1) == '"') {
- /* embedded double quotes */
+ /* embedded enclosure */
*tptr++ = *bptr; bptr +=2;
} else {
/* must be end of string - skip to start of
next field or end */
@@ -2064,7 +2087,7 @@
}
}
} else {
- /* 2B. Handle non-quoted field */
+ /* 2B. Handle non-enclosure field */
while ((*bptr != delimiter) && *bptr)
*tptr++ = *bptr++;
*tptr=0; /* terminate temporary string */
msg38330/pgp00000.pgp
Description: PGP signature
