Annotation of researchv10no/cmd/cfront/cfront2.00/error.c, revision 1.1.1.1

1.1       root        1: /*ident        "@(#)ctrans:src/error.c 1.1.3.15" */
                      2: /**************************************************************************
                      3: 
                      4:        C++ source for cfront, the C++ compiler front-end
                      5:        written in the computer science research center of Bell Labs
                      6: 
                      7:        Copyright (c) 1984 AT&T, Inc. All rigths Reserved
                      8:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
                      9: 
                     10:  error.c :
                     11: 
                     12:        write error messages
                     13: 
                     14:        Until scan_started != 0 no context can be assumed
                     15: 
                     16: ***************************************************************************/
                     17: 
                     18: #ifdef __cplusplus
                     19: #include <stdlib.h>
                     20: #endif
                     21: 
                     22: #include "cfront.h"
                     23: #include "size.h"
                     24: 
                     25: int error_count;
                     26: static int no_of_warnings;
                     27: char scan_started;
                     28: extern char emode;
                     29: 
                     30: #define ERRTRACE    20
                     31: 
                     32: static char* abbrev_tbl[] = {
                     33:        " argument",
                     34:        " base",
                     35:        " class",
                     36:        " declaration",
                     37:        " expression",
                     38:        " function",
                     39:        "G",
                     40:        "H",
                     41:        " initialize",
                     42:        "J",
                     43:        " constructor", // 'K' !
                     44:        " list",
                     45:        " member",
                     46:        " name",
                     47:        " object",
                     48:        " pointer",
                     49:        " qualifie",
                     50:        " reference",
                     51:        " statement",
                     52:        " type",
                     53:        " undefined",
                     54:        " variable",
                     55:        " with",
                     56:        " expected", // 'X'
                     57:        "Y",
                     58:        "Z",
                     59: };
                     60: 
                     61: ea* ea0;
                     62: 
                     63: void error_init()
                     64: {
                     65:        static char errbuf[BUFSIZ];
                     66:        setbuf(stderr,errbuf);
                     67:        ea0 = new ea;
                     68: }
                     69: 
                     70: #define INTERNAL 127
                     71: 
                     72: void ext(int n)
                     73: {
                     74:        int useit=n; // to avoid n not used warning during build
                     75: // for testing only
                     76: //     if (n == INTERNAL)
                     77: //     abort();
                     78:        exit(error_count?error_count:1);
                     79: }
                     80: 
                     81: void print_loc()
                     82: {
                     83:        loc* sl = (Cstmt) ? &Cstmt->where : 0;
                     84:        loc* dl = (Cdcl && (Cdcl->base==NAME || Cdcl->base==TNAME)) ? &Cdcl->where : 0;
                     85:        if (sl && dl && sl->file==dl->file) {   // Cstmt and Cdcl in same file
                     86:                if (sl->line<=dl->line) {
                     87:                        if (curloc.file==dl->file && curloc.line<dl->line)
                     88:                                // hack to compensate for YACC's
                     89:                                // bad manners in the use of line numbers
                     90:                                sl->put(out_file);
                     91:                        else
                     92:                                dl->put(out_file);
                     93:                }
                     94:                else
                     95:                        sl->put(out_file);
                     96:        }
                     97:        else if (sl && sl->file==curr_file)     // Cstmt in current file
                     98:                sl->put(out_file);
                     99:        else if (dl && dl->file==curr_file)     // Cdcl in current file
                    100:                dl->put(out_file);
                    101:        else
                    102:                curloc.put(out_file);
                    103: }
                    104: 
                    105: static void print_context()
                    106: {
                    107:        putc('\n',out_file);
                    108: }
                    109: 
                    110: static char in_error = 0;
                    111: loc dummy_loc;
                    112: 
                    113: void yyerror(char* s)
                    114: {
                    115:        error(s);
                    116: }
                    117: 
                    118: int error(const char* s)
                    119: {
                    120:        return error(0,s);
                    121: }
                    122: 
                    123: int error(int t, const char* s)
                    124: {
                    125:        return error(t,&dummy_loc,s,*ea0,*ea0,*ea0,*ea0);
                    126: }
                    127: 
                    128: int error(const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3)
                    129: {
                    130:        return error(0,&dummy_loc,s,a0,a1,a2,a3);
                    131: }
                    132: 
                    133: int error(loc* lc, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3)
                    134: {
                    135:        return error(0,lc,s,a0,a1,a2,a3);
                    136: }
                    137: 
                    138: int error(int t, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3)
                    139: {
                    140:        return error(t,&dummy_loc,s,a0,a1,a2,a3);
                    141: }
                    142: 
                    143: int suppress_error;
                    144: 
                    145: int error(int t, loc* lc, const char* s, const ea& a0, const ea& a1, const ea& a2, const ea& a3)
                    146: /*
                    147:        "int" not "void" because of "pch" in lex.c
                    148: 
                    149:        legal error types are:
                    150:                'w'             warning  (not counted in error count)
                    151:                'd'             debug
                    152:                's'             "not implemented" message
                    153:                'l'             "compiler limit exceeded" message
                    154:                0               error 
                    155:                'i'             internal error (causes abort)
                    156:                't'             error while printing error message
                    157: */
                    158: {
                    159:        if (suppress_error) return 0;
                    160: 
                    161:        if (in_error++)
                    162:                if (t == 't')
                    163:                        t = 'i';
                    164:                else if (4 < in_error) {
                    165:                        fprintf(stderr,"\nOops!, error while handling error\n");
                    166:                        ext(13);
                    167:                }
                    168: 
                    169:        FILE * of = out_file;
                    170:        out_file = stderr;
                    171: 
                    172:        if (!scan_started || t=='t')
                    173:                putch('\n');
                    174:        else if (lc != &dummy_loc)
                    175:                lc->put(out_file);
                    176:        else
                    177:                print_loc();
                    178: 
                    179:        switch (t) {
                    180:        case 0:
                    181:                putstring("error: ");
                    182:                break;
                    183:         case 'w':
                    184:                no_of_warnings++;
                    185:                putstring("warning: ");
                    186:                break;
                    187:         case 'l':
                    188:                putstring("compiler limit exceeded: ");
                    189:                break;
                    190:         case 's':
                    191:                putstring("sorry, not implemented: ");
                    192:                break;
                    193:         case 'i':
                    194:                if (error_count++) {
                    195:                        fprintf(out_file,"sorry, %s cannot recover from earlier errors\n",prog_name);
                    196:                        ext(INTERNAL);
                    197:                }
                    198:                else
                    199:                        fprintf(out_file,"internal %s error: ",prog_name);
                    200:         }
                    201: 
                    202:        ea argv[4];
                    203:        ea* a = argv;
                    204:        argv[0] = a0;
                    205:        argv[1] = a1;
                    206:        argv[2] = a2;
                    207:        argv[3] = a3;
                    208: 
                    209:        int c;
                    210: 
                    211:        while (c = *s++) {
                    212:                if ('A'<=c && c<='Z')
                    213:                        putstring(abbrev_tbl[c-'A']);
                    214:                else if (c == '%') {
                    215:                        switch (c = *s++) {
                    216:                        case 'k':       // TOK assumed passed as an int
                    217:                        {       TOK x = TOK(a->i);
                    218:                                if (0<x && x<=MAXTOK && keys[x])
                    219:                                        fprintf(out_file," %s",keys[x]);
                    220:                                else
                    221:                                        fprintf(out_file," token(%d)",x);
                    222:                                break;
                    223:                        }
                    224:                        case 't':       // Ptype 
                    225:                        {       Ptype tt = Ptype(a->p);
                    226:                                if (tt == 0) break;
                    227: 
                    228:                                putch(' ');
                    229:                        
                    230:                                extern int ntok;
                    231:                                int nt = ntok;
                    232:                                emode = 1;
                    233:                                tt->dcl_print(0);
                    234:                                emode = 0;
                    235:                                ntok = nt;
                    236:                                break;
                    237:                        }
                    238:                        case 'n':       // Pname
                    239:                        {       Pname nn = Pname(a->p);
                    240:                                if (nn && nn->string) {
                    241:                                        // suppress generated class names:
                    242:                                        if (nn->string[0]=='_'
                    243:                                        && nn->string[1]=='_'
                    244:                                        && nn->string[2]=='C') break;
                    245:                                        emode = 1;
                    246:                                        putch(' ');
                    247:                                        nn->print();
                    248:                                        emode = 0;
                    249:                                }
                    250:                                else
                    251:                                        putstring(" ?");
                    252:                                break;
                    253:                        }
                    254:                        case 'p':       // pointer
                    255:                        {       char* f = sizeof(char*)==sizeof(int)?" %d":" %ld";
                    256:                                fprintf(out_file,f,a->p);
                    257:                                break;
                    258:                        }
                    259:                        case 'c':       // char assumed passed as an int
                    260:                                putch(a->i);
                    261:                                break;
                    262: 
                    263:                        case 'd':       // int
                    264:                                fprintf(out_file," %d",a->i);
                    265:                                break;
                    266: 
                    267:                        case 's':       // char*
                    268: char *s = ((char *)a->p);
                    269: if ( s )
                    270:                                putst((char*)a->p);
                    271:                                break;
                    272:                        }
                    273:                        a++;
                    274:                }
                    275:                else
                    276:                        putch(c);
                    277:        }
                    278: 
                    279:        if (!scan_started && t!='d') ext(4);
                    280: /*
                    281:        switch (t) {
                    282:        case 'd':
                    283:        case 't':
                    284:        case 'w':
                    285:                putch('\n');
                    286:                break;
                    287:        default:
                    288: */
                    289:                print_context();
                    290: /*
                    291:        }
                    292: */
                    293:        fflush(stderr);
                    294:     /* now we may want to carry on */
                    295: 
                    296:        out_file = of;
                    297: 
                    298:        switch (t) {
                    299:        case 't':
                    300:                if (--in_error) return 0;
                    301:        case 'i': 
                    302:                ext(INTERNAL);
                    303:        case 0:
                    304:        case 'l':
                    305:        case 's':
                    306:                if (MAXERR<++error_count) {
                    307:                        fprintf(stderr,"Sorry, too many errors\n");
                    308:                        ext(7);
                    309:                }
                    310:        }
                    311: 
                    312:        in_error = 0;
                    313:        return 0;
                    314: }

unix.superglobalmegacorp.com

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