Annotation of 43BSDReno/pgrm/pascal/src/const.c, revision 1.1

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

unix.superglobalmegacorp.com

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