Annotation of 3BSD/cmd/pi/cset.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: #
                      3: /*
                      4:  * pi - Pascal interpreter code translator
                      5:  *
                      6:  * Charles Haley, Bill Joy UCB
                      7:  * Version 1.2 November 1978
                      8:  */
                      9: 
                     10: #include "whoami"
                     11: #include "0.h"
                     12: #include "tree.h"
                     13: #include "opcode.h"
                     14: 
                     15: /*
                     16:  * Constant set constructor.
                     17:  * settype is the type of the
                     18:  * set if we think that we know it
                     19:  * if not we try our damndest to figure
                     20:  * out what the type should be.
                     21:  */
                     22: struct nl *
                     23: cset(r, settype, x)
                     24:        int *r;
                     25:        struct nl *settype;
                     26:        int x;
                     27: {
                     28:        register *e;
                     29:        register struct nl *t, *exptype;
                     30:        int n, *el;
                     31: 
                     32:        if (settype == NIL) {
                     33:                /*
                     34:                 * So far we have no indication
                     35:                 * of what the set type should be.
                     36:                 * We "look ahead" and try to infer
                     37:                 * The type of the constant set
                     38:                 * by evaluating one of its members.
                     39:                 */
                     40:                e = r[2];
                     41:                if (e == NIL)
                     42:                        return (nl+TSET);       /* tenative for [] */
                     43:                e = e[1];
                     44:                if (e == NIL)
                     45:                        return (NIL);
                     46:                if (e[0] == T_RANG)
                     47:                        e = e[1];
                     48:                codeoff();
                     49:                t = rvalue(e, NIL);
                     50:                codeon();
                     51:                if (t == NIL)
                     52:                        return (NIL);
                     53:                /*
                     54:                 * The type of the set, settype, is
                     55:                 * deemed to be a set of the base type
                     56:                 * of t, which we call exptype.  If,
                     57:                 * however, this would involve a
                     58:                 * "set of integer", we cop out
                     59:                 * and use "intset"'s current scoped
                     60:                 * type instead.
                     61:                 */
                     62:                if (isa(t, "r")) {
                     63:                        error("Sets may not have 'real' elements");
                     64:                        return (NIL);
                     65:                }
                     66:                if (isnta(t, "bcsi")) {
                     67:                        error("Set elements must be scalars, not %ss", nameof(t));
                     68:                        return (NIL);
                     69:                }
                     70:                if (isa(t, "i")) {
                     71:                        settype = lookup(intset);
                     72:                        if (settype == NIL)
                     73:                                panic("intset");
                     74:                        settype = settype->type;
                     75:                        if (settype == NIL)
                     76:                                return (NIL);
                     77:                        if (isnta(settype, "t")) {
                     78:                                error("Set default type \"intset\" is not a set");
                     79:                                return (NIL);
                     80:                        }
                     81:                        exptype = settype->type;
                     82:                } else {
                     83:                        exptype = t->type;
                     84:                        if (exptype == NIL)
                     85:                                return (NIL);
                     86:                        if (exptype->class != RANGE)
                     87:                                exptype = exptype->type;
                     88:                        settype = defnl(0, SET, exptype, 0);
                     89:                }
                     90:        } else {
                     91:                if (settype->class != SET) {
                     92:                        /*
                     93:                         * e.g string context [1,2] = 'abc'
                     94:                         */
                     95:                        error("Constant set involved in non set context");
                     96:                        return (NIL);
                     97:                }
                     98:                exptype = settype->type;
                     99:        }
                    100:        if (x == NIL)
                    101:                put2(O_PUSH, -width(settype));
                    102:        n = 0;
                    103:        for (el=r[2]; el; el=el[2]) {
                    104:                n++;
                    105:                e = el[1];
                    106:                if (e == NIL)
                    107:                        return (NIL);
                    108:                if (e[0] == T_RANG) {
                    109:                        t = rvalue(e[2], NIL);
                    110:                        if (t == NIL) {
                    111:                                rvalue(e[1], NIL);
                    112:                                continue;
                    113:                        }
                    114:                        if (incompat(t, exptype, e[2]))
                    115:                                cerror("Upper bound of element type clashed with set type in constant set");
                    116:                        else
                    117:                                convert(t, nl+T2INT);
                    118:                        t = rvalue(e[1], NIL);
                    119:                        if (t == NIL)
                    120:                                continue;
                    121:                        if (incompat(t, exptype, e[1]))
                    122:                                cerror("Lower bound of element type clashed with set type in constant set");
                    123:                        else
                    124:                                convert(t, nl+T2INT);
                    125:                } else {
                    126:                        t = rvalue((int *) e, NLNIL);
                    127:                        if (t == NIL)
                    128:                                continue;
                    129:                        if (incompat(t, exptype, e))
                    130:                                cerror("Element type clashed with set type in constant set");
                    131:                        else
                    132:                                convert(t, nl+T2INT);
                    133:                        put1(O_SDUP);
                    134:                }
                    135:        }
                    136:        if (x == NIL) {
                    137:                setran(exptype);
                    138:                put(4, O_CTTOT, n, set.lwrb, set.uprbp);
                    139:        } else
                    140:                put2(O_CON2, n);
                    141:        return (settype);
                    142: }

unix.superglobalmegacorp.com

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