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