aboutsummaryrefslogtreecommitdiffstats
path: root/helpers/fixdump.awk
diff options
context:
space:
mode:
authorJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-06-01 18:12:23 +0200
committerJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-06-01 18:12:23 +0200
commit37be8a17ee9e955dec8bbddb8cd2b31487e44a0c (patch)
treeaf9323636c991634144ddb5532d975f08ac56282 /helpers/fixdump.awk
parent1a4fe61b7ad390740a0c70a0175b82301c083704 (diff)
parent5482bf19246965d6839fe9df1aec0785f0b1a329 (diff)
downloadegawk-37be8a17ee9e955dec8bbddb8cd2b31487e44a0c.tar.gz
egawk-37be8a17ee9e955dec8bbddb8cd2b31487e44a0c.tar.bz2
egawk-37be8a17ee9e955dec8bbddb8cd2b31487e44a0c.zip
Merge remote-tracking branch 'origin/master' into cmake
Diffstat (limited to 'helpers/fixdump.awk')
-rw-r--r--helpers/fixdump.awk69
1 files changed, 69 insertions, 0 deletions
diff --git a/helpers/fixdump.awk b/helpers/fixdump.awk
new file mode 100644
index 00000000..b03f03f7
--- /dev/null
+++ b/helpers/fixdump.awk
@@ -0,0 +1,69 @@
+#! /usr/bin/gawk -f
+
+BEGIN {
+ address_re = "0x[[:xdigit:]]+"
+ bracketed_address = "\\[(([[:space:]]*[[:digit:]]*:)?|[[:alpha:]_]+ = )0x[[:xdigit:]]+\\]"
+}
+
+{
+ line[NR] = $0
+ extract_addresses($0, NR)
+}
+
+END {
+ for (i = 1; i <= NR; i++) {
+ if (line[i] !~ address_re) {
+ print line[i]
+ continue
+ }
+
+ translate(line[i])
+ }
+}
+
+# Global arrays
+#
+# Address[line] --- Address of instruction - first hex number
+# Target[address] = 1 --- Address is target of a jump
+# Newaddr[address] --- Replacement address, counting from 1
+
+function extract_addresses(line, num, data, i, n, seps, addr)
+{
+ if (line !~ address_re)
+ return
+
+ split(line, data, bracketed_address, seps)
+ n = length(seps)
+
+ for (i = 1; i <= n; i++) {
+ addr = gensub(".*(" address_re ").*", "\\1", 1, seps[i])
+ if (i == 1)
+ Address[num] = addr
+ else {
+ Target[addr]++
+ if (! (addr in Newaddr))
+ Newaddr[addr] = new_address()
+ }
+ }
+}
+
+function new_address()
+{
+ return sprintf("%8d", ++Address_seed)
+}
+
+function translate(line, n, data, seps, i, newline)
+{
+ split(line, data, address_re, seps)
+ n = length(seps)
+ newline = line
+ for (i = 1; i <= n; i++) {
+ if (! (seps[i] in Target)) {
+ gsub(seps[i], " ", newline)
+ continue
+ }
+ gsub(seps[i], Newaddr[seps[i]], newline)
+ }
+
+ print newline
+}