# # 100604.0228: prints ... on unnamed addresses # 100604.0236: handles span # 100604.0244: handles max_span # link image, atos, lists, printf procedure main(args) max_span := integer(args[1]) | 10 txt := "" while txt ||:= read() t := table() txt ? { while (tab(upto('&'))) do { ="&" & nm := tab(upto(' ')) & =" = " & addr := integer(tab(many(&digits))) if \t[nm] then { every nm <- nm || "(" || seq() || ")" do if /t[nm] then break } t[nm] := addr } } by_addr := table([]) every e := !sort(t) do by_addr[e[2]] |||:= [e[1]] write(Image(by_addr)) addrs := lreverse(sort(by_addr)) every e := !addrs do { write(e[1], ": ", atos(e[2])) } write("---") write(2^32) while e := get(addrs) do { next_nm_addr := e[1] names := e[2] printf("%10d: %s\n", next_nm_addr, atos(names)) cur_addr := next_nm_addr - 4 if cur_addr ~= addrs[1][1] then { span := (cur_addr - addrs[1][1]) / 4 #write("span: ", span) if span <= max_span then { every 1 to span do { printf("%10d: ...\n", cur_addr) cur_addr -:= 4 } } else { printf("...<%d words>...\n", span) } } } end