|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.