# # 100604.0228: prints ... on unnamed addresses # 100604.0236: handles span # 100604.0244: handles max_span # 100604.0342: added simple mode # 100604.0426: box drawing looks good! # link image, atos, lists, printf, snapshot procedure main(args) max_span := 10 nm_len := *"<99 words>" box_flag := 1 while a := get(args) do { (max_span := integer(a)) | (a == "-s" & simple_flag := 1) (a == "-nb" & box_flag := &null) } txt := "" while txt ||:= read() || "\n" t := table() txt ? { while (tab(upto('&'))) do { ="&" & nm := tab(upto(' =')) & tab(many(' =')) & 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)) if \simple_flag then { every e := !addrs do { write(e[1], ": ", atos(e[2])) } exit() } if \box_flag & &fail then { first_addr := string(addrs[1][1]) last_addr := string(addrs[-1][1]) addr_len := *first_addr comlen := 1 while first_addr[1+:comlen] == last_addr[1+:comlen] do { comlen +:= 1 } every e := !addrs do { write(e[1], ": ", atos(e[2])) } exit() } every nmlist := atos((!addrs)[2]) do nm_len <:= *nmlist #write(2^32) addr_len := *string(addrs[1][1]) addr_space := repl(" ", addr_len) || " " bar := addr_space || "|" || repl("-", nm_len + 2) || "|" while e := get(addrs) do { next_nm_addr := e[1] names := e[2] if \box_flag then { write(bar) write(right(next_nm_addr,addr_len), " | ", center(atos(names),nm_len), " |") } else 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 { if \box_flag then { write(bar) write(cur_addr, " | ", center("...",nm_len), " |") } else printf("%10d: ...\n", cur_addr) cur_addr -:= 4 } } else { write(bar) write(addr_space, center("<"||span||" words>", nm_len+4)) } } } write(bar) end