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