Annotation of 42BSD/ucb/pascal/src/fdec.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: 
        !             3: static char sccsid[] = "@(#)fdec.c 1.23 2/28/83";
        !             4: 
        !             5: #include "whoami.h"
        !             6: #include "0.h"
        !             7: #include "tree.h"
        !             8: #include "opcode.h"
        !             9: #include "objfmt.h"
        !            10: #include "align.h"
        !            11: #include "tmps.h"
        !            12: 
        !            13: /*
        !            14:  * this array keeps the pxp counters associated with
        !            15:  * functions and procedures, so that they can be output
        !            16:  * when their bodies are encountered
        !            17:  */
        !            18: int    bodycnts[ DSPLYSZ ];
        !            19: 
        !            20: #ifdef PC
        !            21: #   include "pc.h"
        !            22: #   include "pcops.h"
        !            23: #endif PC
        !            24: 
        !            25: #ifdef OBJ
        !            26: int    cntpatch;
        !            27: int    nfppatch;
        !            28: #endif OBJ
        !            29: 
        !            30: funcfwd(fp)
        !            31:        struct nl *fp;
        !            32: {
        !            33: 
        !            34:            /*
        !            35:             *  save the counter for this function
        !            36:             */
        !            37:        if ( monflg ) {
        !            38:            fp -> value[ NL_CNTR ] = bodycnts[ cbn ];
        !            39:        }
        !            40:        return (fp);
        !            41: }
        !            42: 
        !            43: /*
        !            44:  * Funcext marks the procedure or
        !            45:  * function external in the symbol
        !            46:  * table. Funcext should only be
        !            47:  * called if PC, and is an error
        !            48:  * otherwise.
        !            49:  */
        !            50: 
        !            51: funcext(fp)
        !            52:        struct nl *fp;
        !            53: {
        !            54: 
        !            55: #ifdef OBJ
        !            56:        error("Procedures or functions cannot be declared external.");
        !            57: #endif OBJ
        !            58: 
        !            59: #ifdef PC
        !            60:            /*
        !            61:             *  save the counter for this function
        !            62:             */
        !            63:        if ( monflg ) {
        !            64:            fp -> value[ NL_CNTR ] = bodycnts[ cbn ];
        !            65:        }
        !            66:        if (opt('s')) {
        !            67:                standard();
        !            68:                error("External procedures and functions are not standard");
        !            69:        } else {
        !            70:                if (cbn == 1) {
        !            71:                        fp->extra_flags |= NEXTERN;
        !            72:                        stabefunc( fp -> symbol , fp -> class , line );
        !            73:                }
        !            74:                else
        !            75:                        error("External procedures and functions can only be declared at the outermost level.");
        !            76:        }
        !            77: #endif PC
        !            78: 
        !            79:        return(fp);
        !            80: }
        !            81: 
        !            82: /*
        !            83:  * Funcbody is called
        !            84:  * when the actual (resolved)
        !            85:  * declaration of a procedure is
        !            86:  * encountered. It puts the names
        !            87:  * of the (function) and parameters
        !            88:  * into the symbol table.
        !            89:  */
        !            90: funcbody(fp)
        !            91:        struct nl *fp;
        !            92: {
        !            93:        register struct nl *q, *p;
        !            94: 
        !            95:        cbn++;
        !            96:        if (cbn >= DSPLYSZ) {
        !            97:                error("Too many levels of function/procedure nesting");
        !            98:                pexit(ERRS);
        !            99:        }
        !           100:        tmpinit(cbn);
        !           101:        gotos[cbn] = NIL;
        !           102:        errcnt[cbn] = syneflg;
        !           103:        parts[ cbn ] = NIL;
        !           104:        dfiles[ cbn ] = FALSE;
        !           105:        if (fp == NIL)
        !           106:                return (NIL);
        !           107:        /*
        !           108:         * Save the virtual name
        !           109:         * list stack pointer so
        !           110:         * the space can be freed
        !           111:         * later (funcend).
        !           112:         */
        !           113:        fp->ptr[2] = nlp;
        !           114:        if (fp->class != PROG) {
        !           115:                for (q = fp->chain; q != NIL; q = q->chain) {
        !           116:                        enter(q);
        !           117: #                      ifdef PC
        !           118:                            q -> extra_flags |= NPARAM;
        !           119: #                      endif PC
        !           120:                }
        !           121:        }
        !           122:        if (fp->class == FUNC) {
        !           123:                /*
        !           124:                 * For functions, enter the fvar
        !           125:                 */
        !           126:                enter(fp->ptr[NL_FVAR]);
        !           127: #              ifdef PC
        !           128:                    q = fp -> ptr[ NL_FVAR ];
        !           129:                    if (q -> type != NIL ) {
        !           130:                        sizes[cbn].curtmps.om_off = q -> value[NL_OFFS];
        !           131:                        sizes[cbn].om_max = q -> value[NL_OFFS];
        !           132:                    }
        !           133: #              endif PC
        !           134:        }
        !           135: #      ifdef PTREE
        !           136:                /*
        !           137:                 *      pick up the pointer to porf declaration
        !           138:                 */
        !           139:            PorFHeader[ ++nesting ] = fp -> inTree;
        !           140: #      endif PTREE
        !           141:        return (fp);
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * Segend is called to check for
        !           146:  * unresolved variables, funcs and
        !           147:  * procs, and deliver unresolved and
        !           148:  * baduse error diagnostics at the
        !           149:  * end of a routine segment (a separately
        !           150:  * compiled segment that is not the 
        !           151:  * main program) for PC. This
        !           152:  * routine should only be called
        !           153:  * by PC (not standard).
        !           154:  */
        !           155:  segend()
        !           156:  {
        !           157:        register struct nl *p;
        !           158:        register int i,b;
        !           159:        char *cp;
        !           160: 
        !           161: #ifdef PC
        !           162:        if ( monflg ) {
        !           163:            error("Only the module containing the \"program\" statement");
        !           164:            cerror("can be profiled with ``pxp''.\n");
        !           165:        }
        !           166:        if (opt('s')) {
        !           167:                standard();
        !           168:                error("Separately compiled routine segments are not standard.");
        !           169:        } else {
        !           170:                b = cbn;
        !           171:                for (i=0; i<077; i++) {
        !           172:                        for (p = disptab[i]; p != NIL && (p->nl_block & 037) == b; p = p->nl_next) {
        !           173:                        switch (p->class) {
        !           174:                                case BADUSE:
        !           175:                                        cp = 's';
        !           176:                                        if (p->chain->ud_next == NIL)
        !           177:                                                cp++;
        !           178:                                        eholdnl();
        !           179:                                        if (p->value[NL_KINDS] & ISUNDEF)
        !           180:                                                nerror("%s undefined on line%s", p->symbol, cp);
        !           181:                                        else
        !           182:                                                nerror("%s improperly used on line%s", p->symbol, cp);
        !           183:                                        pnumcnt = 10;
        !           184:                                        pnums(p->chain);
        !           185:                                        pchr('\n');
        !           186:                                        break;
        !           187:                                
        !           188:                                case FUNC:
        !           189:                                case PROC:
        !           190:                                        if ((p->nl_flags & NFORWD) &&
        !           191:                                            ((p->extra_flags & NEXTERN) == 0))
        !           192:                                                nerror("Unresolved forward declaration of %s %s", classes[p->class], p->symbol);
        !           193:                                        break;
        !           194: 
        !           195:                                case FVAR:
        !           196:                                        if (((p->nl_flags & NMOD) == 0) &&
        !           197:                                            ((p->chain->extra_flags & NEXTERN) == 0))
        !           198:                                                nerror("No assignment to the function variable");
        !           199:                                        break;
        !           200:                            }
        !           201:                           }
        !           202:                           disptab[i] = p;
        !           203:                    }
        !           204:        }
        !           205: #endif PC
        !           206: #ifdef OBJ
        !           207:        error("Missing program statement and program body");
        !           208: #endif OBJ
        !           209: 
        !           210: }
        !           211: 
        !           212: 
        !           213: /*
        !           214:  * Level1 does level one processing for
        !           215:  * separately compiled routine segments
        !           216:  */
        !           217: level1()
        !           218: {
        !           219: 
        !           220: #      ifdef OBJ
        !           221:            error("Missing program statement");
        !           222: #      endif OBJ
        !           223: #      ifdef PC
        !           224:            if (opt('s')) {
        !           225:                    standard();
        !           226:                    error("Missing program statement");
        !           227:            }
        !           228: #      endif PC
        !           229: 
        !           230:        cbn++;
        !           231:        tmpinit(cbn);
        !           232:        gotos[cbn] = NIL;
        !           233:        errcnt[cbn] = syneflg;
        !           234:        parts[ cbn ] = NIL;
        !           235:        dfiles[ cbn ] = FALSE;
        !           236:        progseen = TRUE;
        !           237: }
        !           238: 
        !           239: 
        !           240: 
        !           241: pnums(p)
        !           242:        struct udinfo *p;
        !           243: {
        !           244: 
        !           245:        if (p->ud_next != NIL)
        !           246:                pnums(p->ud_next);
        !           247:        if (pnumcnt == 0) {
        !           248:                printf("\n\t");
        !           249:                pnumcnt = 20;
        !           250:        }
        !           251:        pnumcnt--;
        !           252:        printf(" %d", p->ud_line);
        !           253: }
        !           254: 
        !           255: nerror(a1, a2, a3)
        !           256: {
        !           257: 
        !           258:        if (Fp != NIL) {
        !           259:                yySsync();
        !           260: #ifndef PI1
        !           261:                if (opt('l'))
        !           262:                        yyoutline();
        !           263: #endif
        !           264:                yysetfile(filename);
        !           265:                printf("In %s %s:\n", classes[Fp->class], Fp->symbol);
        !           266:                Fp = NIL;
        !           267:                elineoff();
        !           268:        }
        !           269:        error(a1, a2, a3);
        !           270: }

unix.superglobalmegacorp.com

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