|
|
1.1 root 1: /*
2: * h/diag.c
3: *
4: * These routines write diagnostics for all the compiler phases.
5: * They are do-it-yourself routines because the "printf"
6: * in the VAX-11 C library lacks the undocumented "%r" format.
7: * The routines defined below are:
8: * cbotch for internal compiler errors
9: * cerror for user program errors (e.g. syntax errors)
10: * cfatal for instantly fatal errors (e.g. fixed limits)
11: * cnomem for out of memory errors
12: * cstrict for strict warning messages
13: * cwarn for warning messages
14: * cbotch, cfatal and cnomem errors are all instantly fatal.
15: * cerror errors allow the current pass to continue but bump the error count
16: * so that compilation terminates after the current pass.
17: * cstrict and cwarn are warning messages only, with no other effect.
18: */
19:
20: #include <stdio.h>
21: #include <setjmp.h>
22: #ifdef vax
23: #include "INC$LIB:mch.h"
24: #include "INC$LIB:host.h"
25: #include "INC$LIB:stream.h"
26: #include "INC$LIB:var.h"
27: #else
28: #include "mch.h"
29: #include "host.h"
30: #include "stream.h"
31: #include "var.h"
32: #endif
33:
34: int nerr = 0; /* Error counter */
35: char *passname = NULL; /* Pass identifier string */
36:
37: extern int line; /* Line number */
38: extern char file[]; /* File name */
39: extern FILE *ifp; /* Input stream */
40: extern long ftell(); /* Standard I/O routine */
41:
42: #if OVERLAID
43: extern jmp_buf death; /* Fatal errors */
44: #endif
45:
46: /*
47: * Put out error.
48: * Bump the error count.
49: */
50: cerror(fp, args)
51: char *fp;
52: {
53: cmsg(fp, &args, NULL, 0);
54: ++nerr;
55: }
56:
57: /*
58: * Put out warning.
59: */
60: cwarn(fp, args)
61: char *fp;
62: {
63: if (notvariant(VNOWARN))
64: cmsg(fp, &args, "Warning", 0);
65: }
66:
67: /*
68: * Put out strict check.
69: */
70: cstrict(fp, args)
71: char *fp;
72: {
73: if (notvariant(VNOWARN))
74: cmsg(fp, &args, "Strict", 0);
75: }
76:
77: /*
78: * Put out fatal message and die.
79: */
80: cfatal(fp, args)
81: char *fp;
82: {
83: cmsg(fp, &args, "Fatal error", 1);
84: #if !OVERLAID
85: exit(ABORT);
86: #else
87: longjmp(death, 1);
88: #endif
89: }
90:
91: #if TINY
92: /*
93: * Sanitize a botch message for external consumption.
94: */
95: char *botch_message(msg) char *msg;
96: {
97: static char newmsg[32];
98: static char digit[] = "0123456789ABCDEF";
99: char *p, *q, c, sw;
100: unsigned crypt;
101:
102: crypt = 0x3141;
103: sw = 0;
104: q = newmsg+4;
105: for(p = msg; c = *p++;) {
106: if(crypt & 0x8000)
107: crypt ^= 0xE178;
108: crypt = c ^ (crypt << 1);
109:
110: if('%' == c) /* save the printf token */
111: sw = 1;
112: if(sw && (' ' == (*q++ = c)))
113: sw = 0;
114: }
115: *q = '\0';
116:
117: newmsg[3] = digit[crypt&0xF];
118: crypt >>= 4; newmsg[2] = digit[crypt&0xF];
119: crypt >>= 4; newmsg[1] = digit[crypt&0xF];
120: crypt >>= 4; newmsg[0] = digit[crypt&0xF];
121: return newmsg;
122: }
123: #endif
124:
125: /*
126: * Put out botch message and die.
127: * Prepend an informative message if !TINY.
128: */
129: cbotch(fp, args)
130: char *fp;
131: {
132: #if TINY
133: fp = botch_message(fp);
134: #endif
135: cmsg(fp, &args, "Internal compiler error: ", 1);
136: #if !OVERLAID
137: exit(ABORT);
138: #else
139: longjmp(death, 1);
140: #endif
141: }
142:
143: /*
144: * Put out "out of space" error message and die.
145: */
146: cnomem(fp, args)
147: char *fp;
148: {
149: #if !TINY
150: cmsg(fp, &args, "Out of space", 1);
151: #endif
152: cfatal("out of space");
153: }
154:
155: /*
156: * Put out a message.
157: * Tag it with the line number and file name.
158: */
159: static
160: cmsg(fp, ap, bp, flag)
161: char *fp;
162: int *ap;
163: char *bp;
164: {
165: register int c;
166:
167: if (isvariant(VQUIET))
168: return;
169: if (line != 0)
170: fprintf(stderr, "%d: ", line);
171: if (file[0])
172: fprintf(stderr, "%s: ", file);
173: #if !TINY
174: if (flag != 0) {
175: if (ifp != NULL)
176: fprintf(stderr, "At %ld: ", ftell(ifp));
177: #if TEMPBUF
178: else if (inbuf != NULL)
179: fprintf(stderr, "At %d: ", inbufp - inbuf);
180: #endif
181: }
182: #endif
183: if (flag!=0 && passname != NULL)
184: fprintf(stderr, "In %s: ", passname);
185: if (bp != NULL)
186: fprintf(stderr, "%s: ", bp);
187: while ((c = *fp++) != '\0') {
188: if (c != '%')
189: fputc(c, stderr);
190: else {
191: c = *fp++;
192: switch (c) {
193: case 'd':
194: fprintf(stderr, "%d", *ap++);
195: break;
196: case 's':
197: fprintf(stderr, "%s", *((char **)ap)++);
198: break;
199: case 'X':
200: fprintf(stderr, "%lx", *((long *)ap)++);
201: break;
202: default:
203: fputc(c, stderr);
204: }
205: }
206: }
207: fputc('\n', stderr);
208: }
209:
210: /* end of h/diag.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.