Annotation of coherent/d/bin/cc/c/common/diag.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * These routines write diagnostics for all the compiler phases.
                      3:  * They are do-it-yourself routines because the "printf"
                      4:  * in the VAX-11 C library lacks the undocumented "%r" format.
                      5:  * The routines defined below are:
                      6:  *     cbotch  for internal compiler errors
                      7:  *     cerror  for user program errors (e.g. syntax errors)
                      8:  *     cfatal  for instantly fatal errors (e.g. fixed limits)
                      9:  *     cnomem  for out of memory errors
                     10:  *     cstrict for strict warning messages
                     11:  *     cwarn   for warning messages
                     12:  */
                     13: 
                     14: #include       <stdio.h>
                     15: #include       <setjmp.h>
                     16: #ifdef vax
                     17: #include       "INC$LIB:mch.h"
                     18: #include       "INC$LIB:host.h"
                     19: #include       "INC$LIB:var.h"
                     20: #else
                     21: #include       "mch.h"
                     22: #include       "host.h"
                     23: #include       "var.h"
                     24: #endif
                     25: 
                     26: int    nerr    = 0;                    /* Error counter */
                     27: char   *passname = NULL;               /* Pass identifier string */
                     28: 
                     29: extern int     line;                   /* Line number */
                     30: extern char    file[];                 /* File name */
                     31: extern FILE    *ifp;                   /* Input stream */
                     32: extern long    ftell();                /* Standard I/O routine */
                     33: 
                     34: #if    OVERLAID
                     35: extern jmp_buf death;                  /* Fatal errors */
                     36: #endif
                     37: 
                     38: /*
                     39:  * Put out error.
                     40:  * Bump the error count.
                     41:  */
                     42: cerror(fp, args)
                     43: char   *fp;
                     44: {
                     45:        cmsg(fp, &args, NULL, 0);
                     46:        ++nerr;
                     47: }
                     48: 
                     49: /*
                     50:  * Put out warning.
                     51:  */
                     52: cwarn(fp, args)
                     53: char   *fp;
                     54: {
                     55:        cmsg(fp, &args, "Warning", 0);
                     56: }
                     57: 
                     58: /*
                     59:  * Put out strict check.
                     60:  */
                     61: cstrict(fp, args)
                     62: char   *fp;
                     63: {
                     64:        cmsg(fp, &args, "Strict", 0);
                     65: }
                     66: 
                     67: /*
                     68:  * Put out fatal message and die.
                     69:  */
                     70: cfatal(fp, args)
                     71: char   *fp;
                     72: {
                     73:        cmsg(fp, &args, "Fatal error", 1);
                     74: #if    !OVERLAID
                     75:        exit(ABORT);
                     76: #else
                     77:        longjmp(death, 1);
                     78: #endif
                     79: }
                     80: 
                     81: #if    TINY
                     82: /*
                     83:  * Sanitize a botch message for external consumption.
                     84:  */
                     85: char *botch_message(msg) char *msg;
                     86: {
                     87:        static char newmsg[32];
                     88:        static char digit[] = "0123456789ABCDEF";
                     89:        char *p, *q, c, sw;
                     90:        unsigned crypt;
                     91: 
                     92:        crypt = 0x3141;
                     93:        sw = 0;
                     94:        q = newmsg+4;
                     95:        for(p = msg; c = *p++;) {
                     96:                if(crypt & 0x8000)
                     97:                        crypt ^= 0xE178;
                     98:                crypt = c ^ (crypt << 1);
                     99: 
                    100:                if('%' == c)  /* save the printf token */
                    101:                        sw = 1;
                    102:                if(sw && (' ' == (*q++ = c)))
                    103:                        sw = 0;
                    104:        }
                    105:        *q = '\0';
                    106: 
                    107:        newmsg[3] = digit[crypt&0xF];
                    108:        crypt >>= 4; newmsg[2] = digit[crypt&0xF];
                    109:        crypt >>= 4; newmsg[1] = digit[crypt&0xF];
                    110:        crypt >>= 4; newmsg[0] = digit[crypt&0xF];
                    111:        return newmsg;
                    112: }
                    113: #endif
                    114: 
                    115: /*
                    116:  * Put out botch message and die.
                    117:  * Prepend an informative message if !TINY.
                    118:  */
                    119: cbotch(fp, args)
                    120: char *fp;
                    121: {
                    122: #if    TINY
                    123:        fp = botch_message(fp);
                    124: #endif
                    125:        cmsg(fp, &args, "Internal compiler error: ", 1);
                    126: #if !OVERLAID
                    127:        exit(ABORT);
                    128: #else
                    129:        longjmp(death, 1);
                    130: #endif
                    131: }
                    132: 
                    133: /*
                    134:  * Put out "out of space" error message and die.
                    135:  */
                    136: cnomem(fp, args)
                    137: char *fp;
                    138: {
                    139: #if    !TINY
                    140:        cmsg(fp, &args, "Out of space", 1);
                    141: #endif
                    142:        cfatal("out of space");
                    143: }
                    144: 
                    145: /*
                    146:  * Put out a message.
                    147:  * Tag it with the line number and file name.
                    148:  */
                    149: static
                    150: cmsg(fp, ap, bp, flag)
                    151: char   *fp;
                    152: int    *ap;
                    153: char   *bp;
                    154: {
                    155:        register int    c;
                    156: 
                    157:        if (isvariant(VQUIET))
                    158:                return;
                    159:        if (line != 0)
                    160:                printf("%d: ", line);
                    161:        if (file[0])
                    162:                printf("%s: ", file);
                    163: #if    !TINY
                    164:        if (flag != 0) {
                    165:                if (ifp != NULL)
                    166:                        printf("At %ld: ", ftell(ifp));
                    167: #if    TEMPBUF
                    168:                else if (inbuf != NULL)
                    169:                        printf("At %d: ", inbufp - inbuf);
                    170: #endif
                    171:        }
                    172: #endif
                    173:        if (flag!=0 && passname != NULL)
                    174:                printf("In %s: ", passname);
                    175:        if (bp != NULL)
                    176:                printf("%s: ", bp);
                    177:        while ((c = *fp++) != '\0') {
                    178:                if (c != '%')
                    179:                        putchar(c);
                    180:                else {
                    181:                        c = *fp++;
                    182:                        switch (c) {
                    183:                        case 'd':
                    184:                                printf("%d", *ap++);
                    185:                                break;
                    186:                        case 's':
                    187:                                printf("%s", *((char **)ap)++);
                    188:                                break;
                    189:                        case 'X':
                    190:                                printf("%lx", *((long *)ap)++);
                    191:                                break;
                    192:                        default:
                    193:                                putchar(c);
                    194:                        }
                    195:                }
                    196:        }
                    197:        putchar('\n');
                    198: }

unix.superglobalmegacorp.com

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