|
|
BSD 4.3
# SIZE(2)
#
# Size of Icon value
#
# Ralph E. Griswold
#
# Last modified 8/15/84
#
global v16, v32, T
procedure Size(x,X,Done)
local i
initial {
v16 := table() # 16-bit implementations
v32 := table() # 32-bit implementations
v16["c"] := 34 # cset size
v16["dr"] := 4 # descriptor
v16["e"] := 2034 # co-expression
v16["f"] := 10 # file
v16["l"] := 12 # list
v16["le"] := 18 # list element
v16["li"] := 6 # long integer
v16["p"] := 18 # procedure
v16["r"] := 10 # real number
v16["s"] := 54 # set
v16["se"] := 12 # selement
v16["t"] := 60 # table
v16["te"] := 16 # table element
v16["R"] := 6 # record overhead
v32["c"] := 36 # cset size
v32["dr"] := 8 # descriptor
v32["e"] := 8068 # co-expression
v32["f"] := 20 # file
v32["l"] := 24 # list
v32["le"] := 36 # list element
v32["p"] := 36 # procedure
v32["r"] := 12 # real number
v32["s"] := 296 # set
v32["se"] := 24 # set element
v32["t"] := 304 # table
v32["te"] := 32 # table element
v32["R"] := 12 # record overhad
}
/Done := table()
case X of {
&null | 32: T := v32
16: T := v16
default: stop("invalid second argument to Size")
}
if match("record ",image(x)) then return rsize(x,X,Done)
else return case type(x) of {
"co-expression": ifnew(x,T["e"],Done)
"cset": ifnew(x,T["c"],Done)
"file": ifnew(x,T["f"],Done)
"integer": isize(x,X)
"list": lsize(x,X,Done)
"null": 0
"procedure": ifnew(x,T["p"],Done)
"real": ifnew(x,T["r"],Done)
"set": ssize(x,X,Done)
"string": *x
"table": tsize(x,X,Done)
default: stop("unknown type")
}
end
# size of list
#
procedure lsize(a,X,Done)
local i
if \Done[a] then return 0
Done[a] := 1
i := T["l"]
j := *a
j <:= 8
i := T["le"] + T["l"] + T["dr"] * j
every i +:= Size(!a,X,Done)
return i
end
# size of record
#
procedure rsize(x,X,Done)
local i
if match("record constructor ",image(x)) then return 0
if \Done[x] then return 0
Done[x] := 1
i := T["R"] + T["dr"] * *x
every i+:= Size(!x,X,Done)
return i
end
# size of set
#
procedure ssize(s,X,Done)
local i, a, a1
if \Done[s] then return 0
Done[s] := 1
i := T["s"] + T["se"] * *s
a := sort(s)
every a1 := !a do
i +:= Size(a1,X,Done)
return i
end
# size of table
#
procedure tsize(t,X,Done)
local i, a, a1
if \Done[t] then return 0
Done[t] := 1
i := T["t"] + T["te"] * *t
a := sort(t)
every a1 := !a do
i +:= Size(a1[1],X,Done) + Size(a1[2],X,Done)
return i
end
# test if object already counted in total
#
procedure ifnew(x,i,Done)
if \Done[x] then return 0
Done[x] := 1
return i
end
# size of integer
#
procedure isize(i,X)
if T === v32 then return 0
if -(2 ^ 15) <= i <= (2 ^ 15 - 1) then return 0
else return T["li"]
end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.