Annotation of 43BSD/contrib/icon/src/cmd/loadmap.icn, revision 1.1

1.1     ! root        1: #      LOADMAP(1)
        !             2: #
        !             3: #      Produce load map of object file
        !             4: #
        !             5: #      Stephen B. Wampler
        !             6: #
        !             7: #      Last modified 7/10/83
        !             8: #
        !             9: 
        !            10: record entry(name,address)
        !            11: 
        !            12: procedure main(args)
        !            13:    local maptype, arg, file, nm, ldmap, tname, line, text, data, bss
        !            14:    local SPACE, COLON, DIGITS, HEXDIGITS, usize, address, name
        !            15:    initial {
        !            16:       if *args = 0 then stop("usage: loadmap -tdbuac file")
        !            17:       SPACE := '\t '
        !            18:       COLON := ':'
        !            19:       DIGITS := '0123456789'
        !            20:       HEXDIGITS := DIGITS ++ 'abcdef'
        !            21:       ldmap := table(6)
        !            22:       ldmap["u"] := []
        !            23:       ldmap["d"] := []
        !            24:       ldmap["a"] := []
        !            25:       ldmap["b"] := []
        !            26:       ldmap["t"] := []
        !            27:       ldmap["c"] := []
        !            28:       tname := table(6)
        !            29:       tname["u"] := "Undefined symbols"
        !            30:       tname["a"] := "Absolute locations"
        !            31:       tname["t"] := "Text segment symbols"
        !            32:       tname["d"] := "Data segment symbols"
        !            33:       tname["b"] := "BSS segment symbols"
        !            34:       tname["c"] := "Common symbols"
        !            35:       }
        !            36:    maptype := ""
        !            37:    every arg := !args do
        !            38:       if arg[1] ~== "-" then file := arg
        !            39:       else if arg[1] == "-" then maptype ||:= (!"tdbuac" == arg[2:0]) |
        !            40:          stop("usage:  loadmap -tdbuac file")
        !            41:    maptype := if *maptype = 0 then "t" else string(cset(maptype))
        !            42:    write("\n",file,"\n")
        !            43:    usize := open("size " || file,"rp") | stop("loadmap: cannot execute size")
        !            44:    !usize ? {
        !            45:       writes("Text space: ",right(text := tab(many(DIGITS)),6),"   ")
        !            46:       move(1)
        !            47:       writes("Initialized Data: ",right(data := tab(many(DIGITS)),6),"   ")
        !            48:       move(1)
        !            49:       write("Uninitialized Data: ",right(bss := tab(many(DIGITS)),6))
        !            50:       }
        !            51:    close(usize)
        !            52:    nm := open("nm -gno " || file,"rp") | stop("loadmap: cannot execute nm")
        !            53:    every line := !nm do
        !            54:       line ? {
        !            55:          tab(upto(COLON)) & move(1)
        !            56:          address := integer("16r" || tab(many(HEXDIGITS))) | "????"
        !            57:          tab(many(SPACE))
        !            58:          type := map(move(1))
        !            59:          tab(many(SPACE))
        !            60:          name := tab(0)
        !            61:          if find(type,maptype) then put(ldmap[type],entry(name,address))
        !            62:          }
        !            63:    every type := !maptype do {
        !            64:       if *ldmap[type] > 0 then {
        !            65:          write("\n\n\n")
        !            66:          write(tname[type],":")
        !            67:          write()
        !            68:          show(ldmap[type],(type == "t" & text) |
        !            69:             (type == "d" & data) | (type == "b" & bss) | &null,
        !            70:             ldmap[type][1].address)
        !            71:          }
        !            72:       }
        !            73: end
        !            74: 
        !            75: procedure show(l,ssize,base)
        !            76:    local i1, i2, nrows
        !            77:    static ncols
        !            78:    initial ncols := 3
        !            79:    write(repl(repl(" ",3) || left("name",9) || right("addr",7) ||
        !            80:       right("size",6),ncols))
        !            81:    write()
        !            82:    nrows := (*l + (ncols - 1)) / ncols
        !            83:    every i1 := 1 to nrows do {
        !            84:       every i2 := i1 to *l by nrows do
        !            85:          writes(repl(" ",3),left(l[i2].name,9),right(l[i2].address,7),
        !            86:             right(area(l[i2 + 1].address,l[i2].address) |
        !            87:             if /ssize then "rem" else base + ssize - l[i2].address,6))
        !            88:          write()
        !            89:          }
        !            90:    return
        !            91: end
        !            92: 
        !            93: procedure area(high,low)
        !            94:    if integer(low) & integer(high) then return high - low
        !            95:    else return "????"
        !            96: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.