|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.