diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2022-08-30 21:01:55 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2022-08-30 21:01:55 +0300 |
commit | 2571e2d55f4871bad41e4237e47442631cb2ebe0 (patch) | |
tree | a73c6e7760811a87536a9b3f359e321da42db8ce /field.c | |
parent | 1ee8627c7bb42dad235c66e62050bf61f59cbb6e (diff) | |
download | gawk-2571e2d55f4871bad41e4237e47442631cb2ebe0.tar.gz |
Grow field buffer for CSV parsing.
Diffstat (limited to 'field.c')
-rw-r--r-- | field.c | 17 |
1 files changed, 16 insertions, 1 deletions
@@ -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++; } } |