Annotation of 43BSD/contrib/icon/src/lib/size.icn, revision 1.1

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

unix.superglobalmegacorp.com

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