diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | field.c | 25 | ||||
-rw-r--r-- | test/ChangeLog | 5 | ||||
-rw-r--r-- | test/Makefile.am | 7 | ||||
-rw-r--r-- | test/Makefile.in | 12 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/fpat8.awk | 10 | ||||
-rw-r--r-- | test/fpat8.in | 1 | ||||
-rw-r--r-- | test/fpat8.ok | 2 |
9 files changed, 65 insertions, 11 deletions
@@ -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 @@ -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 |