00001 #include "c.h"
00002
00003
00004 static void printtoken(void);
00005 int errcnt = 0;
00006 int errlimit = 20;
00007 char kind[] = {
00008 #define xx(a,b,c,d,e,f,g) f,
00009 #define yy(a,b,c,d,e,f,g) f,
00010 #include "token.h"
00011 };
00012 int wflag;
00013
00014 void test(int tok, char set[]) {
00015 if (t == tok)
00016 t = gettok();
00017 else {
00018 expect(tok);
00019 skipto(tok, set);
00020 if (t == tok)
00021 t = gettok();
00022 }
00023 }
00024 void expect(int tok) {
00025 if (t == tok)
00026 t = gettok();
00027 else {
00028 error("syntax error; found");
00029 printtoken();
00030 fprint(stderr, " expecting `%k'\n", tok);
00031 }
00032 }
00033 void error(const char *fmt, ...) {
00034 va_list ap;
00035
00036 if (errcnt++ >= errlimit) {
00037 errcnt = -1;
00038 error("too many errors\n");
00039 exit(1);
00040 }
00041 va_start(ap, fmt);
00042 if (firstfile != file && firstfile && *firstfile)
00043 fprint(stderr, "%s: ", firstfile);
00044 fprint(stderr, "%w: ", &src);
00045 vfprint(stderr, NULL, fmt, ap);
00046 va_end(ap);
00047 }
00048
00049 void skipto(int tok, char set[]) {
00050 int n;
00051 char *s;
00052
00053 assert(set);
00054 for (n = 0; t != EOI && t != tok; t = gettok()) {
00055 for (s = set; *s && kind[t] != *s; s++)
00056 ;
00057 if (kind[t] == *s)
00058 break;
00059 if (n++ == 0)
00060 error("skipping");
00061 if (n <= 8)
00062 printtoken();
00063 else if (n == 9)
00064 fprint(stderr, " ...");
00065 }
00066 if (n > 8) {
00067 fprint(stderr, " up to");
00068 printtoken();
00069 }
00070 if (n > 0)
00071 fprint(stderr, "\n");
00072 }
00073
00074 int fatal(const char *name, const char *fmt, int n) {
00075 print("\n");
00076 errcnt = -1;
00077 error("compiler error in %s--", name);
00078 fprint(stderr, fmt, n);
00079 exit(EXIT_FAILURE);
00080 return 0;
00081 }
00082
00083
00084 static void printtoken(void) {
00085 switch (t) {
00086 case ID: fprint(stderr, " `%s'", token); break;
00087 case ICON:
00088 fprint(stderr, " `%s'", vtoa(tsym->type, tsym->u.c.v));
00089 break;
00090 case SCON: {
00091 int i, n;
00092 if (ischar(tsym->type->type)) {
00093 char *s = tsym->u.c.v.p;
00094 n = tsym->type->size;
00095 fprint(stderr, " \"");
00096 for (i = 0; i < 20 && i < n && *s; s++, i++)
00097 if (*s < ' ' || *s >= 0177)
00098 fprint(stderr, "\\%o", *s);
00099 else
00100 fprint(stderr, "%c", *s);
00101 } else {
00102 unsigned int *s = tsym->u.c.v.p;
00103 assert(tsym->type->type->size == widechar->size);
00104 n = tsym->type->size/widechar->size;
00105 fprint(stderr, " L\"");
00106 for (i = 0; i < 20 && i < n && *s; s++, i++)
00107 if (*s < ' ' || *s >= 0177)
00108 fprint(stderr, "\\x%x", *s);
00109 else
00110 fprint(stderr, "%c", *s);
00111 }
00112 if (i < n)
00113 fprint(stderr, " ...");
00114 else
00115 fprint(stderr, "\"");
00116 break;
00117 }
00118 case FCON:
00119 fprint(stderr, " `%S'", token, (char*)cp - token);
00120 break;
00121 case '`': case '\'': fprint(stderr, " \"%k\"", t); break;
00122 default: fprint(stderr, " `%k'", t);
00123 }
00124 }
00125
00126
00127 void warning(const char *fmt, ...) {
00128 va_list ap;
00129
00130 va_start(ap, fmt);
00131 if (wflag == 0) {
00132 errcnt--;
00133 error("warning: ");
00134 vfprint(stderr, NULL, fmt, ap);
00135 }
00136 va_end(ap);
00137 }