From: Nick Bowler Date: Sun, 3 Dec 2023 05:21:49 +0000 (-0500) Subject: Avoid local array parameters in awk scripts. X-Git-Url: http://git.draconx.ca/gitweb/dxcommon.git/commitdiff_plain/da99716d86d4870be554d8412b41a751583da661 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. --- 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