|
|
1.1 ! root 1: /* @(#) comm1.c: 1.1 12/22/83 */ ! 2: ! 3: # include "mfile1.h" ! 4: ! 5: # ifndef EXIT ! 6: # define EXIT exit ! 7: # endif ! 8: ! 9: int nerrors = 0; /* number of errors */ ! 10: int nowarn = 0; /* suppress warnings */ ! 11: ! 12: NODE *lastfree; /* pointer to last free node; (for allocator) */ ! 13: ! 14: # ifndef MYWHERE ! 15: where(c) ! 16: { ! 17: /* print location of error. c is either 'u', 'c', or 'w' */ ! 18: fprintf( stderr, "%s:%d:", ftitle, lineno ); ! 19: } ! 20: # endif ! 21: ! 22: /* VARARGS1 */ ! 23: uerror( s, a, b, c, d, e, f, g ) ! 24: char *s; ! 25: { ! 26: /* nonfatal error message ! 27: ** the routine where is different for pass 1 and pass 2; ! 28: ** it tells where the error took place ! 29: */ ! 30: ++nerrors; ! 31: where('u'); ! 32: fprintf( stderr, s, a, b, c, d, e, f, g ); ! 33: fprintf( stderr, "\n" ); ! 34: if( nerrors > 30 ) cerror( "too many errors"); ! 35: fflush(stderr); ! 36: nowarn = 1; ! 37: } ! 38: ! 39: /* VARARGS1 */ ! 40: cerror(s, a, b, c, d) ! 41: char *s; ! 42: { ! 43: /* compiler error: die */ ! 44: where('c'); ! 45: if( nerrors && nerrors <= 30 ) ! 46: { ! 47: /* give the compiler the benefit of the doubt */ ! 48: fprintf( stderr, ! 49: "cannot recover from earlier errors: goodbye!\n" ); ! 50: fflush(stderr); ! 51: } ! 52: else ! 53: { ! 54: fprintf( stderr, "compiler error: " ); ! 55: fprintf( stderr, s, a, b, c, d); ! 56: fprintf( stderr, "\n" ); ! 57: fflush(stderr); ! 58: fflush( stdout ); ! 59: } ! 60: EXIT(1); ! 61: } ! 62: ! 63: /* VARARGS1 */ ! 64: werror( s, a, b ) ! 65: char *s; ! 66: { ! 67: /* warning */ ! 68: if (nowarn) return; ! 69: where('w'); ! 70: fprintf( stderr, "warning: " ); ! 71: fprintf( stderr, s, a, b ); ! 72: fprintf( stderr, "\n" ); ! 73: fflush(stderr); ! 74: } ! 75: ! 76: tinit() ! 77: { ! 78: /* initialize expression tree search */ ! 79: register NODE *p; ! 80: ! 81: for (p=node; p < &node[TREESZ]; ++p ) { ! 82: p->in.op = FREE; ! 83: } ! 84: lastfree = node; ! 85: } ! 86: ! 87: NODE * ! 88: talloc() ! 89: { ! 90: register NODE *p, *q; ! 91: ! 92: p = lastfree; ! 93: do { ! 94: if (p < &node[TREESZ-1]) ! 95: q = p+1; ! 96: else ! 97: q = node; ! 98: if (p->in.op == FREE) { ! 99: lastfree = q; ! 100: return p; ! 101: } ! 102: } while ((p = q) != lastfree); ! 103: cerror("out of tree space; simplify expression"); ! 104: } ! 105: ! 106: tcheck() ! 107: { ! 108: /* ensure that all nodes have been freed */ ! 109: register NODE *q; register n; ! 110: ! 111: if (nerrors == 0) { ! 112: for (n=0, q=node; q < &node[TREESZ]; ++q) ! 113: if (q->in.op != FREE) ! 114: ++n; ! 115: if (n) ! 116: cerror("wasted space: %d nodes", n); ! 117: } else ! 118: tinit(); ! 119: freestr(); ! 120: } ! 121: ! 122: tfree(p) ! 123: register NODE *p; ! 124: { ! 125: /* allow tree fragments to be freed, also */ ! 126: if (p == 0) return; ! 127: switch (optype(p->tn.op)) { ! 128: case BITYPE: ! 129: tfree (p->in.right); ! 130: case UTYPE: ! 131: tfree (p->in.left); ! 132: } ! 133: p->in.op = FREE; ! 134: } ! 135: ! 136: ! 137: NODE node[TREESZ]; ! 138: ! 139: char ftitle[100] = "\"\""; /* title of the file */ ! 140: extern int lineno; /* line number of the input file */ ! 141: ! 142: ! 143: #define NTSTRBUF 60 ! 144: #define TSTRSZ 2048 ! 145: char itstrbuf[TSTRSZ]; ! 146: char *tstrbuf[NTSTRBUF] = { itstrbuf }; ! 147: char **curtstr = tstrbuf; ! 148: int tstrused; ! 149: ! 150: char * ! 151: tstr( cp ) /* place copy of string into temp storage */ ! 152: register char *cp; /* strings longer than TSTRSZ will break tstr */ ! 153: { ! 154: register int i = strlen( cp ); ! 155: register char *dp; ! 156: extern char * malloc(); ! 157: extern char * strcpy(); ! 158: ! 159: if ( tstrused + i >= TSTRSZ ) ! 160: { ! 161: if ( ++curtstr >= &tstrbuf[NTSTRBUF] ) ! 162: cerror( "out of temporary string space" ); ! 163: tstrused = 0; ! 164: if ( *curtstr == 0 ) ! 165: { ! 166: if ( ( dp = (char *) malloc( TSTRSZ ) ) == 0 ) ! 167: cerror( "out of memory [tstr()]" ); ! 168: *curtstr = dp; ! 169: } ! 170: } ! 171: strcpy( dp = *curtstr + tstrused, cp ); ! 172: tstrused += i + 1; ! 173: return ( dp ); ! 174: } ! 175: #include "dope.h" ! 176: ! 177: mkdope() ! 178: { ! 179: register struct dopest *q; ! 180: ! 181: for( q = indope; q->dopeop >= 0; ++q ) ! 182: { ! 183: dope[q->dopeop] = q->dopeval; ! 184: opst[q->dopeop] = q->opst; ! 185: } ! 186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.