summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2020-04-10 14:39:28 +0300
committerArnold D. Robbins <arnold@skeeve.com>2020-04-10 14:39:28 +0300
commitdf52ba3de4c18482e2d6f81b94f3e9cd6c83aa7a (patch)
tree30da4e206c019fd64814d5efa9f93351c5728950
parent6e69b1c42ef002c41a5807f5886f78767881bfca (diff)
downloadgawk-df52ba3de4c18482e2d6f81b94f3e9cd6c83aa7a.tar.gz
Bug fix for FPAT field parsing.
-rw-r--r--ChangeLog9
-rw-r--r--field.c25
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am7
-rw-r--r--test/Makefile.in12
-rw-r--r--test/Maketests5
-rw-r--r--test/fpat8.awk10
-rw-r--r--test/fpat8.in1
-rw-r--r--test/fpat8.ok2
9 files changed, 65 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 15d6e246..cfe98b64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2020-04-10 Arnold D. Robbins <arnold@skeeve.com>
+
+ * field.c (save_FPAT): New global variable.
+ (get_field): Check if using FPAT or not in order to pass in
+ the right variables to parse_field function. Fixes bug in
+ delayed field parsing when using FPAT. Thanks to
+ luciole75w <luciole75w@gmail.com> for the bug report.
+ (set_FPAT): Use global save_FPAT instead of local save_fpat.
+
2020-04-02 Arnold D. Robbins <arnold@skeeve.com>
* field.c (re_parse_field): If default parsing and trailing
diff --git a/field.c b/field.c
index 80495862..45ab9f5f 100644
--- a/field.c
+++ b/field.c
@@ -74,6 +74,9 @@ static bool resave_fs;
static NODE *save_FS; /* save current value of FS when line is read,
* to be used in deferred parsing
*/
+static NODE *save_FPAT; /* save current value of FPAT when line is read,
+ * to be used in deferred parsing
+ */
static awk_fieldwidth_info_t *FIELDWIDTHS = NULL;
NODE **fields_arr; /* array of pointers to the field nodes */
@@ -842,6 +845,8 @@ get_field(long requested, Func_ptr *assign)
bool in_middle = false;
static bool warned = false;
extern int currule;
+ NODE *saved_fs;
+ Regexp *fs_regexp;
if (do_lint && currule == END && ! warned) {
warned = true;
@@ -857,10 +862,17 @@ get_field(long requested, Func_ptr *assign)
/* first, parse remainder of input record */
if (NF == -1) {
in_middle = (parse_high_water != 0);
+ if (current_field_sep() == Using_FPAT) {
+ saved_fs = save_FPAT;
+ fs_regexp = FPAT_regexp;
+ } else {
+ saved_fs = save_FS;
+ fs_regexp = FS_regexp;
+ }
NF = (*parse_field)(UNLIMITED - 1, &parse_extent,
fields_arr[0]->stlen -
(parse_extent - fields_arr[0]->stptr),
- save_FS, FS_regexp, set_field,
+ saved_fs, fs_regexp, set_field,
(NODE *) NULL,
(NODE *) NULL,
in_middle);
@@ -1424,7 +1436,6 @@ void
set_FPAT()
{
static bool warned = false;
- static NODE *save_fpat = NULL;
bool remake_re = true;
NODE *fpat;
@@ -1447,9 +1458,9 @@ set_FPAT()
* This comparison can't use cmp_nodes(), which pays attention
* to IGNORECASE, and that's not what we want.
*/
- if (save_fpat
- && FPAT_node->var_value->stlen == save_fpat->stlen
- && memcmp(FPAT_node->var_value->stptr, save_fpat->stptr, save_fpat->stlen) == 0) {
+ if (save_FPAT
+ && FPAT_node->var_value->stlen == save_FPAT->stlen
+ && memcmp(FPAT_node->var_value->stptr, save_FPAT->stptr, save_FPAT->stlen) == 0) {
if (FPAT_regexp != NULL)
FPAT_regexp = (IGNORECASE ? FPAT_re_no_case : FPAT_re_yes_case);
@@ -1462,8 +1473,8 @@ set_FPAT()
}
}
- unref(save_fpat);
- save_fpat = dupnode(FPAT_node->var_value);
+ unref(save_FPAT);
+ save_FPAT = dupnode(FPAT_node->var_value);
refree(FPAT_re_yes_case);
refree(FPAT_re_no_case);
FPAT_re_yes_case = FPAT_re_no_case = FPAT_regexp = NULL;
diff --git a/test/ChangeLog b/test/ChangeLog
index de6e4427..cd7ba9a7 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-10 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRA_DIST): New test, fpat8.
+ * fpat8.awk, fpat8.in, fpat8.ok: New files.
+
2020-04-02 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (EXTRA_DIST): New test, rsnulw.
diff --git a/test/Makefile.am b/test/Makefile.am
index 1465c70d..c2ad113c 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -369,6 +369,9 @@ EXTRA_DIST = \
fpat7.awk \
fpat7.in \
fpat7.ok \
+ fpat8.awk \
+ fpat8.in \
+ fpat8.ok \
fpatnull.awk \
fpatnull.in \
fpatnull.ok \
@@ -1385,8 +1388,8 @@ GAWK_EXT_TESTS = \
clos1way6 crlf \
dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
- errno exit \
- fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpat7 fpatnull \
+ errno exit fieldwdth forcenum \
+ fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpat7 fpat8 fpatnull \
fsfwfs funlen functab1 functab2 functab3 \
fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 fwtest8 \
genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \
diff --git a/test/Makefile.in b/test/Makefile.in
index c7a39cb2..67051084 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -630,6 +630,9 @@ EXTRA_DIST = \
fpat7.awk \
fpat7.in \
fpat7.ok \
+ fpat8.awk \
+ fpat8.in \
+ fpat8.ok \
fpatnull.awk \
fpatnull.in \
fpatnull.ok \
@@ -1646,8 +1649,8 @@ GAWK_EXT_TESTS = \
clos1way6 crlf \
dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
- errno exit \
- fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpat7 fpatnull \
+ errno exit fieldwdth forcenum \
+ fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpat7 fpat8 fpatnull \
fsfwfs funlen functab1 functab2 functab3 \
fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 fwtest8 \
genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \
@@ -4289,6 +4292,11 @@ fpat7:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+fpat8:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
fpatnull:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 01934096..6982870d 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1426,6 +1426,11 @@ fpat7:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+fpat8:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
fpatnull:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/fpat8.awk b/test/fpat8.awk
new file mode 100644
index 00000000..9c41591b
--- /dev/null
+++ b/test/fpat8.awk
@@ -0,0 +1,10 @@
+BEGIN {
+ RS = ""
+ FPAT = "\\w+"
+}
+
+{
+ print
+ $2 = "-"
+ print
+}
diff --git a/test/fpat8.in b/test/fpat8.in
new file mode 100644
index 00000000..8e13e468
--- /dev/null
+++ b/test/fpat8.in
@@ -0,0 +1 @@
+a b c d
diff --git a/test/fpat8.ok b/test/fpat8.ok
new file mode 100644
index 00000000..0e13f5b4
--- /dev/null
+++ b/test/fpat8.ok
@@ -0,0 +1,2 @@
+a b c d
+a - c d