|
|
1.1 ! root 1: #ifdef FORT ! 2: #undef BUFSTDERR ! 3: #endif ! 4: #ifndef ONEPASS ! 5: #undef BUFSTDERR ! 6: #endif ! 7: # ifndef EXIT ! 8: # define EXIT exit ! 9: # endif ! 10: ! 11: int nerrors = 0; /* number of errors */ ! 12: ! 13: extern unsigned int offsz; ! 14: ! 15: unsigned caloff(){ ! 16: register i; ! 17: unsigned int temp; ! 18: unsigned int off; ! 19: temp = 1; ! 20: i = 0; ! 21: do { ! 22: temp <<= 1; ! 23: ++i; ! 24: } while( temp > 0 ); ! 25: off = 1 << (i-1); ! 26: return (off); ! 27: } ! 28: ! 29: NODE *lastfree; /* pointer to last free node; (for allocator) */ ! 30: ! 31: /* VARARGS1 */ ! 32: uerror( s, a ) char *s; { /* nonfatal error message */ ! 33: /* the routine where is different for pass 1 and pass 2; ! 34: /* it tells where the error took place */ ! 35: ! 36: ++nerrors; ! 37: where('u'); ! 38: fprintf( stderr, s, a ); ! 39: fprintf( stderr, "\n" ); ! 40: #ifdef BUFSTDERR ! 41: fflush(stderr); ! 42: #endif ! 43: if( nerrors > 30 ) cerror( "too many errors"); ! 44: } ! 45: ! 46: /* VARARGS1 */ ! 47: cerror( s, a, b, c ) char *s; { /* compiler error: die */ ! 48: where('c'); ! 49: if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */ ! 50: fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" ); ! 51: } ! 52: else { ! 53: fprintf( stderr, "compiler error: " ); ! 54: fprintf( stderr, s, a, b, c ); ! 55: fprintf( stderr, "\n" ); ! 56: } ! 57: #ifdef BUFSTDERR ! 58: fflush(stderr); ! 59: #endif ! 60: EXIT(1); ! 61: } ! 62: ! 63: int Wflag = 0; /* Non-zero means do not print warnings */ ! 64: ! 65: /* VARARGS1 */ ! 66: werror( s, a, b ) char *s; { /* warning */ ! 67: if(Wflag) return; ! 68: where('w'); ! 69: fprintf( stderr, "warning: " ); ! 70: fprintf( stderr, s, a, b ); ! 71: fprintf( stderr, "\n" ); ! 72: #ifdef BUFSTDERR ! 73: fflush(stderr); ! 74: #endif ! 75: } ! 76: ! 77: tinit(){ /* initialize expression tree search */ ! 78: ! 79: NODE *p; ! 80: ! 81: for( p=node; p<= &node[TREESZ-1]; ++p ) p->in.op = FREE; ! 82: lastfree = node; ! 83: ! 84: } ! 85: ! 86: # define TNEXT(p) (p== &node[TREESZ-1]?node:p+1) ! 87: ! 88: NODE * ! 89: talloc(){ ! 90: NODE *p, *q; ! 91: ! 92: q = lastfree; ! 93: for( p = TNEXT(q); p!=q; p= TNEXT(p)) ! 94: if( p->in.op ==FREE ) return(lastfree=p); ! 95: ! 96: cerror( "out of tree space; simplify expression"); ! 97: /* NOTREACHED */ ! 98: } ! 99: ! 100: tcheck(){ /* ensure that all nodes have been freed */ ! 101: ! 102: NODE *p; ! 103: ! 104: if( !nerrors ) ! 105: for( p=node; p<= &node[TREESZ-1]; ++p ) ! 106: if( p->in.op != FREE ) cerror( "wasted space: %o", p ); ! 107: tinit(); ! 108: #ifdef FLEXNAMES ! 109: freetstr(); ! 110: #endif ! 111: } ! 112: tfree( p ) NODE *p; { ! 113: /* free the tree p */ ! 114: extern tfree1(); ! 115: ! 116: if( p->in.op != FREE ) walkf( p, tfree1 ); ! 117: ! 118: } ! 119: ! 120: tfree1(p) NODE *p; { ! 121: if( p == 0 ) cerror( "freeing blank tree!"); ! 122: else p->in.op = FREE; ! 123: } ! 124: ! 125: fwalk( t, f, down ) register NODE *t; int (*f)(); { ! 126: ! 127: int down1, down2; ! 128: ! 129: more: ! 130: down1 = down2 = 0; ! 131: ! 132: (*f)( t, down, &down1, &down2 ); ! 133: ! 134: switch( optype( t->in.op ) ){ ! 135: ! 136: case BITYPE: ! 137: fwalk( t->in.left, f, down1 ); ! 138: t = t->in.right; ! 139: down = down2; ! 140: goto more; ! 141: ! 142: case UTYPE: ! 143: t = t->in.left; ! 144: down = down1; ! 145: goto more; ! 146: ! 147: } ! 148: } ! 149: ! 150: walkf( t, f ) register NODE *t; int (*f)(); { ! 151: register opty; ! 152: ! 153: opty = optype(t->in.op); ! 154: ! 155: if( opty != LTYPE ) walkf( t->in.left, f ); ! 156: if( opty == BITYPE ) walkf( t->in.right, f ); ! 157: (*f)( t ); ! 158: } ! 159: ! 160: ! 161: ! 162: int dope[ DSIZE ]; ! 163: char *opst[DSIZE]; ! 164: ! 165: struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = { ! 166: ! 167: NAME, "NAME", LTYPE, ! 168: STRING, "STRING", LTYPE, ! 169: REG, "REG", LTYPE, ! 170: OREG, "OREG", LTYPE, ! 171: ICON, "ICON", LTYPE, ! 172: FCON, "FCON", LTYPE, ! 173: CCODES, "CCODES", LTYPE, ! 174: UNARY MINUS, "U-", UTYPE, ! 175: UNARY MUL, "U*", UTYPE, ! 176: UNARY AND, "U&", UTYPE, ! 177: UNARY CALL, "UCALL", UTYPE|CALLFLG, ! 178: UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG, ! 179: NOT, "!", UTYPE|LOGFLG, ! 180: COMPL, "~", UTYPE, ! 181: FORCE, "FORCE", UTYPE, ! 182: INIT, "INIT", UTYPE, ! 183: SCONV, "SCONV", UTYPE, ! 184: PCONV, "PCONV", UTYPE, ! 185: PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG, ! 186: ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG, ! 187: MINUS, "-", BITYPE|FLOFLG|SIMPFLG, ! 188: ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG, ! 189: MUL, "*", BITYPE|FLOFLG|MULFLG, ! 190: ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG, ! 191: AND, "&", BITYPE|SIMPFLG|COMMFLG, ! 192: ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG, ! 193: QUEST, "?", BITYPE, ! 194: COLON, ":", BITYPE, ! 195: ANDAND, "&&", BITYPE|LOGFLG, ! 196: OROR, "||", BITYPE|LOGFLG, ! 197: CM, ",", BITYPE, ! 198: COMOP, ",OP", BITYPE, ! 199: ASSIGN, "=", BITYPE|ASGFLG, ! 200: DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG, ! 201: ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG, ! 202: MOD, "%", BITYPE|DIVFLG, ! 203: ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG, ! 204: LS, "<<", BITYPE|SHFFLG, ! 205: ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG, ! 206: RS, ">>", BITYPE|SHFFLG, ! 207: ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG, ! 208: OR, "|", BITYPE|COMMFLG|SIMPFLG, ! 209: ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG, ! 210: ER, "^", BITYPE|COMMFLG|SIMPFLG, ! 211: ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG, ! 212: INCR, "++", BITYPE|ASGFLG, ! 213: DECR, "--", BITYPE|ASGFLG, ! 214: STREF, "->", BITYPE, ! 215: CALL, "CALL", BITYPE|CALLFLG, ! 216: FORTCALL, "FCALL", BITYPE|CALLFLG, ! 217: EQ, "==", BITYPE|LOGFLG, ! 218: NE, "!=", BITYPE|LOGFLG, ! 219: LE, "<=", BITYPE|LOGFLG, ! 220: LT, "<", BITYPE|LOGFLG, ! 221: GE, ">", BITYPE|LOGFLG, ! 222: GT, ">", BITYPE|LOGFLG, ! 223: UGT, "UGT", BITYPE|LOGFLG, ! 224: UGE, "UGE", BITYPE|LOGFLG, ! 225: ULT, "ULT", BITYPE|LOGFLG, ! 226: ULE, "ULE", BITYPE|LOGFLG, ! 227: ARS, "A>>", BITYPE, ! 228: TYPE, "TYPE", LTYPE, ! 229: LB, "[", BITYPE, ! 230: CBRANCH, "CBRANCH", BITYPE, ! 231: FLD, "FLD", UTYPE, ! 232: PMCONV, "PMCONV", BITYPE, ! 233: PVCONV, "PVCONV", BITYPE, ! 234: RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG, ! 235: CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG, ! 236: GOTO, "GOTO", UTYPE, ! 237: STASG, "STASG", BITYPE|ASGFLG, ! 238: STARG, "STARG", UTYPE, ! 239: STCALL, "STCALL", BITYPE|CALLFLG, ! 240: UNARY STCALL, "USTCALL", UTYPE|CALLFLG, ! 241: ! 242: -1, 0 ! 243: }; ! 244: ! 245: mkdope(){ ! 246: register struct dopest *q; ! 247: ! 248: for( q = indope; q->dopeop >= 0; ++q ){ ! 249: dope[q->dopeop] = q->dopeval; ! 250: opst[q->dopeop] = q->opst; ! 251: } ! 252: } ! 253: # ifndef BUG4 ! 254: tprint( t ) TWORD t; { /* output a nice description of the type of t */ ! 255: ! 256: static char * tnames[] = { ! 257: "undef", ! 258: "farg", ! 259: "char", ! 260: "short", ! 261: "int", ! 262: "long", ! 263: "float", ! 264: "double", ! 265: "strty", ! 266: "unionty", ! 267: "enumty", ! 268: "moety", ! 269: "uchar", ! 270: "ushort", ! 271: "unsigned", ! 272: "ulong", ! 273: "?", "?" ! 274: }; ! 275: ! 276: for(;; t = DECREF(t) ){ ! 277: ! 278: if( ISPTR(t) ) printf( "PTR " ); ! 279: else if( ISFTN(t) ) printf( "FTN " ); ! 280: else if( ISARY(t) ) printf( "ARY " ); ! 281: else { ! 282: printf( "%s", tnames[t] ); ! 283: return; ! 284: } ! 285: } ! 286: } ! 287: # endif ! 288: ! 289: #ifdef FLEXNAMES ! 290: #define NTSTRBUF 40 ! 291: #define TSTRSZ 2048 ! 292: char itstrbuf[TSTRSZ]; ! 293: char *tstrbuf[NTSTRBUF] = { itstrbuf }; ! 294: char **curtstr = tstrbuf; ! 295: int tstrused; ! 296: ! 297: char * ! 298: tstr(cp) ! 299: register char *cp; ! 300: { ! 301: register int i = strlen(cp); ! 302: register char *dp; ! 303: ! 304: if (tstrused + i >= TSTRSZ) { ! 305: if (++curtstr >= &tstrbuf[NTSTRBUF]) ! 306: cerror("out of temporary string space"); ! 307: tstrused = 0; ! 308: if (*curtstr == 0) { ! 309: dp = (char *)malloc(TSTRSZ); ! 310: if (dp == 0) ! 311: cerror("out of memory (tstr)"); ! 312: *curtstr = dp; ! 313: } ! 314: } ! 315: strcpy(dp = *curtstr+tstrused, cp); ! 316: tstrused += i + 1; ! 317: return (dp); ! 318: } ! 319: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.