Annotation of coherent/b/bin/c/n2/getfun.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * The routines in this file handle
                      3:  * the reading in of functions. The internal data
                      4:  * structures are built and threaded together.
                      5:  */
                      6: #ifdef   vax
                      7: #include "INC$LIB:cc2.h"
                      8: #else
                      9: #include "cc2.h"
                     10: #endif
                     11: 
                     12: /*
                     13:  * Read in a function.
                     14:  * Pack it into the internal data structure.
                     15:  * Copy non shared stuff straight through to save
                     16:  * both space and time. Switch tables are in the
                     17:  * shared data, so this works w.r.t. label reference
                     18:  * counts. The PROLOG item has been already read.
                     19:  */
                     20: getfunc()
                     21: {
                     22:        register INS    *ip;
                     23: 
                     24:        ins.i_fp = &ins;
                     25:        ins.i_bp = &ins;
                     26:        for (;;) {
                     27:                ip = getins();
                     28:                if (dotseg<0 || isshared(dotseg)==0
                     29:                || (ip->i_type==ENTER && isshared(ip->i_seg)==0)) {
                     30:                        genins(ip);
                     31:                        free((char *) ip);
                     32:                        continue;
                     33:                }
                     34:                ip->i_fp = &ins;
                     35:                ip->i_bp = ins.i_bp;
                     36:                ins.i_bp->i_fp = ip;
                     37:                ins.i_bp = ip;
                     38:                if (ip->i_type == EPILOG)
                     39:                        break;
                     40:        }
                     41: }
                     42: 
                     43: /*
                     44:  * This routine reads an item from
                     45:  * the input file and constructs and INS node
                     46:  * to hold it. A pointer to the INS node is
                     47:  * returned. Any format errors are fatal.
                     48:  */
                     49: INS *
                     50: getins()
                     51: {
                     52:        register INS    *ip;
                     53:        register int    op;
                     54: 
                     55: loop:
                     56:        op = bget();
                     57:        switch (op) {
                     58: 
                     59:        case ENTER:
                     60:                ip = newi(sizeof(INS));
                     61:                ip->i_seg = bget();
                     62:                break;
                     63: 
                     64:        case FNAME:
                     65:                sget(file, NFNAME);
                     66:                goto loop;
                     67: 
                     68:        case LINE:
                     69:                line = iget();
                     70:                ip = newi(sizeof(INS));
                     71:                ip->i_line = line;
                     72:                break;
                     73: 
                     74:        case DLABEL:
                     75:                gendbgt(1);
                     76:                goto loop;
                     77: 
                     78:        case AUTOS:
                     79:                getautos();
                     80:                goto loop;
                     81: 
                     82:        case BLOCK:
                     83:                ip = newi(sizeof(INS));
                     84:                ip->i_len = zget();
                     85:                break;
                     86: 
                     87:        case LLABEL:
                     88:                ip = newi(sizeof(INS));
                     89:                ip->i_labno = iget();
                     90:                ip->i_sp = NULL;
                     91:                ip->i_refc = 0;
                     92:                break;
                     93: 
                     94: #ifdef KLUDGE
                     95:        case SGUESS:
                     96:        {
                     97:                register SYM *sp;
                     98:                int seg;
                     99:                sget(id, NCSYMB);
                    100:                seg = bget();
                    101:                sp = glookup(id, 0);
                    102:                if ((sp->s_flag&S_DEF) == 0)
                    103:                        sp->s_seg = seg;
                    104:                goto loop;
                    105:        }
                    106: 
                    107: #endif
                    108:        case EPILOG:
                    109:                ip = newi(sizeof(INS));
                    110:                break;
                    111: 
                    112:        case ALIGN:
                    113:                ip = newi(sizeof(INS));
                    114:                ip->i_align = bget();
                    115:                break;
                    116: 
                    117:        case CODE:
                    118:                return (getcode());
                    119: 
                    120:        case EOF:
                    121:                cfatal("unexpected EOF");
                    122: 
                    123:        default:
                    124:                cbotch("bad temporary file opcode %d", op);
                    125:        }
                    126:        ip->i_type = op;
                    127:        ip->i_fp = ip->i_bp = NULL;
                    128:        return (ip);
                    129: }
                    130: 
                    131: /*
                    132:  * Return true if segment "s" is
                    133:  * shared. All local label references must be
                    134:  * in a shared segment, or label reference counting
                    135:  * will get screwed up. This includes the dispatch
                    136:  * tables of switch statements.
                    137:  */
                    138: isshared(s)
                    139: {
                    140:        if (s==SCODE || s==SPURE)
                    141:                return (1);
                    142:        return (0);
                    143: }
                    144: 
                    145: /*
                    146:  * Allocate a new INS node.
                    147:  */
                    148: INS *
                    149: newi(n)
                    150: {
                    151:        register INS    *ip;
                    152: 
                    153:        if ((ip = (INS *) malloc(n)) == NULL)
                    154:                cnomem("newi");
                    155:        return (ip);
                    156: }
                    157: 
                    158: /*
                    159:  * Allocate a new INS node with
                    160:  * an `n' element `i_af' field on the end.
                    161:  */
                    162: INS *
                    163: newn(n)
                    164: {
                    165:        return (newi(sizeof(INS)+n*sizeof(struct afield)));
                    166: }

unix.superglobalmegacorp.com

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