Annotation of 43BSD/contrib/icon/src/lib/image.icn, revision 1.1.1.1

1.1       root        1: #      IMAGE(2)
                      2: #
                      3: #      Generalized image of Icon object
                      4: #
                      5: #      Ralph E. Griswold
                      6: #
                      7: #      Last modified 5/11/83
                      8: #
                      9: 
                     10: procedure Image(x,done)
                     11:    /done := table()
                     12:    if match("record ",image(x)) then return rimage(x,done)
                     13:    else return case type(x) of {
                     14:       "list":  limage(x,done)
                     15:       "table": timage(x,done)
                     16:       default: image(x)
                     17:       }
                     18: end
                     19: 
                     20: #  list image
                     21: #
                     22: procedure limage(a,done)
                     23:    static i
                     24:    local s, tag
                     25:    initial i := 0
                     26:    if \done[a] then return done[a]
                     27:    done[a] := tag := "L" || (i +:= 1)
                     28:    if *a = 0 then s := tag || ":[]" else {
                     29:       s := tag || ":["
                     30:       every s ||:= Image(!a,done) || ","
                     31:       s[-1] := "]"
                     32:       }
                     33:    return s
                     34: end
                     35: 
                     36: #  record image
                     37: #
                     38: procedure rimage(x,done)
                     39:    static i
                     40:    local s, tag
                     41:    initial i := 0
                     42:    s := image(x)
                     43:                                        #  might be record constructor
                     44:    if match("record constructor ",s) then return s
                     45:    if \done[x] then return done[x]
                     46:    done[x] := tag := "R" || (i +:= 1)
                     47:    s ?:=  (="record " & (":" || (tab(upto('(') + 1))))
                     48:    if *x = 0 then s := tag || s || ")" else {
                     49:       s := tag || s
                     50:       every s ||:= Image(!x,done) || ","
                     51:       s[-1] := ")"
                     52:       }
                     53:    return s
                     54: end
                     55: 
                     56: #  table image
                     57: #
                     58: procedure timage(t,done)
                     59:    static i
                     60:    local s, tag, a, a1
                     61:    initial i := 0
                     62:    if \done[t] then return done[t]
                     63:    done[t] := tag := "T" || (i +:= 1)
                     64:    if *t = 0 then s := tag || ":[]" else {
                     65:       a := sort(t)
                     66:       s := tag || ":["
                     67:       every a1 := !a do
                     68:          s ||:= Image(a1[1],done) || "->" || Image(a1[2],done) || ","
                     69:       s[-1] := "]"
                     70:       }
                     71:    return s
                     72: end
                     73: 
                     74: global indent
                     75: 
                     76: procedure Imagex(x,done)
                     77:    initial indent := ""
                     78:    /done := table()
                     79:    if match("record ",image(x)) then return indent || rimagex(x,done)
                     80:    else return case type(x) of {
                     81:       "list":  indent || limagex(x,done)
                     82:       "table": indent || timagex(x,done)
                     83:       default: indent || image(x)
                     84:       }
                     85: end
                     86: 
                     87: #  list image
                     88: #
                     89: procedure limagex(a,done)
                     90:    static i
                     91:    local s, tag
                     92:    initial i := 0
                     93:    if \done[a] then return done[a]
                     94:    done[a] := tag := "L" || (i +:= 1)
                     95:    if *a = 0 then s := tag || ":[]" else {
                     96:       indent ||:= "   "
                     97:       s := tag || ":["
                     98:       every s ||:= "\n" || Image(!a,done)
                     99:       }
                    100:    s ||:= "\n" || indent || "]"
                    101:    indent := indent[1:-3]
                    102:    return s
                    103: end
                    104: 
                    105: #  record image
                    106: #
                    107: procedure rimagex(x,done)
                    108:    static i
                    109:    local s, tag
                    110:    initial i := 0
                    111:    s := image(x)
                    112:                                        #  might be record constructor
                    113:    if match("record constructor ",s) then return s
                    114:    if \done[x] then return done[x]
                    115:    done[x] := tag := "R" || (i +:= 1)
                    116:    s ?:=  (="record " & (":" || (tab(upto('(') + 1))))
                    117:    if *x = 0 then s := tag || s || ")" else {
                    118:       indent ||:= "   "
                    119:       s := tag || s
                    120:       every s ||:= "\n" || Image(!x,done)
                    121:       }
                    122:    s ||:= "\n" || indent || ")"
                    123:    indent := indent[1:-3]
                    124:    return s
                    125: end
                    126: 
                    127: #  table image
                    128: #
                    129: procedure timagex(t,done)
                    130:    static i
                    131:    local s, tag, a, a1
                    132:    initial i := 0
                    133:    if \done[t] then return done[t]
                    134:    done[t] := tag := "T" || (i +:= 1)
                    135:    if *t = 0 then s := tag || ":{}" else {
                    136:       indent ||:= "   "
                    137:       a := sort(t)
                    138:       s := tag || ":{"
                    139:       every a1 := !a do
                    140:          s ||:= "\n" || Image(a1[1],done) || "\n" || indent || "---" ||
                    141:             "\n" || Image(a1[2],done) || "\n" || indent || "------"
                    142:       }
                    143:    s ||:= "\n" || indent || "]"
                    144:    indent := indent[1:-3]
                    145:    return s
                    146: end

unix.superglobalmegacorp.com

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