Annotation of researchv10no/cmd/lcc/c/error.c, revision 1.1.1.1

1.1       root        1: /* C compiler: error reporting */
                      2: 
                      3: #include "c.h"
                      4: 
                      5: int errcnt;            /* number of compilation errors */
                      6: int errlimit = 20;     /* compilation error limit */
                      7: int wflag;             /* != 0 to suppress warning messages */
                      8: 
                      9: dclproto(static void printtoken,(void));
                     10: 
                     11: /* error - issue error message */
                     12: #ifdef __STDC__
                     13: void error(char *fmt, ...) {
                     14: #else
                     15: void error(fmt, va_alist) char *fmt; va_dcl {
                     16: #endif
                     17:        va_list ap;
                     18: 
                     19:        va_init(ap, fmt);
                     20:        if (firstfile != file && firstfile && *firstfile)
                     21:                fprint(2, "%s: ", firstfile);           /* omit */
                     22:        fprint(2, "%w: ", &src);
                     23:        vfprint(2, fmt, ap);
                     24:        if (++errcnt >= errlimit) {
                     25:                errcnt = -1;
                     26:                error("too many errors\n");
                     27:                exit(1);
                     28:        }
                     29:        va_end(ap);
                     30: }
                     31: 
                     32: /* expect - advance if t is tok, otherwise issue message */
                     33: int expect(tok) {
                     34:        if (t == tok) {
                     35:                t = gettok();
                     36:                return t;
                     37:        }
                     38:        errcnt--;
                     39:        error("syntax error; found");
                     40:        printtoken();
                     41:        fprint(2, " expecting `%k'\n", tok);
                     42:        errcnt++;
                     43:        return 0;
                     44: }
                     45: 
                     46: /* fatal - issue fatal error message and exit */
                     47: int fatal(name, fmt, n) char *name, *fmt; {
                     48:        *bp++ = '\n';
                     49:        outflush();
                     50:        error("compiler error in %s--", name);
                     51:        fprint(2, fmt, n);
                     52:        exit(1);
                     53:        return 0;
                     54: }
                     55: 
                     56: /* printtoken - print current token preceeded by a space */
                     57: static void printtoken() {
                     58:        switch (t) {
                     59:        case ID: fprint(2, " `%s'", token); break;
                     60:        case ICON:
                     61:                if (*token == '\'') {
                     62:                        char *s;
                     63:        case SCON:      fprint(2, " ");
                     64:                        for (s = token; *s && s - token < 20; s++)
                     65:                                if (*s < ' ' || *s >= 0177)
                     66:                                        fprint(2, "\\%o", *s);
                     67:                                else
                     68:                                        fprint(2, "%c", *s);
                     69:                        if (*s)
                     70:                                fprint(2, " ...");
                     71:                        else
                     72:                                fprint(2, "%c", *token);
                     73:                        break;
                     74:                } /* else fall thru */
                     75:        case FCON: {
                     76:                char c = *cp;
                     77:                *cp = 0;
                     78:                fprint(2, " `%s'", token);
                     79:                *cp = c;
                     80:                break;
                     81:                }
                     82:        case '`': case '\'': fprint(2, " \"%k\"", t); break;
                     83:        default: fprint(2, " `%k'", t);
                     84:        }
                     85: }
                     86: 
                     87: /* skipto - skip input up to tok U set, for a token where kind[t] is in set */
                     88: void skipto(tok, set) char set[]; {
                     89:        int n;
                     90:        char *s;
                     91: 
                     92:        for (n = 0; t != EOI && t != tok; t = gettok()) {
                     93:                if (set) {
                     94:                        for (s = set; *s && kind[t] != *s; s++)
                     95:                                ;
                     96:                        if (kind[t] == *s)
                     97:                                break;
                     98:                }
                     99:                if (n++ == 0) {
                    100:                        errcnt--;
                    101:                        error("skipping", 0, 0, 0, 0);
                    102:                }
                    103:                if (n <= 8)
                    104:                        printtoken();
                    105:                else if (n == 9)
                    106:                        fprint(2, " ...\n");
                    107:        }
                    108:        if (n > 8) {
                    109:                errcnt--;
                    110:                error("up to", 0, 0, 0, 0);
                    111:                printtoken();
                    112:        }
                    113:        if (n > 0)
                    114:                fprint(2, "\n");
                    115: }
                    116: 
                    117: /* test - check for token tok, skip to tok U set, if necessary */
                    118: void test(tok, set) char set[]; {
                    119:        if (t == tok)
                    120:                t = gettok();
                    121:        else {
                    122:                expect(tok);
                    123:                skipto(tok, set);
                    124:                if (t == tok)
                    125:                        t = gettok();
                    126:        }
                    127: }
                    128: 
                    129: /* warning - issue warning error message */
                    130: #ifdef __STDC__
                    131: void warning(char *fmt, ...) {
                    132: #else
                    133: void warning(fmt, va_alist) char *fmt; va_dcl {
                    134: #endif
                    135:        va_list ap;
                    136: 
                    137:        va_init(ap, fmt);
                    138:        if (wflag == 0) {
                    139:                errcnt--;       /* compensate for increment in error */
                    140:                error("warning: ");
                    141:                vfprint(2, fmt, ap);
                    142:        }
                    143:        va_end(ap);
                    144: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.