Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

error.c

Go to the documentation of this file.
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;      /* != 0 to suppress warning messages */
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 /* fatal - issue fatal error message and exit */
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 /* printtoken - print current token preceeded by a space */
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 {    /* wchar_t string */
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 /* warning - issue warning error message */
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 }

Generated on Thu Aug 25 12:38:13 2005 for Quake III Arena by  doxygen 1.3.9.1