diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2018-08-22 20:40:26 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2018-08-22 20:40:26 +0300 |
commit | 32093f5bbf567525d88566a449a89c72d2845e7e (patch) | |
tree | e318357b7bf5a945f7cf9abd4bb9beb50f6c093a /bugs-fixed | |
parent | ba7569c255707801e91d04387fbcf22465b9181e (diff) | |
download | one-true-awk-32093f5bbf567525d88566a449a89c72d2845e7e.tar.gz |
Fix multiple long-standing bugs, improve test suite.
Diffstat (limited to 'bugs-fixed')
-rw-r--r-- | bugs-fixed/README | 25 | ||||
-rw-r--r-- | bugs-fixed/a-format.awk | 3 | ||||
-rw-r--r-- | bugs-fixed/a-format.bad | 3 | ||||
-rw-r--r-- | bugs-fixed/a-format.ok | 1 | ||||
-rw-r--r-- | bugs-fixed/decr-NF.awk | 11 | ||||
-rw-r--r-- | bugs-fixed/decr-NF.bad | 5 | ||||
-rw-r--r-- | bugs-fixed/decr-NF.ok | 5 | ||||
-rw-r--r-- | bugs-fixed/ofs-rebuild.awk | 17 | ||||
-rw-r--r-- | bugs-fixed/ofs-rebuild.bad | 1 | ||||
-rw-r--r-- | bugs-fixed/ofs-rebuild.ok | 1 | ||||
-rw-r--r-- | bugs-fixed/space.awk | 22 | ||||
-rw-r--r-- | bugs-fixed/space.bad | 16 | ||||
-rw-r--r-- | bugs-fixed/space.ok | 16 | ||||
-rw-r--r-- | bugs-fixed/string-conv.awk | 13 | ||||
-rw-r--r-- | bugs-fixed/string-conv.bad | 4 | ||||
-rw-r--r-- | bugs-fixed/string-conv.ok | 4 | ||||
-rw-r--r-- | bugs-fixed/system-status.awk | 19 | ||||
-rw-r--r-- | bugs-fixed/system-status.bad | 3 | ||||
-rw-r--r-- | bugs-fixed/system-status.ok | 3 | ||||
-rw-r--r-- | bugs-fixed/unary-plus.awk | 4 | ||||
-rw-r--r-- | bugs-fixed/unary-plus.bad | 2 | ||||
-rw-r--r-- | bugs-fixed/unary-plus.ok | 2 |
22 files changed, 180 insertions, 0 deletions
diff --git a/bugs-fixed/README b/bugs-fixed/README new file mode 100644 index 0000000..222ef68 --- /dev/null +++ b/bugs-fixed/README @@ -0,0 +1,25 @@ +List of bugs fixed. + +1. ofs-rebuild: OFS value used to rebuild the record was incorrect. +Fixed August 19, 2014. Revised fix August 2018. + +2. system-status: Instead of a floating-point division by 256, use +the wait(2) macros to create a reasonable exit status. Fixed March 12, 2016. + +3. space: Use provided xisblank() function instead of ispace() for +matching [[:blank:]]. + +4. a-format: Add POSIX standard %a and %A to supported formats. Check +at runtime that this format is available. + +5. decr-NF: Decrementing NF did not change $0. This is a decades-old +bug. There are interactions with the old and new value of OFS as well. +Most of the fix came from the NetBSD awk. + +6. string-conv: String conversions of scalars were sticky. Once a +conversion to string happened, even with OFMT, that value was used until +a new numeric value was assigned, even if OFMT differed from CONVFMT, +and also if CONVFMT changed. + +7. unary-plus: Unary plus on a string constant returned the string. +Instead, it should convert the value to numeric and give that value. diff --git a/bugs-fixed/a-format.awk b/bugs-fixed/a-format.awk new file mode 100644 index 0000000..5b7929e --- /dev/null +++ b/bugs-fixed/a-format.awk @@ -0,0 +1,3 @@ +BEGIN { + printf("%a\n", 42) +} diff --git a/bugs-fixed/a-format.bad b/bugs-fixed/a-format.bad new file mode 100644 index 0000000..1281825 --- /dev/null +++ b/bugs-fixed/a-format.bad @@ -0,0 +1,3 @@ +nawk: weird printf conversion %a + source line number 2 +%a42 diff --git a/bugs-fixed/a-format.ok b/bugs-fixed/a-format.ok new file mode 100644 index 0000000..e421e2d --- /dev/null +++ b/bugs-fixed/a-format.ok @@ -0,0 +1 @@ +0x1.5p+5 diff --git a/bugs-fixed/decr-NF.awk b/bugs-fixed/decr-NF.awk new file mode 100644 index 0000000..7474991 --- /dev/null +++ b/bugs-fixed/decr-NF.awk @@ -0,0 +1,11 @@ +BEGIN { + $0 = "a b c d e f" + print NF + OFS = ":" + NF-- + print $0 + print NF + NF++ + print $0 + print NF +} diff --git a/bugs-fixed/decr-NF.bad b/bugs-fixed/decr-NF.bad new file mode 100644 index 0000000..b634e06 --- /dev/null +++ b/bugs-fixed/decr-NF.bad @@ -0,0 +1,5 @@ +6 +a b c d e f +5 +a b c d e f +6 diff --git a/bugs-fixed/decr-NF.ok b/bugs-fixed/decr-NF.ok new file mode 100644 index 0000000..3359cf2 --- /dev/null +++ b/bugs-fixed/decr-NF.ok @@ -0,0 +1,5 @@ +6 +a:b:c:d:e +5 +a:b:c:d:e: +6 diff --git a/bugs-fixed/ofs-rebuild.awk b/bugs-fixed/ofs-rebuild.awk new file mode 100644 index 0000000..dd27000 --- /dev/null +++ b/bugs-fixed/ofs-rebuild.awk @@ -0,0 +1,17 @@ +# The bug here is that nawk should use the value of OFS that +# was current when $0 became invalid to rebuild the record. + +BEGIN { + OFS = ":" + $0 = "a b c d e f g" + $3 = "3333" + # Conceptually, $0 should now be "a:b:3333:d:e:f:g" + + # Change OFS after (conceptually) rebuilding the record + OFS = "<>" + + # Unmodifed nawk prints "a<>b<>3333<>d<>e<>f<>g" because + # it delays rebuilding $0 until it's needed, and then it uses + # the current value of OFS. Oops. + print +} diff --git a/bugs-fixed/ofs-rebuild.bad b/bugs-fixed/ofs-rebuild.bad new file mode 100644 index 0000000..7570811 --- /dev/null +++ b/bugs-fixed/ofs-rebuild.bad @@ -0,0 +1 @@ +a<>b<>3333<>d<>e<>f<>g diff --git a/bugs-fixed/ofs-rebuild.ok b/bugs-fixed/ofs-rebuild.ok new file mode 100644 index 0000000..2689218 --- /dev/null +++ b/bugs-fixed/ofs-rebuild.ok @@ -0,0 +1 @@ +a:b:3333:d:e:f:g diff --git a/bugs-fixed/space.awk b/bugs-fixed/space.awk new file mode 100644 index 0000000..6aa87d2 --- /dev/null +++ b/bugs-fixed/space.awk @@ -0,0 +1,22 @@ +BEGIN { + c[" "] = "\" \"" + c["\a"] = "\\a" + c["\b"] = "\\b" + c["\f"] = "\\f" + c["\n"] = "\\n" + c["\r"] = "\\r" + c["\t"] = "\\t" + c["\v"] = "\\v" + + sort = "LC_ALL=C sort" + + for (i in c) + printf("%s %s [[:space:]]\n", c[i], + i ~ /[[:space:]]/ ? "~" : "!~") | sort + + for (i in c) + printf("%s %s [[:blank:]]\n", c[i], + i ~ /[[:blank:]]/ ? "~" : "!~") | sort + + close(sort) +} diff --git a/bugs-fixed/space.bad b/bugs-fixed/space.bad new file mode 100644 index 0000000..f92055f --- /dev/null +++ b/bugs-fixed/space.bad @@ -0,0 +1,16 @@ +" " ~ [[:blank:]] +" " ~ [[:space:]] +\a !~ [[:blank:]] +\a !~ [[:space:]] +\b !~ [[:blank:]] +\b !~ [[:space:]] +\f ~ [[:blank:]] +\f ~ [[:space:]] +\n ~ [[:blank:]] +\n ~ [[:space:]] +\r ~ [[:blank:]] +\r ~ [[:space:]] +\t ~ [[:blank:]] +\t ~ [[:space:]] +\v ~ [[:blank:]] +\v ~ [[:space:]] diff --git a/bugs-fixed/space.ok b/bugs-fixed/space.ok new file mode 100644 index 0000000..4278c5c --- /dev/null +++ b/bugs-fixed/space.ok @@ -0,0 +1,16 @@ +" " ~ [[:blank:]] +" " ~ [[:space:]] +\a !~ [[:blank:]] +\a !~ [[:space:]] +\b !~ [[:blank:]] +\b !~ [[:space:]] +\f !~ [[:blank:]] +\f ~ [[:space:]] +\n !~ [[:blank:]] +\n ~ [[:space:]] +\r !~ [[:blank:]] +\r ~ [[:space:]] +\t ~ [[:blank:]] +\t ~ [[:space:]] +\v !~ [[:blank:]] +\v ~ [[:space:]] diff --git a/bugs-fixed/string-conv.awk b/bugs-fixed/string-conv.awk new file mode 100644 index 0000000..a1f04ab --- /dev/null +++ b/bugs-fixed/string-conv.awk @@ -0,0 +1,13 @@ +BEGIN { + OFMT = ">>%.6g<<" + a = 12.1234 + print "a =", a + b = a "" + print "1 ->", b + CONVFMT = "%2.2f" + b = a "" + print "2 ->", b + CONVFMT = "%.12g" + b = a "" + print "3 ->", b +} diff --git a/bugs-fixed/string-conv.bad b/bugs-fixed/string-conv.bad new file mode 100644 index 0000000..2ab95e8 --- /dev/null +++ b/bugs-fixed/string-conv.bad @@ -0,0 +1,4 @@ +a = >>12.1234<< +1 -> >>12.1234<< +2 -> >>12.1234<< +3 -> >>12.1234<< diff --git a/bugs-fixed/string-conv.ok b/bugs-fixed/string-conv.ok new file mode 100644 index 0000000..7c09711 --- /dev/null +++ b/bugs-fixed/string-conv.ok @@ -0,0 +1,4 @@ +a = >>12.1234<< +1 -> 12.1234 +2 -> 12.12 +3 -> 12.1234 diff --git a/bugs-fixed/system-status.awk b/bugs-fixed/system-status.awk new file mode 100644 index 0000000..8daf563 --- /dev/null +++ b/bugs-fixed/system-status.awk @@ -0,0 +1,19 @@ +# Unmodified nawk prints the 16 bit exit status divided by 256, but +# does so using floating point arithmetic, yielding strange results. +# +# The fix is to use the various macros defined for wait(2) and to +# use the signal number + 256 for death by signal, or signal number + 512 +# for death by signal with core dump. + +BEGIN { + status = system("exit 42") + print "normal status", status + + status = system("kill -HUP $$") + print "death by signal status", status + + status = system("kill -ABRT $$") + print "death by signal with core dump status", status + + system("rm -f core*") +} diff --git a/bugs-fixed/system-status.bad b/bugs-fixed/system-status.bad new file mode 100644 index 0000000..a1317db --- /dev/null +++ b/bugs-fixed/system-status.bad @@ -0,0 +1,3 @@ +normal status 42 +death by signal status 0.00390625 +death by signal with core dump status 0.523438 diff --git a/bugs-fixed/system-status.ok b/bugs-fixed/system-status.ok new file mode 100644 index 0000000..737828f --- /dev/null +++ b/bugs-fixed/system-status.ok @@ -0,0 +1,3 @@ +normal status 42 +death by signal status 257 +death by signal with core dump status 518 diff --git a/bugs-fixed/unary-plus.awk b/bugs-fixed/unary-plus.awk new file mode 100644 index 0000000..ba6185b --- /dev/null +++ b/bugs-fixed/unary-plus.awk @@ -0,0 +1,4 @@ +BEGIN { + print +"q" + print +"43.12345678912345678" +} diff --git a/bugs-fixed/unary-plus.bad b/bugs-fixed/unary-plus.bad new file mode 100644 index 0000000..76f57d5 --- /dev/null +++ b/bugs-fixed/unary-plus.bad @@ -0,0 +1,2 @@ +q +43.12345678912345678 diff --git a/bugs-fixed/unary-plus.ok b/bugs-fixed/unary-plus.ok new file mode 100644 index 0000000..90f97af --- /dev/null +++ b/bugs-fixed/unary-plus.ok @@ -0,0 +1,2 @@ +0 +43.1235 |