Annotation of 3BSD/cmd/pi/const.c, revision 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.