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

unix.superglobalmegacorp.com

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