Annotation of 41BSD/cmd/pi/const.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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