Annotation of 3BSD/cmd/mip/fort.c, revision 1.1.1.1

1.1       root        1: # define FORT
                      2: /* this forces larger trees, etc. */
                      3: # include "mfile2"
                      4: # include "fort.h"
                      5: 
                      6: /*     masks for unpacking longs */
                      7: 
                      8: # ifndef FOP
                      9: # define FOP(x) (int)((x)&0377)
                     10: # endif
                     11: 
                     12: # ifndef VAL
                     13: # define VAL(x) (int)(((x)>>8)&0377)
                     14: # endif
                     15: 
                     16: # ifndef REST
                     17: # define REST(x) (((x)>>16)&0177777)
                     18: # endif
                     19: 
                     20: FILE * lrd;  /* for default reading routines */
                     21: # ifndef NOLREAD
                     22: long lread(){
                     23:        static long x;
                     24:        if( fread( (char *) &x, 4, 1, lrd ) <= 0 ) cerror( "intermediate file read error" );
                     25:        return( x );
                     26:        }
                     27: # endif
                     28: 
                     29: # ifndef NOLOPEN
                     30: lopen( s ) char *s; {
                     31:        /* if null, opens the standard input */
                     32:        if( *s ){
                     33:                lrd = fopen( s, "r" );
                     34:                if( lrd == NULL ) cerror( "cannot open intermediate file %s", s );
                     35:                }
                     36:        else  lrd = stdin;
                     37:        }
                     38: # endif
                     39: 
                     40: # ifndef NOLCREAD
                     41: lcread( cp, n ) char *cp; {
                     42:        if( n > 0 ){
                     43:                if( fread( cp, 4, n, lrd ) != n ) cerror( "intermediate file read error" );
                     44:                }
                     45:        }
                     46: # endif
                     47: 
                     48: # ifndef NOLCCOPY
                     49: lccopy( n ) register n; {
                     50:        register i;
                     51:        static char fbuf[128];
                     52:        if( n > 0 ){
                     53:                if( n > 32 ) cerror( "lccopy asked to copy too much" );
                     54:                if( fread( fbuf, 4, n, lrd ) != n ) cerror( "intermediate file read error" );
                     55:                for( i=4*n; fbuf[i-1] == '\0' && i>0; --i ) { /* VOID */ }
                     56:                if( i ) {
                     57:                        if( fwrite( fbuf, 1, i, stdout ) != i ) cerror( "output file error" );
                     58:                        }
                     59:                }
                     60:        }
                     61: # endif
                     62: 
                     63: /*     new opcode definitions */
                     64: 
                     65: # define FORTOPS 200
                     66: # define FTEXT 200
                     67: # define FEXPR 201
                     68: # define FSWITCH 202
                     69: # define FLBRAC 203
                     70: # define FRBRAC 204
                     71: # define FEOF 205
                     72: # define FARIF 206
                     73: # define LABEL 207
                     74: 
                     75: /*     stack for reading nodes in postfix form */
                     76: 
                     77: # define NSTACKSZ 250
                     78: 
                     79: NODE * fstack[NSTACKSZ];
                     80: NODE ** fsp;  /* points to next free position on the stack */
                     81: int ftlab1,ftlab2;
                     82: 
                     83: mainp2( argc, argv ) char *argv[]; {
                     84:        int files;
                     85:        register long x;
                     86:        register NODE *p;
                     87: 
                     88:        files = p2init( argc, argv );
                     89:        tinit();
                     90: 
                     91:                
                     92:        if( files ){
                     93:                while( files < argc && argv[files][0] == '-' ) {
                     94:                        ++files;
                     95:                        }
                     96:                if( files > argc ) return( nerrors );
                     97:                lopen( argv[files] );
                     98:                }
                     99:        else lopen( "" );
                    100: 
                    101:        fsp = fstack;
                    102: 
                    103:        for(;;){
                    104:                /* read nodes, and go to work... */
                    105:                x = lread();
                    106: 
                    107:        if( xdebug ) fprintf( stderr, "op=%d, val = %d, rest = 0%o\n", FOP(x), VAL(x), (int)REST(x) );
                    108:                switch( (int)FOP(x) ){  /* switch on opcode */
                    109: 
                    110:                case 0:
                    111:                        fprintf( stderr, "null opcode ignored\n" );
                    112:                        continue;
                    113:                case FTEXT:
                    114:                        lccopy( VAL(x) );
                    115:                        printf( "\n" );
                    116:                        continue;
                    117: 
                    118:                case FLBRAC:
                    119:                        tmpoff = baseoff = lread();
                    120:                        maxtreg = VAL(x);
                    121:                        if( ftnno != REST(x) ){
                    122:                                /* beginning of function */
                    123:                                maxoff = baseoff;
                    124:                                ftnno = REST(x);
                    125:                                maxtemp = 0;
                    126:                                }
                    127:                        else {
                    128:                                if( baseoff > maxoff ) maxoff = baseoff;
                    129:                                /* maxoff at end of ftn is max of autos and temps 
                    130:                                   over all blocks in the function */
                    131:                                }
                    132:                        setregs();
                    133:                        continue;
                    134: 
                    135:                case FRBRAC:
                    136:                        SETOFF( maxoff, ALSTACK );
                    137:                        eobl2();
                    138:                        continue;
                    139: 
                    140:                case FEOF:
                    141:                        return( nerrors );
                    142: 
                    143:                case FSWITCH:
                    144:                        uerror( "switch not yet done" );
                    145:                        for( x=VAL(x); x>0; --x ) lread();
                    146:                        continue;
                    147: 
                    148:                case ICON:
                    149:                        p = talloc();
                    150:                        p->op = ICON;
                    151:                        p->type = REST(x);
                    152:                        p->rval = 0;
                    153:                        p->lval = lread();
                    154:                        if( VAL(x) ){
                    155:                                lcread( p->name, 2 );
                    156:                                }
                    157:                        else p->name[0] = '\0';
                    158: 
                    159:                bump:
                    160:                        p->su = 0;
                    161:                        p->rall = NOPREF;
                    162:                        *fsp++ = p;
                    163:                        if( fsp >= &fstack[NSTACKSZ] ) uerror( "expression depth exceeded" );
                    164:                        continue;
                    165: 
                    166:                case NAME:
                    167:                        p = talloc();
                    168:                        p->op = NAME;
                    169:                        p->type = REST(x);
                    170:                        p->rval = 0;
                    171:                        if( VAL(x) ) p->lval = lread();
                    172:                        else p->lval = 0;
                    173:                        lcread( p->name, 2 );
                    174:                        goto bump;
                    175: 
                    176:                case OREG:
                    177:                        p = talloc();
                    178:                        p->op = OREG;
                    179:                        p->type = REST(x);
                    180:                        p->rval = VAL(x);
                    181:                        p->lval = lread();
                    182:                        lcread( p->name, 2 );
                    183:                        goto bump;
                    184: 
                    185:                case REG:
                    186:                        p = talloc();
                    187:                        p->op = REG;
                    188:                        p->type = REST(x);
                    189:                        p->rval = VAL(x);
                    190:                        rbusy( p->rval, p->type );
                    191:                        p->lval = 0;
                    192:                        p->name[0] = '\0';
                    193:                        goto bump;
                    194: 
                    195:                case FEXPR:
                    196:                        lineno = REST(x);
                    197:                        if( VAL(x) ) lcread( filename, VAL(x) );
                    198:                        if( fsp == fstack ) continue;  /* filename only */
                    199:                        if( --fsp != fstack ) uerror( "expression poorly formed" );
                    200:                        if( lflag ) lineid( lineno, filename );
                    201:                        tmpoff = baseoff;
                    202:                        p = fstack[0];
                    203:                        if( edebug ) fwalk( p, eprint, 0 );
                    204: # ifdef MYREADER
                    205:                        MYREADER(p);
                    206: # endif
                    207: 
                    208:                        nrecur = 0;
                    209:                        delay( p );
                    210:                        reclaim( p, RNULL, 0 );
                    211: 
                    212:                        allchk();
                    213:                        tcheck();
                    214:                        continue;
                    215: 
                    216:                case LABEL:
                    217:                        if( VAL(x) ){
                    218:                                tlabel();
                    219:                                }
                    220:                        else {
                    221:                                label( (int) REST(x) );
                    222:                                }
                    223:                        continue;
                    224: 
                    225:                case GOTO:
                    226:                        if( VAL(x) ) {
                    227:                                cbgen( 0, (int) REST(x), 'I' );  /* unconditional branch */
                    228:                                continue;
                    229:                                }
                    230:                        /* otherwise, treat as unary */
                    231:                        goto def;
                    232: 
                    233:                default:
                    234:                def:
                    235:                        p = talloc();
                    236:                        p->op = FOP(x);
                    237:                        p->type = REST(x);
                    238: 
                    239:                        switch( optype( p->op ) ){
                    240: 
                    241:                        case BITYPE:
                    242:                                p->right = *--fsp;
                    243:                                p->left = *--fsp;
                    244:                                goto bump;
                    245: 
                    246:                        case UTYPE:
                    247:                                p->left = *--fsp;
                    248:                                p->rval = 0;
                    249:                                goto bump;
                    250: 
                    251:                        case LTYPE:
                    252:                                uerror( "illegal leaf node: %d", p->op );
                    253:                                exit( 1 );
                    254:                                }
                    255:                        }
                    256:                }
                    257:        }

unix.superglobalmegacorp.com

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