|
|
1.1 root 1: # SIZE(2)
2: #
3: # Size of Icon value
4: #
5: # Ralph E. Griswold
6: #
7: # Last modified 8/15/84
8: #
9:
10: global v16, v32, T
11:
12: procedure Size(x,X,Done)
13: local i
14: initial {
15: v16 := table() # 16-bit implementations
16: v32 := table() # 32-bit implementations
17: v16["c"] := 34 # cset size
18: v16["dr"] := 4 # descriptor
19: v16["e"] := 2034 # co-expression
20: v16["f"] := 10 # file
21: v16["l"] := 12 # list
22: v16["le"] := 18 # list element
23: v16["li"] := 6 # long integer
24: v16["p"] := 18 # procedure
25: v16["r"] := 10 # real number
26: v16["s"] := 54 # set
27: v16["se"] := 12 # selement
28: v16["t"] := 60 # table
29: v16["te"] := 16 # table element
30: v16["R"] := 6 # record overhead
31: v32["c"] := 36 # cset size
32: v32["dr"] := 8 # descriptor
33: v32["e"] := 8068 # co-expression
34: v32["f"] := 20 # file
35: v32["l"] := 24 # list
36: v32["le"] := 36 # list element
37: v32["p"] := 36 # procedure
38: v32["r"] := 12 # real number
39: v32["s"] := 296 # set
40: v32["se"] := 24 # set element
41: v32["t"] := 304 # table
42: v32["te"] := 32 # table element
43: v32["R"] := 12 # record overhad
44: }
45: /Done := table()
46: case X of {
47: &null | 32: T := v32
48: 16: T := v16
49: default: stop("invalid second argument to Size")
50: }
51: if match("record ",image(x)) then return rsize(x,X,Done)
52: else return case type(x) of {
53: "co-expression": ifnew(x,T["e"],Done)
54: "cset": ifnew(x,T["c"],Done)
55: "file": ifnew(x,T["f"],Done)
56: "integer": isize(x,X)
57: "list": lsize(x,X,Done)
58: "null": 0
59: "procedure": ifnew(x,T["p"],Done)
60: "real": ifnew(x,T["r"],Done)
61: "set": ssize(x,X,Done)
62: "string": *x
63: "table": tsize(x,X,Done)
64: default: stop("unknown type")
65: }
66: end
67:
68: # size of list
69: #
70: procedure lsize(a,X,Done)
71: local i
72: if \Done[a] then return 0
73: Done[a] := 1
74: i := T["l"]
75: j := *a
76: j <:= 8
77: i := T["le"] + T["l"] + T["dr"] * j
78: every i +:= Size(!a,X,Done)
79: return i
80: end
81:
82: # size of record
83: #
84: procedure rsize(x,X,Done)
85: local i
86: if match("record constructor ",image(x)) then return 0
87: if \Done[x] then return 0
88: Done[x] := 1
89: i := T["R"] + T["dr"] * *x
90: every i+:= Size(!x,X,Done)
91: return i
92: end
93:
94: # size of set
95: #
96: procedure ssize(s,X,Done)
97: local i, a, a1
98: if \Done[s] then return 0
99: Done[s] := 1
100: i := T["s"] + T["se"] * *s
101: a := sort(s)
102: every a1 := !a do
103: i +:= Size(a1,X,Done)
104: return i
105: end
106:
107: # size of table
108: #
109: procedure tsize(t,X,Done)
110: local i, a, a1
111: if \Done[t] then return 0
112: Done[t] := 1
113: i := T["t"] + T["te"] * *t
114: a := sort(t)
115: every a1 := !a do
116: i +:= Size(a1[1],X,Done) + Size(a1[2],X,Done)
117: return i
118: end
119:
120: # test if object already counted in total
121: #
122: procedure ifnew(x,i,Done)
123: if \Done[x] then return 0
124: Done[x] := 1
125: return i
126: end
127:
128: # size of integer
129: #
130: procedure isize(i,X)
131: if T === v32 then return 0
132: if -(2 ^ 15) <= i <= (2 ^ 15 - 1) then return 0
133: else return T["li"]
134: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.