Annotation of coherent/d/bin/db/trace3.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * A debugger.
                      3:  * Display.
                      4:  */
                      5: #include <stdio.h>
                      6: #include <ctype.h>
                      7: #include "trace.h"
                      8: 
                      9: /*
                     10:  * Execute a command string.
                     11:  */
                     12: execute(cp)
                     13: char *cp;
                     14: {
                     15:        register INP *ip;
                     16: 
                     17:        while ((ip=inpp) != NULL) {
                     18:                inpp = ip->i_next;
                     19:                nfree(ip);
                     20:        }
                     21:        modsize = sizeof(int);
                     22:        sincmod = SNULL;
                     23:        dot = getpc();
                     24:        lastc = '\0';
                     25:        addstrp(cp);
                     26:        request();
                     27:        testint();
                     28: }
                     29: 
                     30: /*
                     31:  * Parse requests and execute them.
                     32:  */
                     33: request()
                     34: {
                     35:        register int c;
                     36:        register char *cp;
                     37:        register unsigned segn;
                     38:        register long l;
                     39:        register long d;
                     40:        VAL val[VALSIZE];
                     41: 
                     42:        while ((c=getn()) != EOF) {
                     43:                if (c == '!') {
                     44:                        syscall();
                     45:                        continue;
                     46:                }
                     47:                if (c == '?') {
                     48:                        if ((c=getn()) != '\n') {
                     49:                                printe("Syntax error");
                     50:                                goto next;
                     51:                        }
                     52:                        if (errrstr == NULL)
                     53:                                printx("No error\n");
                     54:                        else
                     55:                                printx("%s\n", errrstr);
                     56:                        continue;
                     57:                }
                     58:                ungetn(c);
                     59:                if (explist(val) == 0)
                     60:                        goto next;
                     61:                switch (c=getn()) {
                     62:                case ':':
                     63:                        sincmod = SNULL;
                     64:                        if (command(val) == 0)
                     65:                                return;
                     66:                        continue;
                     67:                case '\n':
                     68:                        if (nvalue(&val[0]) && sincmod!=SNULL) {
                     69:                                if (excflag == 0) {
                     70:                                        sincmod = SNULL;
                     71:                                        printe("Cannot single step");
                     72:                                        continue;
                     73:                                }
                     74:                                sinmode = sincmod;
                     75:                                sindecr = rvalue(&val[1], (long)1);
                     76:                                return;
                     77:                        }
                     78:                case '=':
                     79:                        ungetn(c);
                     80:                case '?':
                     81:                        sincmod = SNULL;
                     82:                        segn = vsegno(&val[0], cseg);
                     83:                        if ((c=getn()) == '=') {
                     84:                                l = lvalue(&val[0], (long)dot);
                     85:                                if ((c=getn()) == '\n') {
                     86:                                        putaddnum( l);
                     87:                                        printx("\n");
                     88:                                        continue;
                     89:                                }
                     90:                                ungetn(c);
                     91:                                if (setdata(segn, l) == 0)
                     92:                                        break;
                     93:                                continue;
                     94:                        }
                     95:                        if (c != '\n') {
                     96:                                cp = &segform[segn][0];
                     97:                                while (c != '\n') {
                     98:                                        *cp++ = c;
                     99:                                        c = getn();
                    100:                                }
                    101:                                *cp++ = '\0';
                    102:                        }
                    103:                        d = dot;
                    104:                        l = lad;
                    105:                        dot = lvalue(&val[0], (long)lad);
                    106:                        dispfmt(segn, segform[segn],
                    107:                                (int)rvalue(&val[1], (long)1));
                    108:                        if (segn != 2)
                    109:                                cseg = segn;
                    110:                        else {
                    111:                                dot = d;
                    112:                                lad = l;
                    113:                        }
                    114:                        continue;
                    115:                default:
                    116:                        sincmod = SNULL;
                    117:                        printe("Syntax error");
                    118:                        break;
                    119:                }
                    120:        next:
                    121:                while ((c=getn()) != '\n')
                    122:                        ;
                    123:        }
                    124: }
                    125: 
                    126: /*
                    127:  * Change the value of a location.
                    128:  */
                    129: setdata(segn, a)
                    130: long a;
                    131: {
                    132:        register char *cp;
                    133:        register int n;
                    134:        register int c;
                    135:        char b[1];
                    136:        char l3[3];
                    137:        int i[1];
                    138:        long l[1];
                    139:        VAL val[VALSIZE];
                    140: 
                    141:        if (explist(val) == 0)
                    142:                return (0);
                    143:        if ((c=getn()) != '\n')
                    144:                return (0);
                    145:        for (n=0; n<VALSIZE; n++, a+=modsize) {
                    146:                if (nvalue(&val[n]))
                    147:                        continue;
                    148:                l[0] = rvalue(&val[n], (long)0);
                    149:                switch (modsize) {
                    150:                case (sizeof(char)):
                    151:                        b[0] = l[0];
                    152:                        cp = b;
                    153:                        break;
                    154:                case (sizeof(int)):
                    155:                        i[0] = l[0];
                    156:                        cp = i;
                    157:                        break;
                    158:                case (sizeof(l3)):
                    159:                        ltol3(l3, l, 1);
                    160:                        cp = l3;
                    161:                        break;
                    162:                case (sizeof(long)):
                    163:                        cp = l;
                    164:                        break;
                    165:                default:
                    166:                        printe("Bad change type");
                    167:                        return (1);
                    168:                }
                    169:                add = a;
                    170:                if (putb(segn, cp, modsize) == 0) {
                    171:                        printe("Cannot change value");
                    172:                        return (1);
                    173:                }
                    174:        }
                    175:        if (segn == 2)
                    176:                setregs();
                    177:        return (1);
                    178: }
                    179: 
                    180: /*
                    181:  * Send a command to the shell.
                    182:  */
                    183: syscall()
                    184: {
                    185:        register int c;
                    186:        register char *cp;
                    187: 
                    188:        cp = miscbuf;
                    189:        while ((c=getn()) != '\n')
                    190:                *cp++ = c;
                    191:        *cp++ = '\0';
                    192:        system(miscbuf);
                    193:        testint();
                    194:        printf("!\n");
                    195: }
                    196: 
                    197: /*
                    198:  * Print out data according to a format string.  `n' is the number
                    199:  * of times this is done.
                    200:  */
                    201: 
                    202: static int     addfmt = 32767;
                    203: 
                    204: dispfmt(s, fs, n)
                    205: char *fs;
                    206: {
                    207:        register char *sp1;
                    208:        register char *sp2;
                    209:        register int c;
                    210:        register int r;
                    211:        register int t1;
                    212:        register int t2;
                    213:        register char *sp3;
                    214:        register char *fp;
                    215:        register long nad;
                    216:        register long pad;
                    217:        register long uad;
                    218: 
                    219:        r = 1;
                    220:        t2 = '\0';
                    221:        add = dot;
                    222:        nad = dot;
                    223:        pad = dot;
                    224:        uad = dot;
                    225:        sp1 = miscbuf;
                    226:        sp3 = &sp1[DISSIZE];
                    227:        while (n--) {
                    228:                fp = fs;
                    229:                for (;;) {
                    230:                        c = *fp++;
                    231:                        if (isascii(c) && isdigit(c)) {
                    232:                                r = 0;
                    233:                                do {
                    234:                                        r = r*10 + c-'0';
                    235:                                        c = *fp++;
                    236:                                } while (isascii(c) && isdigit(c));
                    237:                                --fp;
                    238:                                continue;
                    239:                        }
                    240:                        switch (c) {
                    241:                        case '^':
                    242:                                add = uad;
                    243:                                continue;
                    244:                        case '+':
                    245:                                add += r;
                    246:                                r = 1;
                    247:                                continue;
                    248:                        case '-':
                    249:                                add -= r;
                    250:                                r = 1;
                    251:                                continue;
                    252:                        case 'n':
                    253:                                *sp1 = '\0';
                    254:                                flushb((long)nad);
                    255:                                sp1 = miscbuf;
                    256:                                nad = add;
                    257:                                continue;
                    258:                        case 'd':
                    259:                        case 'o':
                    260:                        case 'u':
                    261:                        case 'x':
                    262:                                t2 = c;
                    263:                                continue;
                    264:                        case 'a':
                    265:                                addfmt = 32767;
                    266:                                continue;
                    267:                        case 'A':
                    268:                                addfmt = -1;
                    269:                                continue;
                    270:                        default:
                    271:                                t1 = c;
                    272:                                if (t1=='\0' && t2=='\0')
                    273:                                        break;
                    274:                                if (t1 == '\0')
                    275:                                        t1 = 'w';
                    276:                                if (t2 == '\0')
                    277:                                        t2 = DDCHR;
                    278:                                uad = add;
                    279:                                while (r--) {
                    280:                                        if (testint())
                    281:                                                return (1);
                    282:                                        *sp1++ = ' ';
                    283:                                        pad = add;
                    284:                                        sp2 = conform(sp1, s, t1, t2, getb);
                    285:                                        if (sp2 == NULL) {
                    286:                                                *--sp1 = '\0';
                    287:                                                if (sp1 != miscbuf)
                    288:                                                        flushb((long)nad);
                    289:                                                printe("Addressing error");
                    290:                                                return (0);
                    291:                                        }
                    292:                                        if (sp2 <= sp3)
                    293:                                                sp1 = sp2;
                    294:                                        else {
                    295:                                                *--sp1 = '\0';
                    296:                                                flushb((long)nad);
                    297:                                                *sp2 = '\0';
                    298:                                                *sp1 = ' ';
                    299:                                                sp2 = sp1;
                    300:                                                sp1 = miscbuf;
                    301:                                                while (*sp2)
                    302:                                                        *sp1++ = *sp2++;
                    303:                                                nad = pad;
                    304:                                        }
                    305:                                        if (c == 'i') {
                    306:                                                *sp1++ = '\0';
                    307:                                                flushb((long)nad);
                    308:                                                sp1 = miscbuf;
                    309:                                                nad = add;
                    310:                                        }
                    311:                                }
                    312:                                r = 1;
                    313:                                t2 = '\0';
                    314:                                if (c != '\0')
                    315:                                        continue;
                    316:                        }
                    317:                        break;
                    318:                }
                    319:                lad = add;
                    320:        }
                    321:        if (sp1 != miscbuf) {
                    322:                *sp1 = '\0';
                    323:                flushb((long)nad);
                    324:        }
                    325:        return (1);
                    326: }
                    327: 
                    328: /*
                    329:  * Flush the output buffer.  The given address `a' is printed before the
                    330:  * contents of the buffer and dot is set to it.
                    331:  */
                    332: flushb(a)
                    333: register long a;
                    334: {
                    335:        char    buf[40];
                    336: 
                    337:        dot = a;
                    338:        if( fflag)
                    339:                printx( "%lx", a);
                    340:        else {
                    341:                conaddr( buf, -1, a, addfmt);
                    342:                printx( "%s", buf);
                    343:        }
                    344:        printx("\t%s\n", miscbuf);
                    345: }
                    346: 
                    347: /*
                    348:  * Given a format character `f' and a function `func', print out
                    349:  * data according to the given format.  The function `get' is
                    350:  * called to read characters.
                    351:  */
                    352: char *
                    353: conform(sp, s, t1, t2, get)
                    354: register char *sp;
                    355: int (*get)();
                    356: {
                    357:        register char *lp;
                    358:        unsigned char c[1];
                    359:        unsigned char v[3];
                    360:        unsigned short h[1];
                    361:        char *p[1];
                    362:        int i[1];
                    363:        long l[1];
                    364: #ifndef        NFP
                    365:        float f[1];
                    366:        double d[1];
                    367: #endif
                    368: 
                    369:        switch (t1) {
                    370:        case 'b':
                    371:                if ((*get)(s, c, sizeof(c)) == 0)
                    372:                        return (NULL);
                    373:                modsize = sizeof(c);
                    374: 
                    375:                /*
                    376:                 * There should be a better way to do this.
                    377:                 */
                    378:                if (t2 != 'd')
                    379:                        i[0] = c[0];
                    380:                else {
                    381:                        char x[1];
                    382: 
                    383:                        x[0] = c[0];
                    384:                        i[0] = x[0];
                    385:                }
                    386:                sprintf(sp, getform(t1, t2), i[0]);
                    387:                break;
                    388:        case 'c':
                    389:                if ((*get)(s, c, sizeof(c)) == 0)
                    390:                        return (NULL);
                    391:                modsize = sizeof(c);
                    392:                sp = conescs(sp, c[0]);
                    393:                return (sp);
                    394:        case 'C':
                    395:                if ((*get)(s, c, sizeof(c)) == 0)
                    396:                        return (NULL);
                    397:                modsize = sizeof(c);
                    398:                *sp++ = (c[0]>=040&&c[0]<0177) ? c[0] : '.';
                    399:                return (sp);
                    400: #ifndef        NFP
                    401:        case 'f':
                    402:                if ((*get)(s, (char *)f, sizeof(f)) == 0)
                    403:                        return (NULL);
                    404:                modsize = sizeof(f);
                    405:                sprintf(sp, getform(t1, t2), f[0]);
                    406:                break;
                    407:        case 'F':
                    408:                if ((*get)(s, (char *)d, sizeof(d)) == 0)
                    409:                        return (NULL);
                    410:                modsize = sizeof(d);
                    411:                sprintf(sp, getform(t1, t2), d[0]);
                    412:                break;
                    413: #endif
                    414:        case 'h':
                    415:                if ((*get)(s, h, sizeof(h)) == 0)
                    416:                        return (NULL);
                    417:                modsize = sizeof(h);
                    418: 
                    419:                /*
                    420:                 * Oh well.
                    421:                 */
                    422:                if (t2 != 'd')
                    423:                        i[0] = h[0];
                    424:                else {
                    425:                        short x[1];
                    426: 
                    427:                        x[0] = h[0];
                    428:                        i[0] = x[0];
                    429:                }
                    430:                sprintf(sp, getform(t1, t2), i[0]);
                    431:                break;
                    432:        case 'i':
                    433:                sp = coninst(sp, s);
                    434:                modsize = INLEN;
                    435:                return (sp);
                    436:        case 'l':
                    437:                if ((*get)(s, (char *)l, sizeof(l)) == 0)
                    438:                        return (NULL);
                    439:                modsize = sizeof(l);
                    440:                sprintf(sp, getform(t1, t2), l[0]);
                    441:                break;
                    442:        case 'p':
                    443:                if ((*get)(s, (char *)p, sizeof(p)) == 0)
                    444:                        return (NULL);
                    445:                modsize = sizeof(p);
                    446:                sp = conaddr(sp, -1, (long)p[0], I);
                    447:                return (sp);
                    448:        case 's':
                    449:        case 'S':
                    450:                lp = &sp[DISSIZE];
                    451:                c[0] = '\0';
                    452:                for (;;) {
                    453:                        if ((*get)(s, c, sizeof(c)) == 0)
                    454:                                return (NULL);
                    455:                        if (c[0] == '\0')
                    456:                                break;
                    457:                        if (t1 == 's')
                    458:                                sp = conescs(sp, c[0]);
                    459:                        else
                    460:                                *sp++ = c[0];
                    461:                        if (sp > lp)
                    462:                                return (NULL);
                    463:                }
                    464:                modsize = sizeof(i);
                    465:                return (sp);
                    466:        case 'v':
                    467:                if ((*get)(s, (char *)v, sizeof(v)) == 0)
                    468:                        return (NULL);
                    469:                modsize = sizeof(v);
                    470:                l3tol(l, v, 1);
                    471:                sprintf(sp, getform(t1, t2), l[0]);
                    472:                break;
                    473:        case 'w':
                    474:                if ((*get)(s, (char *)i, sizeof(i)) == 0)
                    475:                        return (NULL);
                    476:                modsize = sizeof(i);
                    477:                sprintf(sp, getform(t1, t2), i[0]);
                    478:                break;
                    479:        case 'Y':
                    480:                sp = gettime(sp, cseg, get);
                    481:                modsize = sizeof(i);
                    482:                return (sp);
                    483:        default:
                    484:                return (NULL);
                    485:        }
                    486:        while (*sp)
                    487:                sp++;
                    488:        return (sp);
                    489: }
                    490: 
                    491: /*
                    492:  * If the given character is unprintable, convert it into
                    493:  * an escape sequence.
                    494:  */
                    495: char *
                    496: conescs(sp, c)
                    497: register char *sp;
                    498: register int c;
                    499: {
                    500:        *sp++ = '\\';
                    501:        switch (c) {
                    502:        case '\0':
                    503:                *sp++ = '0';
                    504:                break;
                    505:        case '\b':
                    506:                *sp++ = 'b';
                    507:                break;
                    508:        case '\n':
                    509:                *sp++ = 'n';
                    510:                break;
                    511:        case '\f':
                    512:                *sp++ = 'f';
                    513:                break;
                    514:        case '\r':
                    515:                *sp++ = 'r';
                    516:                break;
                    517:        case '\\':
                    518:                *sp++ = '\\';
                    519:                break;
                    520:        default:
                    521:                if (c<040 || c>=0177) {
                    522:                        sprintf(sp, "%03o", c);
                    523:                        while (*sp)
                    524:                                sp++;
                    525:                        break;
                    526:                }
                    527:                sp[-1] = c;
                    528:        }
                    529:        return (sp);
                    530: }
                    531: 
                    532: /*
                    533:  * Get the current time.
                    534:  */
                    535: char *
                    536: gettime(sp, s, get)
                    537: register char *sp;
                    538: int (*get)();
                    539: {
                    540:        long l;
                    541:        register int n;
                    542:        register char *cp;
                    543: 
                    544:        if ((*get)(s, (char *) &l, sizeof(l)) == 0)
                    545:                return (NULL);
                    546:        cp = ctime(&l);
                    547:        n = 24;
                    548:        do {
                    549:                *sp++ = *cp++;
                    550:        } while (--n);
                    551:        return (sp);
                    552: }

unix.superglobalmegacorp.com

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