diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | field.c | 36 | ||||
-rw-r--r-- | test/ChangeLog | 5 | ||||
-rw-r--r-- | test/Makefile.am | 5 | ||||
-rw-r--r-- | test/Makefile.in | 10 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/fwtest8.awk | 2 | ||||
-rw-r--r-- | test/fwtest8.in | 1 | ||||
-rw-r--r-- | test/fwtest8.ok | 2 |
9 files changed, 49 insertions, 22 deletions
@@ -1,3 +1,8 @@ +2017-05-23 Andrew J. Schorr <aschorr@telemetry-investments.com> + + * field.c (set_FIELDWIDTHS): Simplify the logic and consistentify + use of UINT_MAX. Make sure that negative value after : is caught. + 2017-05-23 Arnold D. Robbins <arnold@skeeve.com> * field.c (fw_parse_field): Stop upon hitting the end of the @@ -1175,39 +1175,39 @@ set_FIELDWIDTHS() /* * Detect an invalid base-10 integer, a valid value that * is followed by something other than a blank or '\0', - * or a value that is not in the range [1..INT_MAX]. + * or a value that is not in the range [1..UINT_MAX]. */ errno = 0; tmp = strtoul(scan, &end, 10); if (errno == 0 && *end == ':' && (0 < tmp && tmp <= UINT_MAX)) { FIELDWIDTHS->fields[i].skip = tmp; scan = end + 1; - if (*scan == '*') - goto got_star; + if (*scan == '-') { + fatal_error = true; + break; + } // try scanning for field width tmp = strtoul(scan, &end, 10); } else FIELDWIDTHS->fields[i].skip = 0; - if (*scan == '*') { - got_star: - for (scan++; is_blank(*scan); scan++) - continue; - - if (*scan != '\0') - fatal(_("`*' must be the last designator in FIELDWIDTHS")); - - FIELDWIDTHS->fields[i].len = UINT_MAX; - FIELDWIDTHS->nf = i+1; - break; - } - if (errno != 0 || (*end != '\0' && ! is_blank(*end)) - || !(0 < tmp && tmp <= INT_MAX) + || !(0 < tmp && tmp <= UINT_MAX) ) { - fatal_error = true; + if (*scan == '*') { + for (scan++; is_blank(*scan); scan++) + continue; + + if (*scan != '\0') + fatal(_("`*' must be the last designator in FIELDWIDTHS")); + + FIELDWIDTHS->fields[i].len = UINT_MAX; + FIELDWIDTHS->nf = i+1; + } + else + fatal_error = true; break; } FIELDWIDTHS->fields[i].len = tmp; diff --git a/test/ChangeLog b/test/ChangeLog index 4b929c61..aef98225 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,8 +1,9 @@ 2017-05-23 Arnold D. Robbins <arnold@skeeve.com> - * Makefile.am (fwtest5, fwtest6): New tests. + * Makefile.am (fwtest5, fwtest6, fwtest7, fwtest8): New tests. * fwtest5.awk, fwtest5.in, fwtest5.ok, fwtest6.awk, fwtest6.in, - fwtest6.ok, fwtest7.awk, fwtest7.in, fwtest7.ok: New files. + fwtest6.ok, fwtest7.awk, fwtest7.in, fwtest7.ok, fwtest8.awk, + fwtest8.in, fwtest8.ok: New files. 2017-05-20 Arnold D. Robbins <arnold@skeeve.com> diff --git a/test/Makefile.am b/test/Makefile.am index dd5f2369..443580b5 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -402,6 +402,9 @@ EXTRA_DIST = \ fwtest7.awk \ fwtest7.in \ fwtest7.ok \ + fwtest8.awk \ + fwtest8.in \ + fwtest8.ok \ genpot.awk \ genpot.ok \ gensub.awk \ @@ -1242,7 +1245,7 @@ GAWK_EXT_TESTS = \ devfd devfd1 devfd2 dumpvars errno exit \ fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull \ fsfwfs funlen functab1 functab2 functab3 \ - fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 \ + fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 fwtest8 \ genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \ icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase \ incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \ diff --git a/test/Makefile.in b/test/Makefile.in index 9d27170a..e3fe9cbe 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -660,6 +660,9 @@ EXTRA_DIST = \ fwtest7.awk \ fwtest7.in \ fwtest7.ok \ + fwtest8.awk \ + fwtest8.in \ + fwtest8.ok \ genpot.awk \ genpot.ok \ gensub.awk \ @@ -1499,7 +1502,7 @@ GAWK_EXT_TESTS = \ devfd devfd1 devfd2 dumpvars errno exit \ fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull \ fsfwfs funlen functab1 functab2 functab3 \ - fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 \ + fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 fwtest7 fwtest8 \ genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \ icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase \ incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \ @@ -4050,6 +4053,11 @@ fwtest7: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +fwtest8: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + gensub: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/Maketests b/test/Maketests index 20b659ef..f8c54f94 100644 --- a/test/Maketests +++ b/test/Maketests @@ -1207,6 +1207,11 @@ fwtest7: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +fwtest8: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + gensub: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/fwtest8.awk b/test/fwtest8.awk new file mode 100644 index 00000000..27cbff44 --- /dev/null +++ b/test/fwtest8.awk @@ -0,0 +1,2 @@ +BEGIN { FIELDWIDTHS = "2:1 3:-1 4" } +{ print $2 } diff --git a/test/fwtest8.in b/test/fwtest8.in new file mode 100644 index 00000000..b378a015 --- /dev/null +++ b/test/fwtest8.in @@ -0,0 +1 @@ +ssAsssBCCCC diff --git a/test/fwtest8.ok b/test/fwtest8.ok new file mode 100644 index 00000000..8a685a83 --- /dev/null +++ b/test/fwtest8.ok @@ -0,0 +1,2 @@ +gawk: fwtest8.awk:1: fatal: invalid FIELDWIDTHS value, for field 1, near `-1 4' +EXIT CODE: 2 |