summaryrefslogtreecommitdiff
path: root/field.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2022-08-30 21:01:55 +0300
committerArnold D. Robbins <arnold@skeeve.com>2022-08-30 21:01:55 +0300
commit2571e2d55f4871bad41e4237e47442631cb2ebe0 (patch)
treea73c6e7760811a87536a9b3f359e321da42db8ce /field.c
parent1ee8627c7bb42dad235c66e62050bf61f59cbb6e (diff)
downloadgawk-2571e2d55f4871bad41e4237e47442631cb2ebe0.tar.gz
Grow field buffer for CSV parsing.
Diffstat (limited to 'field.c')
-rw-r--r--field.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/field.c b/field.c
index 755a3fd4..be9f1fb0 100644
--- a/field.c
+++ b/field.c
@@ -813,6 +813,15 @@ comma_parse_field(long up_to, /* parse only up to this field number */
while (*scan != comma && scan < end) {
if (*scan == '"') {
for (scan++; scan < end;) {
+ // grow buffer if needed
+ if (new_end >= newfield + buflen) {
+ size_t offset = buflen;
+
+ buflen *= 2;
+ erealloc(newfield, char *, buflen, "comma_parse_field");
+ new_end = newfield + offset;
+ }
+
if (*scan == '"' && scan[1] == '"') { // "" -> "
*new_end++ = '"';
scan += 2;
@@ -821,7 +830,6 @@ comma_parse_field(long up_to, /* parse only up to this field number */
scan++;
break;
} else {
- // grow buffer if needed
*new_end++ = *scan++;
}
}
@@ -829,6 +837,13 @@ comma_parse_field(long up_to, /* parse only up to this field number */
// unquoted field
while (*scan != comma && scan < end) {
// grow buffer if needed
+ if (new_end >= newfield + buflen) {
+ size_t offset = buflen;
+
+ buflen *= 2;
+ erealloc(newfield, char *, buflen, "comma_parse_field");
+ new_end = newfield + offset;
+ }
*new_end++ = *scan++;
}
}