|
|
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.