* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / lcc / src / error.c
blob2187c1014e445bc362a4c0ce76157b0368b44459
1 #include "c.h"
4 static void printtoken(void);
5 int errcnt = 0;
6 int errlimit = 20;
7 char kind[] = {
8 #define xx(a,b,c,d,e,f,g) f,
9 #define yy(a,b,c,d,e,f,g) f,
10 #include "token.h"
12 int wflag; /* != 0 to suppress warning messages */
14 void test(int tok, char set[]) {
15 if (t == tok)
16 t = gettok();
17 else {
18 expect(tok);
19 skipto(tok, set);
20 if (t == tok)
21 t = gettok();
24 void expect(int tok) {
25 if (t == tok)
26 t = gettok();
27 else {
28 error("syntax error; found");
29 printtoken();
30 fprint(stderr, " expecting `%k'\n", tok);
33 void error(const char *fmt, ...) {
34 va_list ap;
36 if (errcnt++ >= errlimit) {
37 errcnt = -1;
38 error("too many errors\n");
39 exit(1);
41 va_start(ap, fmt);
42 if (firstfile != file && firstfile && *firstfile)
43 fprint(stderr, "%s: ", firstfile);
44 fprint(stderr, "%w: ", &src);
45 vfprint(stderr, NULL, fmt, ap);
46 va_end(ap);
49 void skipto(int tok, char set[]) {
50 int n;
51 char *s;
53 assert(set);
54 for (n = 0; t != EOI && t != tok; t = gettok()) {
55 for (s = set; *s && kind[t] != *s; s++)
57 if (kind[t] == *s)
58 break;
59 if (n++ == 0)
60 error("skipping");
61 if (n <= 8)
62 printtoken();
63 else if (n == 9)
64 fprint(stderr, " ...");
66 if (n > 8) {
67 fprint(stderr, " up to");
68 printtoken();
70 if (n > 0)
71 fprint(stderr, "\n");
73 /* fatal - issue fatal error message and exit */
74 int fatal(const char *name, const char *fmt, int n) {
75 print("\n");
76 errcnt = -1;
77 error("compiler error in %s--", name);
78 fprint(stderr, fmt, n);
79 exit(EXIT_FAILURE);
80 return 0;
83 /* printtoken - print current token preceeded by a space */
84 static void printtoken(void) {
85 switch (t) {
86 case ID: fprint(stderr, " `%s'", token); break;
87 case ICON:
88 fprint(stderr, " `%s'", vtoa(tsym->type, tsym->u.c.v));
89 break;
90 case SCON: {
91 int i, n;
92 if (ischar(tsym->type->type)) {
93 char *s = tsym->u.c.v.p;
94 n = tsym->type->size;
95 fprint(stderr, " \"");
96 for (i = 0; i < 20 && i < n && *s; s++, i++)
97 if (*s < ' ' || *s >= 0177)
98 fprint(stderr, "\\%o", *s);
99 else
100 fprint(stderr, "%c", *s);
101 } else { /* wchar_t string */
102 unsigned int *s = tsym->u.c.v.p;
103 assert(tsym->type->type->size == widechar->size);
104 n = tsym->type->size/widechar->size;
105 fprint(stderr, " L\"");
106 for (i = 0; i < 20 && i < n && *s; s++, i++)
107 if (*s < ' ' || *s >= 0177)
108 fprint(stderr, "\\x%x", *s);
109 else
110 fprint(stderr, "%c", *s);
112 if (i < n)
113 fprint(stderr, " ...");
114 else
115 fprint(stderr, "\"");
116 break;
118 case FCON:
119 fprint(stderr, " `%S'", token, (char*)cp - token);
120 break;
121 case '`': case '\'': fprint(stderr, " \"%k\"", t); break;
122 default: fprint(stderr, " `%k'", t);
126 /* warning - issue warning error message */
127 void warning(const char *fmt, ...) {
128 va_list ap;
130 va_start(ap, fmt);
131 if (wflag == 0) {
132 errcnt--;
133 error("warning: ");
134 vfprint(stderr, NULL, fmt, ap);
136 va_end(ap);