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