From da99716d86d4870be554d8412b41a751583da661 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sun, 3 Dec 2023 00:21:49 -0500 Subject: [PATCH] Avoid local array parameters in awk scripts. ULTRIX 4.5 nawk appears to not support local array parameters on user- defined functions (it is OK for array arguments passed by the caller). Things seems to work on the first call but on the second call the array is not empty and other weird behaviours occur. Using a global array instead seems OK and avoids the problem. --- scripts/gen-options.awk | 36 ++++++++++++++++++++---------------- scripts/gen-strtab.awk | 15 +++++++++------ scripts/gen-tree.awk | 15 +++++++++------ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/scripts/gen-options.awk b/scripts/gen-options.awk index c6d361c..f2cdfe7 100755 --- a/scripts/gen-options.awk +++ b/scripts/gen-options.awk @@ -458,25 +458,28 @@ function output_packed_macros(i, tmp, accum, max, totalbits) # placing them into dst[0] ... dst[n]. # # Returns the number of elements. -function bucketsort(dst, src, buckets, max, count, i, t) +function bucketsort(dst, src, max, count, i, t) { + # Note: ULTRIX 4.5 nawk does not support local array parameters + split("", bucketsort_buckets); + for (t in src) { i = length(src[t]) if (i > max) { max = i } - buckets[i]++ + bucketsort_buckets[i]++ } for (i = max; i > 0; i--) { - if (i in buckets) { - t = buckets[i] - buckets[i] = count + if (i in bucketsort_buckets) { + t = bucketsort_buckets[i] + bucketsort_buckets[i] = count count += t } } for (t in src) { i = length(t = src[t]) - dst[buckets[i]++] = t + dst[bucketsort_buckets[i]++] = t } return count @@ -505,15 +508,16 @@ function to_enum(lopt) # For optimal results, strings should be added in descending length order. function add_to_strtab(strtab, str, offsets, pos) { - if ( (pos = index(strtab, str " ") - 1) < 0) { - pos = length(strtab) - if (pos) { - strtab = strtab " " str - pos++ - } else { - strtab = strtab str - } + if ( (pos = index(strtab, str " ") - 1) < 0) { + pos = length(strtab) + if (pos) { + strtab = strtab " " str + pos++ + } else { + strtab = strtab str } - offsets[str] = pos - return strtab + } + + offsets[str] = pos + return strtab } diff --git a/scripts/gen-strtab.awk b/scripts/gen-strtab.awk index c5b02c6..6ec06be 100755 --- a/scripts/gen-strtab.awk +++ b/scripts/gen-strtab.awk @@ -246,25 +246,28 @@ function real_length(s, t) # placing them into dst[0] ... dst[n]. # # Returns the number of elements. -function bucketsort(dst, src, buckets, max, count, i, t) +function bucketsort(dst, src, max, count, i, t) { + # Note: ULTRIX 4.5 nawk does not support local array parameters + split("", bucketsort_buckets); + for (t in src) { i = length(src[t]) if (i > max) { max = i } - buckets[i]++ + bucketsort_buckets[i]++ } for (i = max; i > 0; i--) { - if (i in buckets) { - t = buckets[i] - buckets[i] = count + if (i in bucketsort_buckets) { + t = bucketsort_buckets[i] + bucketsort_buckets[i] = count count += t } } for (t in src) { i = length(t = src[t]) - dst[buckets[i]++] = t + dst[bucketsort_buckets[i]++] = t } return count diff --git a/scripts/gen-tree.awk b/scripts/gen-tree.awk index 55a7d5c..413f156 100755 --- a/scripts/gen-tree.awk +++ b/scripts/gen-tree.awk @@ -250,25 +250,28 @@ function format_items(s, i) # placing them into dst[0] ... dst[n]. # # Returns the number of elements. -function bucketsort(dst, src, buckets, max, count, i, t) +function bucketsort(dst, src, max, count, i, t) { + # Note: ULTRIX 4.5 nawk does not support local array parameters + split("", bucketsort_buckets); + for (t in src) { i = length(src[t]) if (i > max) { max = i } - buckets[i]++ + bucketsort_buckets[i]++ } for (i = max; i > 0; i--) { - if (i in buckets) { - t = buckets[i] - buckets[i] = count + if (i in bucketsort_buckets) { + t = bucketsort_buckets[i] + bucketsort_buckets[i] = count count += t } } for (t in src) { i = length(t = src[t]) - dst[buckets[i]++] = t + dst[bucketsort_buckets[i]++] = t } return count -- 2.43.2