Annotation of coherent/b/bin/c/n3/dbgt3.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n3/dbgt3.c
                      3:  * Print debug information.
                      4:  * In VASM mode, we buffer DLABELS until their DLOCAT arrives.
                      5:  */
                      6: 
                      7: #ifdef vax
                      8: #include "INC$LIB:cc3.h"
                      9: #else
                     10: #include "cc3.h"
                     11: #endif
                     12: 
                     13: struct dsave {
                     14:        int     d_ref;
                     15:        struct dsave *d_next;
                     16:        struct dsave *d_more;
                     17:        char    d_buf[];
                     18: };
                     19: 
                     20: extern struct dsave *dbtget();
                     21: extern struct dsave *dbtmake();
                     22: extern struct dsave *dbtmore();
                     23: struct dsave *dsave = NULL;
                     24: int    drefnum;
                     25: int    dbtisline;
                     26: 
                     27: /*
                     28:  * Debug type, dim, class names.
                     29:  */
                     30: char *dnames[] = {
                     31:        NULL,           /* No type (yet) */
                     32:        "char",         /* Char */
                     33:        "uchar",        /* Unsigned char */
                     34:        "short",        /* Short */
                     35:        "ushort",       /* Unsigned short */
                     36:        "int",          /* Int */
                     37:        "uint",         /* Unsigned int */
                     38:        "long",         /* Long */
                     39:        "ulong",        /* Unsigned long */
                     40:        "float",        /* Float */
                     41:        "double",       /* Double */
                     42:        "void",         /* void */
                     43:        "struct",       /* Struct */
                     44:        "union",        /* Union */
                     45:        "enum",         /* Enumeration */
                     46:        "ptr",          /* Pointer */
                     47:        "func",         /* Function returning */
                     48:        "array",        /* Array */
                     49:        NULL,           /* Structure member list */
                     50:        NULL,           /* Structure name */
                     51:        NULL,           /* Unused */
                     52:        "static",       /* Static external */
                     53:        NULL,           /* Global def. */
                     54:        "extern",       /* Global ref. */
                     55:        "typedef",      /* Typedef name */
                     56:        "struct",       /* Structure tag */
                     57:        "union",        /* Union tag */
                     58:        "enum",         /* Enumeration tag */
                     59:        "source file",  /* Source file name */
                     60:        NULL,           /* Line number item */
                     61:        "label",        /* Label */
                     62:        "auto",         /* Auto */
                     63:        NULL,           /* Parametric auto */
                     64:        "register",     /* Register */
                     65:        "register",     /* Parametric register */
                     66:        "static",       /* Static internal */
                     67:        NULL,           /* Member of enumeration */
                     68:        NULL,           /* Function call */
                     69:        NULL,           /* Member of structure */
                     70:        NULL            /* Member of union */
                     71: };
                     72: 
                     73: 
                     74: 
                     75: /*
                     76:  * Print out or save debug name and type information.
                     77:  */
                     78: cc3dbug()
                     79: {
                     80:        struct dsave *dp;
                     81: 
                     82:        dbtisline = 0;
                     83:        dp = dbtget(1);
                     84:        dp->d_ref = drefnum;
                     85:        dbtnext(dp);
                     86:        if (notvariant(VASM)
                     87:         || (dbtisline==0 && dp == dsave))
                     88:                dbtput(drefnum);
                     89:        drefnum += 1;
                     90: }
                     91: 
                     92: /*
                     93:  * Report the location of a debug label
                     94:  * or print the label information saved.
                     95:  */
                     96: cc3dloc()
                     97: {
                     98:        register int n;
                     99: 
                    100:        n = iget();
                    101:        if (isvariant(VASM))
                    102:                dbtput(n);
                    103:        else
                    104:                fprintf(ofp, " debug location #%d\n", n);
                    105: }
                    106: 
                    107: char dbtbuf[2048];     /* Buffer for accumulating information */
                    108: 
                    109: struct dsave *
                    110: dbtget(indent)
                    111: {
                    112:        register char *p;
                    113:        register int n;
                    114:        struct dsave *dp;
                    115:        int nline;
                    116:        static char vstr[] = " " I_FMT;
                    117:        static char sstr[] = " %s";
                    118:        static char qstr[] = " '%s'";
                    119:        static char fstr[] = ":%d";
                    120: 
                    121:        dp = NULL;
                    122:        p = dbtbuf;
                    123:        *p = 0;
                    124:        /* Indent */
                    125:        if (isvariant(VASM) || indent > 1)
                    126:                for (n=0; n<indent; n+=1)
                    127:                        *p++ = '\t';
                    128:        /* Get class */
                    129:        n = bget();
                    130: 
                    131:        /* Get line number */
                    132:        nline = iget();
                    133: 
                    134:        sprintf(p, "line %d:", nline);
                    135:        p += strlen(p);
                    136:        if (dnames[n] != NULL) {
                    137:                sprintf(p, sstr, dnames[n]);
                    138:                p += strlen(p);
                    139:        }
                    140: 
                    141:        if (n==DC_LINE || n==DC_LAB)
                    142:                dbtisline = 1;
                    143:        /* Get value */
                    144:        if (n < DC_AUTO)
                    145:                ;
                    146:        else if (n < DC_MOS) {
                    147:                sprintf(p, vstr, iget());
                    148:                p += strlen(p);
                    149:        } else {
                    150:                int w, s;
                    151: 
                    152:                w = bget();             /* Width */
                    153:                s = bget();             /* Offset */
                    154:                if (w != 0) {
                    155:                        sprintf(p, " (width:%d, shift:%d)", w, s);
                    156:                        p += strlen(p);
                    157:                }
                    158:                sprintf(p, fstr, iget());               /* Value */
                    159:                p += strlen(p);
                    160:        }
                    161: 
                    162:        /* Get name */
                    163:        sget(id, NCSYMB);
                    164:        sprintf(p, qstr, id);
                    165:        p += strlen(p);
                    166: 
                    167:        /* Get type */
                    168:        for (;;) {
                    169:                n = bget();
                    170:                if (n < DC_SEX) {
                    171:                        if (dnames[n] != NULL) {
                    172:                                sprintf(p, sstr, dnames[n]);
                    173:                                p += strlen(p);
                    174:                        }
                    175:                        if (n < DX_MEMBS) {
                    176:                                sizeof_t size;
                    177: 
                    178:                                size = zget();
                    179:                                if (n != DT_NONE && n != DD_FUNC) {
                    180:                                        sprintf(p, ":%ld", (long)size);
                    181:                                        p += strlen(p);
                    182:                                }
                    183:                        }
                    184:                        if (n == DX_MEMBS) {
                    185:                                ++indent;
                    186:                                n = zget();
                    187:                                sprintf(p, " %d {\n", n);
                    188:                                dp = dbtmake();
                    189:                                for ( ; n > 0; n-=1)
                    190:                                        dbtmore(dp, dbtget(indent));
                    191:                                --indent;
                    192:                                p = dbtbuf;
                    193:                                strcpy(p, "\t}");
                    194:                                p += strlen(p);
                    195:                                break;
                    196:                        } else if (n == DX_NAME) {
                    197:                                zget();
                    198:                                sget(id, NCSYMB);
                    199:                                sprintf(p, qstr, id);
                    200:                                p += strlen(p);
                    201:                                break;
                    202:                        } else if (n < DT_STRUCT)
                    203:                                break;
                    204:                } else
                    205:                        cbotch("unrecognized type byte: %d", n);
                    206:        }
                    207: 
                    208:        /* Done */
                    209:        sprintf(p, "\n");
                    210:        return (dbtmore(dp, dbtmake()));
                    211: }
                    212: 
                    213: dbtnext(dp)
                    214: struct dsave *dp;
                    215: {
                    216:        register struct dsave **dpp;
                    217: 
                    218:        dpp = &dsave;
                    219:        while (*dpp != NULL)
                    220:                dpp = &(*dpp)->d_next;
                    221:        *dpp = dp;
                    222: }
                    223: dbtput(n)
                    224: {
                    225:        register struct dsave *dp, *dp1;
                    226: 
                    227:        while ((dp = dsave) != NULL) {
                    228:                if (dp->d_ref > n)
                    229:                        break;
                    230:                dsave = dp->d_next;
                    231:                if (isvariant(VASM))
                    232:                        fputs(CMTSTR, ofp);
                    233:                fputs(dp->d_buf, ofp);
                    234:                dp1 = dp->d_more;
                    235:                free(dp);
                    236:                while (dp1 != NULL) {
                    237:                        if (isvariant(VASM))
                    238:                                fputs(CMTSTR, ofp);
                    239:                        fputs(dp1->d_buf, ofp);
                    240:                        dp = dp1;
                    241:                        dp1 = dp->d_more;
                    242:                        free(dp);
                    243:                }
                    244:        }
                    245: }
                    246: struct dsave *
                    247: dbtmake()
                    248: {
                    249:        register struct dsave *dp;
                    250: 
                    251:        dp = (struct dsave *)malloc(sizeof(*dp) + strlen(dbtbuf) + 1);
                    252:        if (dp == NULL)
                    253:                cnomem("dbtmake");
                    254:        dp->d_ref = -1;
                    255:        dp->d_next = dp->d_more = NULL;
                    256:        strcpy(dp->d_buf, dbtbuf);
                    257:        return (dp);
                    258: }
                    259: 
                    260: struct dsave *
                    261: dbtmore(dp, mdp)
                    262: struct dsave *dp, *mdp;
                    263: {
                    264:        register struct dsave **dpp;
                    265: 
                    266:        if (dp == NULL)
                    267:                return (mdp);
                    268:        for (dpp = &dp->d_more; *dpp != NULL; dpp = &(*dpp)->d_more)
                    269:                ;
                    270:        *dpp = mdp;
                    271:        return (dp);
                    272: }
                    273: 
                    274: /* end of n3/dbgt3.c */

unix.superglobalmegacorp.com

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