Annotation of researchv10no/cmd/sdb/display.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)display.c 4.2 2/28/81";
                      2: #include "head.h"
                      3: #include <a.out.h>
                      4: #include <stab.h>
                      5: #include "cdefs.h"
                      6: struct user u;
                      7: BKPTR  bkpthead;
                      8: 
                      9: #ifdef FLEXNAMES
                     10: #define        bread(a,b,c)    stread(b,c)
                     11: #define        blseek(a,b,c)   stseek(b,c)
                     12: #endif
                     13: 
                     14: /* initialize frame pointers to top of call stack */
                     15: /*  MACHINE DEPENDENT */
                     16: struct proct *
                     17: initframe() {
                     18:        argp = *(ADDR *) (((ADDR) &u) + AP);
                     19:        frame = *(ADDR *) (((ADDR) &u) + FP);
                     20:        callpc = *(ADDR *) (((ADDR) &u) + PC);
                     21:        if ((frame == 0) || (frame & 0xf0000000 != 0x70000000))
                     22:                return(badproc);
                     23:        return(adrtoprocp(callpc++));  /* ++ because UNIX backs up instrs */
                     24: }
                     25: 
                     26: 
                     27: struct proct *
                     28: nextframe() {
                     29:        callpc = get(frame+16, DSP);
                     30:        argp = get(frame+8, DSP);
                     31:        frame = get(frame+12, DSP) & EVEN;
                     32:        if (callpc > 0x70000000) {
                     33:                /* error handler kludge */
                     34:                callpc = get(frame+64, DSP);
                     35:                argp = get(frame+8, DSP);
                     36:                frame = get(frame+12, DSP) & EVEN;
                     37:        }
                     38:        if ((frame == 0) || (frame & 0xf0000000 != 0x70000000))
                     39:                return(badproc);
                     40:        return(adrtoprocp(callpc-1));
                     41: }
                     42: 
                     43: /* returns core image address for variable */
                     44: /*  MACHINE DEPENDENT */
                     45: ADDR
                     46: formaddr(class, addr)
                     47: register char class;
                     48: ADDR addr; {
                     49: if (debug) printf("formaddr(%o, %d)\n", class & 0377, addr);
                     50:        switch(class & STABMASK) {
                     51:        case N_RSYM:
                     52:                return(stackreg(addr));
                     53:        case N_GSYM:
                     54:        case N_SSYM:
                     55:        case N_STSYM:
                     56:        case N_LCSYM:
                     57:                return(addr);
                     58:                
                     59:        case N_PSYM:
                     60:                return(argp+addr);
                     61:                
                     62:        case N_LSYM:
                     63:                return(frame+addr);
                     64: 
                     65:        default:
                     66:                printf("Bad class in formaddr: 0%o",
                     67:                        class & 0377);
                     68:                return(0);
                     69:        }
                     70: }
                     71: 
                     72: char class;
                     73: 
                     74: /*
                     75:  *  stackreg(reg):
                     76:  * If the register for the current frame is somewhere on the stack
                     77:  * then return the address of where it is, otherwise its still in
                     78:  * the register so return the register number.
                     79:  * We distinguish the two by noting that register numbers are less
                     80:  * than 16 and that stack addresses are greater.
                     81:  *
                     82:  *  MACHINE DEPENDENT
                     83:  */
                     84: ADDR
                     85: stackreg(reg) {
                     86:        register int curframe, regfl, mask, i;
                     87:        struct proct *procp;
                     88:        ADDR regaddr;
                     89: 
                     90:        curframe = frame;
                     91:        regaddr = reg;
                     92:        regfl = 0x10000 << reg;
                     93:        for (procp=initframe(); frame!=curframe; procp=nextframe()) {
                     94:                if (procp == badproc) {
                     95:                        error("Stackreg error: frame");
                     96:                        return(-1);
                     97:                }
                     98:                mask = get(frame+4, DSP);
                     99:                if (mask & regfl) {
                    100:                        regaddr = frame + 20;
                    101:                        for (i=0; i<reg; i++) {
                    102:                                if (mask & 0x10000)
                    103:                                        regaddr += WORDSIZE;
                    104:                                mask = mask >> 1;
                    105:                        }
                    106:                        if (!(mask & 0x10000)) {
                    107:                                error("Stackreg error: contents");
                    108:                                return(-1);
                    109:                        }
                    110:                }
                    111:        }
                    112:        return(regaddr);
                    113: }
                    114: 
                    115: /* returns address of proc:var. Sets externals class and subflag */
                    116: ADDR
                    117: varaddr(proc, var)
                    118: char *proc, *var; {
                    119:        return(findvar(proc, var, "", 0));
                    120: }
                    121: 
                    122: /*
                    123:  * displays values of variables matching proc:var, 
                    124:  * returns its address
                    125:  */
                    126: ADDR
                    127: dispvar(proc, var, fmt)
                    128: char *proc, *var, *fmt; {
                    129:        return(findvar(proc, var, fmt, 1));
                    130: }
                    131: 
                    132: /*
                    133:  * Find and print values of all variables matching proc:var
                    134:  *     using specified format.
                    135:  * Returns address of last matching variable.
                    136:  *
                    137:  * prvar==0 => no output,
                    138:  * prvar==1 => output value,
                    139:  * prvar==2 => output addr
                    140:  */
                    141: ADDR
                    142: findvar(proc, var, fmt, prvar)
                    143: char *proc, *var, *fmt; {
                    144:        ADDR addr = -1, a = -1;
                    145:        int metaflag = 0, match=0, nullflag=0, depthcnt = -1;
                    146:        char *comblk;
                    147:        register struct proct *procp;
                    148: 
                    149:        if (percentflag) {      /* kludge for register names */
                    150:                return(regout(var, prvar, fmt));
                    151:        }
                    152: 
                    153:        if (var[0] == '\0') {
                    154:                error("Unexpected null variable name");
                    155:                return(-1);
                    156:        }
                    157: 
                    158:        metaflag = eqany('*', proc) || eqany('?', proc) ||
                    159:                eqany('*', var) || eqany('?', var);
                    160:        
                    161:        if (proc[0] == '\0') {
                    162:                nullflag++;
                    163:                proc = curproc()->pname;
                    164:        }
                    165: 
                    166:        comblk = colonflag ? "" : "*";
                    167: 
                    168:        if (integ && !eqany(var[0], "->.[")) {  
                    169:                depthcnt = integ;
                    170:        }
                    171:        if (integ) {
                    172:                if (eqany(var[0], "->.[")) 
                    173:                        match++;
                    174:                else
                    175:                        depthcnt = integ;
                    176:        }
                    177: 
                    178:        procp = initframe();
                    179:        if (!eqany(var[0], "->.[") && !(nullflag && colonflag)) {
                    180:                do {
                    181:                        if (eqpat(proc, procp->pname)) {
                    182:                                match++;
                    183:                                if (--depthcnt==0 || integ==0) {
                    184:                                        a = outvar(procp->pname, var, fmt,
                    185:                                                metaflag, integ, N_GSYM, 
                    186:                                                0, prname, comblk, prvar);
                    187:                                        if (a != -1)
                    188:                                                addr = a;
                    189:                                        if (depthcnt == 0)
                    190:                                                break;
                    191:                                }
                    192:                        }
                    193:                } while ((procp=nextframe()) != badproc);
                    194:        }
                    195: 
                    196:        if ((colonflag || metaflag || a == -1) && 
                    197:                        (nullflag || eqpat(proc, ""))) {
                    198:                a = outvar("", var, fmt, metaflag, integ,
                    199:                        N_GSYM, 0, prname, comblk, prvar);
                    200:                if (a != -1) {
                    201:                        addr = a;
                    202:                        match++;
                    203:                }
                    204:        }
                    205: 
                    206:        if (match==0 && colonflag) {
                    207:                procp = initframe();
                    208:                do {
                    209:                        if (eqstr(curproc()->pname, procp->pname))
                    210:                                break;
                    211:                } while ((procp=nextframe()) != badproc);
                    212:                a = outvar(curproc()->pname, var, fmt, metaflag,
                    213:                        integ, N_GSYM, 0, prname, 
                    214:                        nullflag ? "_BLNK_" : proc, prvar);
                    215:                if (a != -1) {
                    216:                        addr = a;
                    217:                        match++;
                    218:                }
                    219:        }
                    220: 
                    221:        if (addr == -1 && match == 0) {
                    222:                addr = extoutvar(var, fmt, metaflag, prvar);
                    223:                if (addr != -1)
                    224:                        return(addr);
                    225:        }
                    226:        if (match == 0) {
                    227:                printf("%s not an active procedure\n", proc);
                    228:                return(-1);
                    229:        }
                    230:        if (addr == -1) {
                    231:                if (var[0] == '.')
                    232:                        var++;
                    233:                if (proc[0])
                    234: #ifndef FLEXNAMES
                    235:                        printf("%.16s:%s not found\n", proc, var);
                    236: #else
                    237:                        printf("%s:%s not found\n", proc, var);
                    238: #endif
                    239:                else
                    240:                        printf("%s not found\n", var);
                    241:                return(-1);
                    242:        }
                    243:        return(addr);
                    244: }
                    245: 
                    246: char *
                    247: typetodesc(type, subflag)
                    248: short type; {
                    249:        register int ptr, ftn, ary;
                    250:        register char *desc;
                    251:        register int base;
                    252:        
                    253:        static char *typedesc[MAXTYPE+1] = {
                    254:                "d",  /* undef */
                    255:                "d",  /* farg */
                    256:                "c",  /* char */
                    257:                "hd",  /* short */
                    258:                "d",  /* int */
                    259:                "ld",  /* long */
                    260:                "f",  /* float */
                    261:                "g",  /* double */
                    262:                "d",  /* strty */
                    263:                "d",  /* unionty */
                    264:                "d",  /* enumty */
                    265:                "d",  /* moety */
                    266:                "bu",  /* uchar */
                    267:                "hu",  /* ushort */
                    268:                "u",  /* unsigned */
                    269:                "lu",  /* ulong */
                    270:                "d"   /* void */
                    271:        };
                    272: 
                    273:        ptr = ftn = ary = 0;
                    274:        if ((base = type & BTMASK) > MAXTYPE)
                    275:                base = 0;
                    276:        desc = typedesc[base];
                    277:        for (; type & TMASK; type = DECREF(type)) {
                    278:                if (ISPTR(type)) ptr++;
                    279:                else if (ISFTN(type)) ftn++;
                    280:                else if (ISARY(type)) ary++;
                    281:        }
                    282:        
                    283:        if ((ptr-subflag == 1  || ary-subflag == 1)  &&  desc[0] == 'c')
                    284:                return("s");
                    285:        if (debug)
                    286:                printf ("PTR %d; FTN %d; ARY %d; DESC %s\n",ptr,ftn,ary,desc);
                    287:        if (ptr + ary ==  subflag)
                    288:                return(desc);
                    289:        if (ptr) return("x");
                    290:        if (ptr==1 && ftn==1) return("p");
                    291:        return(desc);
                    292: }
                    293: 
                    294: typetosize(type, stsize)
                    295: short type; {
                    296:        register int ptr, ftn, ary;
                    297:        register int size;
                    298:        register int base;
                    299:        
                    300:        static char typesize[MAXTYPE+1] = {
                    301:                4,  /* undef */
                    302:                4,  /* farg */
                    303:                1,  /* char */
                    304:                2,  /* short */
                    305:                WORDSIZE,  /* int */
                    306:                4,  /* long */
                    307:                4,  /* float */
                    308:                8,  /* double */
                    309:                0,  /* strty */
                    310:                0,  /* unionty */
                    311:                4,  /* enumty */
                    312:                4,  /* moety */
                    313:                1,  /* uchar */
                    314:                2,  /* ushort */
                    315:                4,  /* unsigned */
                    316:                4,  /* ulong */
                    317:                4   /* void */
                    318:        };
                    319: 
                    320:        ptr = ftn = ary = 0;
                    321:        if ((base = type & BTMASK) > MAXTYPE)
                    322:                base = 0;
                    323:        size = typesize[base];
                    324:        for (; type & TMASK; type = DECREF(type)) {
                    325:                if (ISPTR(type)) ptr++;
                    326:                else if (ISFTN(type)) ftn++;
                    327:                else if (ISARY(type)) ary++;
                    328:        }
                    329: 
                    330:        if (debug)
                    331:                printf ("PTR %d; FTN %d; ARY %d; SIZE %d; STSIZE %d\n",
                    332:                                ptr,ftn,ary,size,stsize);
                    333:        if (ptr>1) return(4);
                    334:        if (size == 0) return(stsize);
                    335:        else return(size);
                    336: }
                    337: 
                    338: 
                    339: /* print breakpoints */
                    340: prbkpt() {
                    341:        register BKPTR bkptr;
                    342:        register int cnt;
                    343:        char *cmdp;
                    344: 
                    345:        cnt = 0;
                    346:        
                    347:        for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
                    348:                if (bkptr->flag) {
                    349:                        cnt++;
                    350:                        printbkpt("", adrtoprocp(bkptr->loc), bkptr->loc);
                    351:                        cmdp = bkptr->comm;
                    352:                        if (*cmdp != '\n') {
                    353:                                printf("   <");
                    354:                                while (*cmdp != '\n')
                    355:                                        printf("%c", *cmdp++);
                    356:                                printf(">\n");
                    357:                        }
                    358:                        else
                    359:                                printf("\n");
                    360:                }
                    361:        if (cnt == 0) 
                    362:                printf("No breakpoints set\n");
                    363: }
                    364: 
                    365: /* interactively delete breakpoints */
                    366: 
                    367: idbkpt() {
                    368:        register BKPTR bkptr;
                    369:        register int yesflg, cnt;
                    370:        register char c;
                    371:        
                    372:        cnt = 0;
                    373: 
                    374:        for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
                    375:                if (bkptr->flag) {
                    376:                        printbkpt(" ? ", adrtoprocp(bkptr->loc), bkptr->loc);
                    377:                        yesflg = 0;
                    378:                        cnt++;
                    379:                        do {
                    380:                                c = getchar();
                    381:                                if (c == 'y' || c == 'd') yesflg++;
                    382:                        } while (c != '\n');
                    383:                        if (yesflg)
                    384:                                bkptr->flag = 0;
                    385:                }
                    386:        if (cnt == 0)
                    387:                printf("No breakpoints set\n");
                    388: }
                    389: 
                    390: /* delete all breakpoints */
                    391: 
                    392: dabkpt() {
                    393:        register BKPTR bkptr;
                    394:        
                    395:        for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
                    396:                bkptr->flag = 0;
                    397: }
                    398:  
                    399: /* 
                    400:  * Print name of breakpoint for a, b, d commands:
                    401:  */
                    402: printbkpt(s, procp, dot)
                    403: char *s; struct proct *procp; ADDR dot; {
                    404:        adrtolineno(dot);
                    405:        if (dot != lnfaddr)
                    406:                printf("0x%x (", dot);
                    407:        prlnoff(procp, dot);
                    408:        if (dot != lnfaddr)
                    409:                printf(")");
                    410:        printf("%s", s);
                    411: }
                    412: 
                    413: /* print call frame */
                    414: prframe() {
                    415:        prfrx(0);
                    416: }
                    417: 
                    418: /* set top to print just the top procedure */
                    419: prfrx(top) {
                    420:        int narg;
                    421:        long offset;
                    422:        register char class;
                    423:        register int endflg;
                    424:        char *p;
                    425:        struct proct *procp;
                    426:        struct nlist stentry;
                    427:        
                    428:        if ((procp = initframe()) == badproc) return;
                    429:        do {
                    430:                if (get(frame+12, DSP) == 0) return;
                    431:                p = procp->pname;
                    432:                if (eqstr("__dbsubc", p)) return;
                    433:                if (p[0] == '_') {
                    434:                        endflg = 1;
                    435: #ifndef FLEXNAMES
                    436:                        printf("%.15s(", p+1);
                    437: #else
                    438:                        printf("%s(", p+1);
                    439: #endif
                    440:                }
                    441:                else {
                    442: #ifndef FLEXNAMES
                    443:                        printf("%.16s(", p);
                    444: #else
                    445:                        printf("%s(", p);
                    446: #endif
                    447:                        endflg = 0;
                    448:                }
                    449:                if (endflg == 0) {
                    450:                        offset = procp->st_offset;
                    451:                        blseek(&sbuf, offset, 0);
                    452:                        do {
                    453:                                if (bread(&sbuf, &stentry, sizeof stentry) <
                    454:                                                        sizeof stentry) {
                    455:                                        endflg++;
                    456:                                        break;
                    457:                                }
                    458:                                class = stentry.n_type & STABMASK;
                    459:                        } while (class == N_FUN);
                    460:                        while (class != N_PSYM) {
                    461:                                if (bread(&sbuf, &stentry, sizeof stentry) <
                    462:                                                        sizeof stentry) {
                    463:                                        endflg++;
                    464:                                        break;
                    465:                                }
                    466:                                class = stentry.n_type & STABMASK;
                    467:                                if (class == N_FUN) {
                    468:                                        endflg++;
                    469:                                        break;
                    470:                                }
                    471:                        }
                    472:                }
                    473: 
                    474:                narg = get(argp, DSP);
                    475:                if (narg & ~0xff) narg = 0;
                    476:                argp += WORDSIZE;
                    477:                while (narg) {
                    478:                        if (endflg) {
                    479:                                printf("%d", get(argp, DSP));
                    480:                                argp += 4;
                    481:                        } else {
                    482:                                int length;
                    483: #ifndef FLEXNAMES
                    484:                                printf("%.16s=", stentry.n_name);
                    485: #else
                    486:                                printf("%s=", stentry.n_un.n_name);
                    487: #endif
                    488:                                dispx(argp, "", N_GSYM, stentry.n_desc,
                    489:                                        0, 0, DSP);
                    490:                                length = typetosize(stentry.n_desc, 0);
                    491:                                if (length > WORDSIZE)
                    492:                                        argp += length;
                    493:                                else
                    494:                                        argp += WORDSIZE;
                    495:                        }
                    496:                        do {
                    497:                                if (endflg) break;
                    498:                                if (bread(&sbuf, &stentry, sizeof stentry) <
                    499:                                                        sizeof stentry) {
                    500:                                        endflg++;
                    501:                                        break;
                    502:                                }
                    503:                                class = stentry.n_type & STABMASK;
                    504:                                if (class == N_FUN) {
                    505:                                        endflg++;
                    506:                                        break;
                    507:                                }
                    508:                        } while (class != N_PSYM);
                    509:                l1:     if (--narg != 0) printf(",");
                    510:                }
                    511:                printf(")");
                    512:                if (debug) printf("  @ 0x%x ", callpc);
                    513:                if (procp->sfptr != badfile)
                    514:                        printf("   [%s:%d]", adrtofilep(callpc-1)->sfilename,
                    515:                                adrtolineno(callpc-1));
                    516:                printf("\n");
                    517:        } while (((procp = nextframe()) != badproc) && !top);
                    518: }
                    519: 
                    520: INT            signo;
                    521: STRING         signals[];
                    522: extern nsig;
                    523: sigprint()
                    524: {
                    525: 
                    526:        if (signo < nsig)
                    527:                printf("%s", signals[signo]);
                    528:        else
                    529:                printf("signal %d???", signals[signo]);
                    530: }

unix.superglobalmegacorp.com

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