aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--field.c36
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rw-r--r--test/fwtest8.awk2
-rw-r--r--test/fwtest8.in1
-rw-r--r--test/fwtest8.ok2
9 files changed, 49 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 641e56ca..605ae4bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/field.c b/field.c
index de1bae5f..54055adc 100644
--- a/field.c
+++ b/field.c
@@ -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 c402ed60..b2adc511 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