Annotation of researchv9/cmd/adb/comm/print.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *
                      3:  *     UNIX debugger
                      4:  *
                      5:  */
                      6: #include "defs.h"
                      7: #include "regs.h"
                      8: #include "sym.h"
                      9: #include "bkpt.h"
                     10: #include "map.h"
                     11: #include "space.h"
                     12: 
                     13: extern int     infile;
                     14: extern int     outfile;
                     15: extern int     maxpos;
                     16: extern int     radix;
                     17: extern char    lastc;
                     18: extern int     maxargs;
                     19: 
                     20: /* general printing routines ($) */
                     21: 
                     22: char   *Ipath = "/usr/lib/adb";
                     23: 
                     24: printtrace(modif)
                     25: {
                     26:        int     i;
                     27:        register BKPT *bk;
                     28:        register struct sym *sp;
                     29:        int     stack;
                     30:        char    *fname;
                     31:        char    *getfname();
                     32: 
                     33:        if (cntflg==0)
                     34:                cntval = -1;
                     35:        switch (modif) {
                     36: 
                     37:        case '<':
                     38:                if (cntval == 0) {
                     39:                        while (readchar() != EOR)
                     40:                                ;
                     41:                        reread();
                     42:                        break;
                     43:                }
                     44:                if (rdc() == '<')
                     45:                        stack = 1;
                     46:                else {
                     47:                        stack = 0;
                     48:                        reread();
                     49:                }
                     50:                fname = getfname();
                     51:                redirin(stack, fname);
                     52:                break;
                     53: 
                     54:        case '>':
                     55:                fname = getfname();
                     56:                redirout(fname);
                     57:                break;
                     58: 
                     59:        case 'p':
                     60:                kmproc();
                     61:                break;
                     62: 
                     63:        case 'k':
                     64:                kmsys();
                     65:                break;
                     66: 
                     67:        case 'd':
                     68:                if (adrflg) {
                     69:                        if (adrval != 0
                     70:                        &&  (adrval<2 || adrval>16))
                     71:                                error("radix should be between 2 and 16, or 0");
                     72:                        radix = adrval;
                     73:                        if (radix)
                     74:                                printf("radix=%d base ten",radix);
                     75:                        else
                     76:                                printf("radix=magic");
                     77:                }
                     78:                break;
                     79: 
                     80:        case 'q':
                     81:        case 'Q':
                     82:                done();
                     83: 
                     84:        case 'w':
                     85:                maxpos=(adrflg?adrval:MAXPOS);
                     86:                break;
                     87: 
                     88:        case 'S':
                     89:                printsym();
                     90:                break;
                     91: 
                     92:        case 's':
                     93:                maxoff=(adrflg?adrval:MAXOFF);
                     94:                break;
                     95: 
                     96:        case 'v':
                     97:                for (i=0;i<NVARS;i++) {
                     98:                        if (var[i])
                     99:                                printf("%-8R >%c\n", var[i],
                    100:                                        (i<=9 ? '0' : 'a'-10) + i);
                    101:                }
                    102:                break;
                    103: 
                    104:        case 'm':
                    105:                printmap("? map", symmap);
                    106:                printmap("/ map", cormap);
                    107:                break;
                    108: 
                    109:        case 0:
                    110:        case '?':
                    111:                if (pid)
                    112:                        printf("pcs id = %d\n",pid);
                    113:                else
                    114:                        prints("no process\n");
                    115:                sigprint();
                    116:                flushbuf();
                    117: 
                    118:        case 'r':
                    119:        case 'R':
                    120:                printregs(modif);
                    121:                return;
                    122: 
                    123:        case 'c':
                    124:        case 'C':
                    125:                ctrace(modif);
                    126:                break;
                    127: 
                    128:        case 'a':
                    129:                if (adrflg)
                    130:                        maxargs = adrval;
                    131:                else
                    132:                        printf("%R$a\n", maxargs);
                    133:                return;
                    134: 
                    135:                /*print externals*/
                    136:        case 'e':
                    137:                for (sp = symtab; sp; sp = sp->y_next) {
                    138:                        if (sp->y_type==S_DATA)
                    139:                                printf("%s/%12t%R\n", sp->y_name,
                    140:                                        ltow(lget(sp->y_value,CORF|DATASP)));
                    141:                }
                    142:                break;
                    143: 
                    144:                /*print breakpoints*/
                    145:        case 'b':
                    146:        case 'B':
                    147:                for (bk=bkpthead; bk; bk=bk->nxtbkpt)
                    148:                        if (bk->flag) {
                    149:                                psymoff((WORD)bk->loc,INSTSP,"");
                    150:                                if (bk->count != 1)
                    151:                                        printf(",%d", bk->count);
                    152:                                printf(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
                    153:                        }
                    154:                break;
                    155: 
                    156:        default:
                    157:                error("bad `$' command");
                    158:        }
                    159: 
                    160: }
                    161: 
                    162: static
                    163: char *
                    164: getfname()
                    165: {
                    166:        static char fname[ARB];
                    167:        register char *p;
                    168: 
                    169:        if (rdc() == EOR) {
                    170:                reread();
                    171:                return (NULL);
                    172:        }
                    173:        p = fname;
                    174:        do {
                    175:                *p++ = lastc;
                    176:                if (p >= &fname[ARB-1])
                    177:                        error("filename too long");
                    178:        } while (rdc() != EOR);
                    179:        *p = 0;
                    180:        reread();
                    181:        return (fname);
                    182: }
                    183: 
                    184: static
                    185: redirin(stack, file)
                    186: int stack;
                    187: char *file;
                    188: {
                    189:        char pfile[ARB];
                    190: 
                    191:        if (file == NULL) {
                    192:                iclose(-1, 0);
                    193:                return;
                    194:        }
                    195:        iclose(stack, 0);
                    196:        if ((infile = open(file, 0)) < 0) {
                    197:                strcpy(pfile, Ipath);
                    198:                strcat(pfile, "/");
                    199:                strcat(pfile, file);
                    200:                if ((infile = open(pfile, 0)) < 0) {
                    201:                        infile = STDIN;
                    202:                        error("cannot open");
                    203:                }
                    204:        }
                    205:        if (cntflg)
                    206:                var[9] = cntval;
                    207:        else
                    208:                var[9] = 1;
                    209: }
                    210: 
                    211: static
                    212: redirout(file)
                    213: char *file;
                    214: {
                    215: 
                    216:        oclose();
                    217:        if (file == NULL)
                    218:                return;
                    219:        if ((outfile = open(file, 1)) >= 0)
                    220:                lseek(outfile, 0L, 2);
                    221:        else if ((outfile = creat(file, 0666)) < 0) {
                    222:                outfile = STDOUT;
                    223:                error("cannot create");
                    224:        }
                    225: }
                    226: 
                    227: printmap(s,mp)
                    228: char *s;
                    229: register MAP *mp;
                    230: {
                    231:        char *maptype();
                    232: 
                    233:        if (mp == symmap)
                    234:                printf("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil);
                    235:        else if (mp == cormap)
                    236:                printf("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil);
                    237:        else
                    238:                printf("%s\n", s);
                    239:        for (; mp->flag & MPINUSE; mp++)
                    240:                printf("%-8s b = %-16Re = %-16Rf = %-16R\n",
                    241:                    maptype(mp->sp), (WORD)mp->b, (WORD)mp->e, (WORD)mp->f);
                    242: }
                    243: 
                    244: char *
                    245: maptype(sp)
                    246: int sp;
                    247: {
                    248: 
                    249:        switch (sp & SPTYPE) {
                    250:        case INSTSP:
                    251:                return ("text");
                    252:        case DATASP:
                    253:                return ("data");
                    254:        case UBLKSP:
                    255:                return ("user");
                    256:        default:
                    257:                return ("nonsense");
                    258:        }
                    259: }

unix.superglobalmegacorp.com

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