diff options
Diffstat (limited to 'test/splitarg4.awk')
-rw-r--r-- | test/splitarg4.awk | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/test/splitarg4.awk b/test/splitarg4.awk new file mode 100644 index 00000000..4187460b --- /dev/null +++ b/test/splitarg4.awk @@ -0,0 +1,138 @@ +BEGIN { + split("c: ::ab+", fs_arr, ":") +} +{ + for (i = 1; i in fs_arr; ++i) { + split($0, a, fs_arr[i], seps) + print zipcat(a, seps) + dump_array(seps) + } +} +END { + seps[1] = "123"; seps[5] = 10 + for (i = 1; i in fs_arr; ++i) { + split("", a, fs_arr[i], seps) + dump_array(seps) + } +} +function dump_array(a, i, mini, maxi) +{ + mini = minidx(a) + 0 + maxi = maxidx(a) + 0 + printf "{" + for (i = mini; i <= maxi; ++i) + if (i in a) { + if (i > mini) + printf ", " + printf "%d => \"%s\"", i, a[i] + } + printf "}\n" +} +function zipcat(a, b, c) +{ + zip(a, b, c) + return cat(c) +} + +function cat(a, mini, maxi, i, s) +{ + mini = minidx(a) + 0 + maxi = maxidx(a) + 0 + for (i = mini; i <= maxi; ++i) + if (i in a) + s = s a[i] + return s +} + +function zip(a, b, c, mini, maxi, i) +{ + del(c) + mini = minidx2(a, b) + 0 + maxi = maxidx2(a, b) + 0 + for (i = mini; i <= maxi; ++i) { + if (i in a) + c[i] = a[i] + if (i in b) + c[i] = c[i] b[i] + } +} + +function maxidx2(a, b) +{ + if (emptyarr(a)) + return maxidx(b) + else if (emptyarr(b)) + return maxidx(a) + else + return max(maxidx(a), maxidx(b)) +} + +function minidx2(a, b) +{ + if (emptyarr(a)) + return minidx(b) + else if (emptyarr(b)) + return minidx(a) + else + return min(minidx(a), minidx(b)) +} + +function maxidx(a, i, m) +{ + if (emptyarr(a)) + m = "" + else { + m = choose(a) + 0 + for (i in a) { + i += 0 + if (i > m) + m = i + } + } + return m +} + +function minidx(a, i, m) +{ + if (emptyarr(a)) + m = "" + else { + m = choose(a) + 0 + for (i in a) { + i += 0 + if (i < m) + m = i + } + } + return m +} + +function choose(a, m) +{ + for (m in a) + return m + return "" +} + +function emptyarr(a, k) +{ + for (k in a) + return 0 + return 1 +} + +# portable delete +function del(a) +{ + split("", a) +} + +function max(x, y) +{ + return x > y ? x : y +} + +function min(x, y) +{ + return x < y ? x : y +} |