Annotation of 3BSD/cmd/pi/const.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: 
                     14: /*
                     15:  * Const enters the definitions
                     16:  * of the constant declaration
                     17:  * part into the namelist.
                     18:  */
                     19: #ifndef PI1
                     20: constbeg()
                     21: {
                     22: 
                     23:        if (parts & (TPRT|VPRT))
                     24:                error("Constant declarations must precede type and variable declarations");
                     25:        if (parts & CPRT)
                     26:                error("All constants must be declared in one const part");
                     27:        parts |= CPRT;
                     28: }
                     29: #endif
                     30: 
                     31: const(cline, cid, cdecl)
                     32:        int cline;
                     33:        register char *cid;
                     34:        register int *cdecl;
                     35: {
                     36:        register struct nl *np;
                     37: 
                     38: #ifdef PI0
                     39:        send(REVCNST, cline, cid, cdecl);
                     40: #endif
                     41:        line = cline;
                     42:        gconst(cdecl);
                     43:        np = enter(defnl(cid, CONST, con.ctype, con.cival));
                     44: #ifndef PI0
                     45:        np->nl_flags |= NMOD;
                     46: #endif
                     47: #      ifdef PTREE
                     48:            {
                     49:                pPointer        Const = ConstDecl( cid , cdecl );
                     50:                pPointer        *Consts;
                     51: 
                     52:                pSeize( PorFHeader[ nesting ] );
                     53:                Consts = &( pDEF( PorFHeader[ nesting ] ).PorFConsts );
                     54:                *Consts = ListAppend( *Consts , Const );
                     55:                pRelease( PorFHeader[ nesting ] );
                     56:            }
                     57: #      endif
                     58:        if (con.ctype == NIL)
                     59:                return;
                     60:        if ( con.ctype == nl + TSTR )
                     61:                np->ptr[0] = con.cpval;
                     62:        if (isa(con.ctype, "i"))
                     63:                np->range[0] = con.crval;
                     64:        else if (isa(con.ctype, "d"))
                     65:                np->real = con.crval;
                     66: }
                     67: 
                     68: #ifndef PI0
                     69: #ifndef PI1
                     70: constend()
                     71: {
                     72: 
                     73: }
                     74: #endif
                     75: #endif
                     76: 
                     77: /*
                     78:  * Gconst extracts
                     79:  * a constant declaration
                     80:  * from the tree for it.
                     81:  * only types of constants
                     82:  * are integer, reals, strings
                     83:  * and scalars, the first two
                     84:  * being possibly signed.
                     85:  */
                     86: gconst(r)
                     87:        int *r;
                     88: {
                     89:        register struct nl *np;
                     90:        register *cn;
                     91:        char *cp;
                     92:        int negd, sgnd;
                     93:        long ci;
                     94: 
                     95:        con.ctype = NIL;
                     96:        cn = r;
                     97:        negd = sgnd = 0;
                     98: loop:
                     99:        if (cn == NIL || cn[1] == NIL)
                    100:                return (NIL);
                    101:        switch (cn[0]) {
                    102:                default:
                    103:                        panic("gconst");
                    104:                case T_MINUSC:
                    105:                        negd = 1 - negd;
                    106:                case T_PLUSC:
                    107:                        sgnd++;
                    108:                        cn = cn[1];
                    109:                        goto loop;
                    110:                case T_ID:
                    111:                        np = lookup(cn[1]);
                    112:                        if (np == NIL)
                    113:                                return;
                    114:                        if (np->class != CONST) {
                    115:                                derror("%s is a %s, not a constant as required", cn[1], classes[np->class]);
                    116:                                return;
                    117:                        }
                    118:                        con.ctype = np->type;
                    119:                        switch (classify(np->type)) {
                    120:                                case TINT:
                    121:                                        con.crval = np->range[0];
                    122:                                        break;
                    123:                                case TDOUBLE:
                    124:                                        con.crval = np->real;
                    125:                                        break;
                    126:                                case TBOOL:
                    127:                                case TCHAR:
                    128:                                case TSCAL:
                    129:                                        con.cival = np->value[0];
                    130:                                        con.crval = con.cival;
                    131:                                        break;
                    132:                                case TSTR:
                    133:                                        con.cpval = np->ptr[0];
                    134:                                        break;
                    135:                                case NIL:
                    136:                                        con.ctype = NIL;
                    137:                                        return;
                    138:                                default:
                    139:                                        panic("gconst2");
                    140:                        }
                    141:                        break;
                    142:                case T_CBINT:
                    143:                        con.crval = a8tol(cn[1]);
                    144:                        goto restcon;
                    145:                case T_CINT:
                    146:                        con.crval = atof(cn[1]);
                    147:                        if (con.crval > MAXINT || con.crval < MININT) {
                    148:                                derror("Constant too large for this implementation");
                    149:                                con.crval = 0;
                    150:                        }
                    151: restcon:
                    152:                        ci = con.crval;
                    153: #ifndef PI0
                    154:                        if (bytes(ci, ci) <= 2)
                    155:                                con.ctype = nl+T2INT;
                    156:                        else    
                    157: #endif
                    158:                                con.ctype = nl+T4INT;
                    159:                        break;
                    160:                case T_CFINT:
                    161:                        con.ctype = nl+TDOUBLE;
                    162:                        con.crval = atof(cn[1]);
                    163:                        break;
                    164:                case T_CSTRNG:
                    165:                        cp = cn[1];
                    166:                        if (cp[1] == 0) {
                    167:                                con.ctype = nl+T1CHAR;
                    168:                                con.cival = cp[0];
                    169:                                con.crval = con.cival;
                    170:                                break;
                    171:                        }
                    172:                        con.ctype = nl+TSTR;
                    173:                        con.cpval = savestr(cp);
                    174:                        break;
                    175:        }
                    176:        if (sgnd) {
                    177:                if (isnta(con.ctype, "id"))
                    178:                        derror("%s constants cannot be signed", nameof(con.ctype));
                    179:                else {
                    180:                        if (negd)
                    181:                                con.crval = -con.crval;
                    182:                        ci = con.crval;
                    183: #ifndef PI0
                    184:                        if (bytes(ci, ci) <= 2)
                    185:                                con.ctype = nl+T2INT;
                    186: #endif
                    187:                }
                    188:        }
                    189: }
                    190: 
                    191: #ifndef PI0
                    192: isconst(r)
                    193:        register int *r;
                    194: {
                    195: 
                    196:        if (r == NIL)
                    197:                return (1);
                    198:        switch (r[0]) {
                    199:                case T_MINUS:
                    200:                        r[0] = T_MINUSC;
                    201:                        r[1] = r[2];
                    202:                        return (isconst(r[1]));
                    203:                case T_PLUS:
                    204:                        r[0] = T_PLUSC;
                    205:                        r[1] = r[2];
                    206:                        return (isconst(r[1]));
                    207:                case T_VAR:
                    208:                        if (r[3] != NIL)
                    209:                                return (0);
                    210:                        r[0] = T_ID;
                    211:                        r[1] = r[2];
                    212:                        return (1);
                    213:                case T_BINT:
                    214:                        r[0] = T_CBINT;
                    215:                        r[1] = r[2];
                    216:                        return (1);
                    217:                case T_INT:
                    218:                        r[0] = T_CINT;
                    219:                        r[1] = r[2];
                    220:                        return (1);
                    221:                case T_FINT:
                    222:                        r[0] = T_CFINT;
                    223:                        r[1] = r[2];
                    224:                        return (1);
                    225:                case T_STRNG:
                    226:                        r[0] = T_CSTRNG;
                    227:                        r[1] = r[2];
                    228:                        return (1);
                    229:        }
                    230:        return (0);
                    231: }
                    232: #endif

unix.superglobalmegacorp.com

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