Annotation of 42BSD/old/sdb/docomm.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)docomm.c 4.2 8/17/82";
        !             2: #include <signal.h>
        !             3: #include "head.h"
        !             4: #include <a.out.h>
        !             5: #include <stab.h>
        !             6: 
        !             7: struct user u;
        !             8: L_INT  cntval;
        !             9: INT    signo;
        !            10: INT    adrflg;
        !            11: INT    pid;
        !            12: ADDR   userpc;
        !            13: char   *s;
        !            14: enum   {NOCOM, PRCOM, DSCOM, DSICOM} lastcom;
        !            15:                /* last command: nothing noteworthy, print source,
        !            16:                        display variable, display instruction */
        !            17: 
        !            18: docommand() {
        !            19:        register char   *p;
        !            20:        register int    i;
        !            21:        register ADDR   addr, bkaddr;
        !            22:        struct proct    *procp;
        !            23:        char s[4];
        !            24:        
        !            25:        cntval = 1;
        !            26:        adrflg = 0;
        !            27:        errflg = 0;
        !            28: 
        !            29:        if (scallf) {
        !            30:                doscall();
        !            31:                setcur(1);
        !            32:                lastcom = NOCOM;
        !            33:                return;
        !            34:        }
        !            35:        
        !            36:        if (reflag) {  /* search for regular expression */
        !            37:                dore();
        !            38:                lastcom = PRCOM;
        !            39:                return;
        !            40:        }
        !            41:        
        !            42:        if (cmd == '\0') {
        !            43:                if (integ != 0 && var[0] != '\0') {
        !            44:                        error("Invalid command (1)");
        !            45:                        return;
        !            46:                }
        !            47:                if (integ != 0) { /* print line number */
        !            48:                        ffind(integ);
        !            49:                        fprint();
        !            50:                        lastcom = PRCOM;
        !            51:                        return;
        !            52:                }
        !            53:                if (var[0] != 0) {
        !            54:                        printf("Unexpected null command\n");
        !            55:                        return;
        !            56:                }
        !            57:        }
        !            58:                
        !            59:        switch (cmd) {
        !            60:        
        !            61:        case 'Y':
        !            62:                debug = !debug;
        !            63:                break;
        !            64: 
        !            65:        case 'V':
        !            66:                version();
        !            67:                break;
        !            68: 
        !            69:        case 'M':
        !            70:                if (args[0]) {
        !            71:                        setmap(args);
        !            72:                } else {
        !            73:                        printmap("? map", &txtmap);
        !            74:                        printmap("/ map", &datmap);
        !            75:                }
        !            76:                break;
        !            77: 
        !            78:        case 'x':
        !            79:                printregs();
        !            80:                break;
        !            81: 
        !            82:        case 'X':
        !            83:                printpc();
        !            84:                break;
        !            85: 
        !            86:        case 'a':
        !            87:                if (integ) {
        !            88:                        cpstr(args, "l\n");
        !            89:                } else if (proc[0]) {
        !            90:                        cpall(args, "T\n");
        !            91:                } else {
        !            92:                        error("Bad arguments");
        !            93:                        break;
        !            94:                }
        !            95:                goto setbrk;
        !            96:                break;  
        !            97: 
        !            98:        case 'l':
        !            99:                setcur(1);
        !           100:                lastcom = NOCOM;
        !           101:                break;
        !           102:                
        !           103:        case 'T':
        !           104:                prfrx(1);
        !           105:                lastcom = NOCOM;
        !           106:                break;
        !           107:                
        !           108:        case 't':
        !           109:                prframe();
        !           110:                lastcom = NOCOM;
        !           111:                break;
        !           112:                
        !           113:        case 'e':
        !           114:                p = args;
        !           115:                if (*p == '\0') {
        !           116: #ifndef FLEXNAMES
        !           117:                        printf("%.16s() in \"%s\"\n",
        !           118:                                curproc()->pname, curfile);
        !           119: #else
        !           120:                        printf("%s() in \"%s\"\n",
        !           121:                                curproc()->pname, curfile);
        !           122: #endif
        !           123:                        break;
        !           124:                }
        !           125: 
        !           126:                while (*p != '\0')
        !           127:                        if (*p++ == '.') goto l1;
        !           128:                /* argument is procedure name */
        !           129:                procp = findproc(args);
        !           130:                if ((procp->pname[0] != '\0') && (procp->sfptr != badfile)) {
        !           131:                        finit(adrtofilep(procp->paddr)->sfilename);
        !           132:                        ffind(procp->lineno);
        !           133:                }
        !           134:                else printf("Can't find %s\n", args);
        !           135: #ifndef FLEXNAMES
        !           136:                printf("%.16s() in \"%s\"\n", curproc()->pname, curfile);
        !           137: #else
        !           138:                printf("%s() in \"%s\"\n", curproc()->pname, curfile);
        !           139: #endif
        !           140:                lastcom = PRCOM;
        !           141:                break;
        !           142:                
        !           143:        l1:     /* argument is filename */
        !           144:                finit(args);
        !           145:                printf("\"%s\"\n", curfile);
        !           146:                lastcom = PRCOM;
        !           147:                break;
        !           148:                
        !           149:        case 'p':
        !           150:                if (integ) ffind(integ);
        !           151:                fprint();
        !           152:                lastcom = PRCOM;
        !           153:                break;
        !           154:                
        !           155:        case 'q':
        !           156:                exit(0);
        !           157:                
        !           158:        case 'w':
        !           159:                if (integ) ffind(integ);
        !           160:                i = fline;
        !           161:                fback(WINDOW/2);
        !           162:                fprintn(WINDOW);
        !           163:                ffind(i);
        !           164:                lastcom = PRCOM;
        !           165:                break;
        !           166:                
        !           167:        case 'Q':
        !           168:                prdebug();
        !           169:                break;
        !           170: 
        !           171:        case 'z':
        !           172:                if (integ) ffind(integ);
        !           173:                fprintn(WINDOW);
        !           174:                lastcom = PRCOM;
        !           175:                break;
        !           176: 
        !           177:        case '-':
        !           178:                fback(integ ? integ : 1);
        !           179:                fpargs();
        !           180:                lastcom = PRCOM;
        !           181:                break;
        !           182: 
        !           183:        case '+':
        !           184:                fforward(integ ? integ : 1);
        !           185:                fpargs();
        !           186:                lastcom = PRCOM;
        !           187:                break;
        !           188: 
        !           189:        case '\n':
        !           190:                switch (lastcom) {
        !           191:                case PRCOM:
        !           192:                        fforward(1);
        !           193:                        fprint();
        !           194:                        break;
        !           195:                case DSCOM:
        !           196:                        oaddr += oincr ? oincr : typetosize(otype, WORDSIZE);
        !           197:                        printf("0x%x/ ", oaddr);
        !           198:                        dispf((ADDR) oaddr, odesc,
        !           199:                            oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP);
        !           200:                        break;
        !           201:                case DSICOM:
        !           202:                        dot += oincr;
        !           203:                        prisploc();
        !           204:                        dispi(dot, odesc, N_GSYM, 0, 0);
        !           205:                        break;
        !           206:                }
        !           207:                break;
        !           208: 
        !           209:        case '\004':
        !           210:                if (!isatty(0))
        !           211:                        exit(0);
        !           212:                switch (lastcom) {
        !           213:                case PRCOM:
        !           214:                        fforward(1);
        !           215:                        printf("\b");
        !           216:                        fprintn(WINDOW);
        !           217:                        lastcom = PRCOM;
        !           218:                        break;
        !           219:                case DSICOM:
        !           220:                        printf("\b");
        !           221:                        for (i=0; i<WINDOW; i++) {
        !           222:                                dot += oincr;
        !           223:                                prisploc();
        !           224:                                if (dispi(dot, odesc, N_GSYM, 0, 0) == -1)
        !           225:                                        break;
        !           226:                        }
        !           227:                        break;
        !           228:                case DSCOM:
        !           229:                        printf("\b");
        !           230:                        for (i=0; i<WINDOW; i++) {
        !           231:                                oaddr += oincr ?
        !           232:                                        oincr : typetosize(otype, WORDSIZE);
        !           233:                                printf("0x%x/ ", oaddr);
        !           234:                                if (dispf((ADDR) oaddr, odesc,
        !           235:                                        oclass == N_RSYM ? oclass :
        !           236:                                        N_GSYM, otype, 0, 0, DSP) == -1)
        !           237:                                        break;
        !           238:                        }
        !           239:                        break;
        !           240:                default:
        !           241:                        printf("\n");
        !           242:                }
        !           243:                break;
        !           244: 
        !           245:        case 'r':
        !           246:                if (args[0] == '\0') getargs();
        !           247:        case 'R':
        !           248:                signo = 0;
        !           249:                cpstr(oldargs, args);
        !           250:                if (debug) error("calling dopcs");
        !           251:                if (integ) cntval = integ;
        !           252:                if (!executing) {
        !           253:                        executing = TRUE;
        !           254:                        if (integ) cntval = integ;
        !           255:                        dopcs('r');
        !           256:                        executing = FALSE;
        !           257:                }
        !           258:                if (debug) error("exiting dopcs");
        !           259:                bkaddr = -1;
        !           260:                goto f1;
        !           261: 
        !           262:        case 'c':
        !           263:                signo = 0;
        !           264:        case 'C':
        !           265:                if (proc[0] != '\0' || integ != 0) {
        !           266:                        setdot();
        !           267:                        if (dot == -1) {
        !           268:                                error("Cannot set temporary breakpoint");
        !           269:                                break;
        !           270:                        }
        !           271:                        dopcs('b');
        !           272:                        bkaddr = dot;
        !           273:                } else
        !           274:                        bkaddr = -1;
        !           275:                integ = atoi(args);
        !           276: 
        !           277: f1:            if (debug) error("calling dopcs");
        !           278:                if (integ) cntval = integ;
        !           279:                dopcs('c');
        !           280:                if (debug) error("exiting dopcs");
        !           281:                if (bkaddr != -1) {
        !           282:                        ADDR dotsave;
        !           283:                        dotsave = dot;
        !           284:                        dot = bkaddr;
        !           285:                        dopcs('d');
        !           286:                        dot = dotsave;
        !           287:                }
        !           288:                if (!signo) printf("Breakpoint");
        !           289:                printf(" at\n");
        !           290:                setcur(1);
        !           291:                lastcom = NOCOM;
        !           292:                break;
        !           293:                
        !           294:        case 'S':
        !           295:        case 's':
        !           296:                signo = 0;
        !           297:                integ = atoi(args);
        !           298:                singstep(integ ? integ : 1, cmd);
        !           299:                if (signo) printf("\n");
        !           300:                setcur(1);
        !           301:                lastcom = NOCOM;
        !           302:                break;
        !           303:                
        !           304:        case 'g':
        !           305:                if (pid == 0  ||  signo) {
        !           306:                        error("Not stopped at breakpoint");
        !           307:                        break;
        !           308:                }
        !           309:                setdot();
        !           310:                if (dot == -1) {
        !           311:                        error("Bad address");
        !           312:                        break;
        !           313:                }
        !           314:                adrflg = 1;
        !           315:                integ = atoi(args);
        !           316:                if (integ) cntval = integ;
        !           317:                dopcs('c');
        !           318:                if (!signo) printf("Breakpoint");
        !           319:                printf(" at\n");
        !           320:                setcur(1);
        !           321:                lastcom = NOCOM;
        !           322:                break;
        !           323: 
        !           324:        case 'k':
        !           325:                if (scallx) {
        !           326:                        userpc = dot = *(ADDR *)(((ADDR)&u)+PC) = pcs;
        !           327:                        *(ADDR *)(((ADDR)&u)+FP) = fps;
        !           328:                        *(ADDR *)(((ADDR)&u)+AP) = aps;
        !           329:                        if (bkpts)
        !           330:                                bkpts->flag = flagss;
        !           331:                        scallx = 0;
        !           332:                        error("Procedure killed");
        !           333:                        longjmp(env, 0);
        !           334:                } else {
        !           335:                        dopcs('k');
        !           336:                        printf("\n");
        !           337:                        lastcom = NOCOM;
        !           338:                        break;
        !           339:                }
        !           340: 
        !           341:        case 'B':
        !           342:                prbkpt();
        !           343:                break;
        !           344: 
        !           345:        case 'b':
        !           346:        setbrk:
        !           347:                if (proc[0] == '\0' && integ == 0) {
        !           348:                        integ = fline;
        !           349:                }
        !           350:                setdot();
        !           351:                if (dot == -1 || dot == 0) {
        !           352:                        error("Cannot set breakpoint");
        !           353:                        break;
        !           354:                }
        !           355:                dopcs('b');
        !           356:                s[0] = ' ';
        !           357:                s[1] = cmd;
        !           358:                s[2] = '\n';
        !           359:                s[3] = 0;
        !           360:                s[1] = cmd;
        !           361:                printbkpt(s, adrtoprocp(dot), dot);
        !           362:                break;
        !           363:                
        !           364:        case 'd':
        !           365:                if (proc[0] == '\0' && integ == 0) {
        !           366:                        idbkpt();
        !           367:                        break;
        !           368:                }
        !           369:                setdot();
        !           370:                if (dot == -1) {
        !           371:                        error("Non existent breakpoint");
        !           372:                        break;
        !           373:                }
        !           374:                dopcs('d');
        !           375:                break;
        !           376:                
        !           377:        case 'D':
        !           378:                dabkpt();
        !           379:                error("All breakpoints deleted");
        !           380:                break;
        !           381: 
        !           382:        case 'm':
        !           383:                addr = varaddr(proc[0] ? proc : curproc()->pname, var);
        !           384:                printf("stopped with value %d\n", monex(addr, 'd'));
        !           385:                setcur(1);
        !           386:                lastcom = NOCOM;
        !           387:                break;
        !           388:                
        !           389:        case '?':
        !           390:                if (!(var[0] == '.' && var[1] == '\0'))
        !           391:                        setdot();
        !           392:                if (errflg) {
        !           393:                        error(errflg);
        !           394:                        break;
        !           395:                }
        !           396:                prisploc();
        !           397:                dispi(dot, args[0] ? args : "i", N_GSYM, 0, 0);
        !           398:                lastcom = DSICOM;
        !           399:                break;
        !           400: 
        !           401:        case '/':
        !           402:                if (var[0] == '.' && var[1] == '\0') {
        !           403:                        if (integ == 0) integ = oaddr;
        !           404:                        dispf((ADDR) integ, args[0] ? args : odesc,
        !           405:                            oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP);
        !           406:                        oaddr = integ;
        !           407:                } else
        !           408:                if (integ && (var[0] == '\0')) {
        !           409:                        dispf((ADDR) integ, args, N_GSYM, 0, 0, 0, DSP);
        !           410:                        oaddr = integ;
        !           411:                        cpstr(odesc, args);
        !           412:                        oclass = N_GSYM;
        !           413:                        otype = 0;
        !           414:                } else
        !           415:                        dispvar(proc, var, args);
        !           416:                lastcom = DSCOM;
        !           417:                break;
        !           418:                
        !           419:        case '=':
        !           420:                if (var[0] == '\0') {
        !           421:                        if (proc[0]) {
        !           422:                                addr = getaddr(proc, integ);
        !           423:                                if (addr == -1) {
        !           424:                                        error("Unknown address");
        !           425:                                        break;
        !           426:                                }
        !           427:                        }
        !           428:                        else
        !           429:                                addr = integ;
        !           430:                        dispf(addr, args[0] ? args : "x", 0, -1, 0, 0, DSP);
        !           431:                } else 
        !           432:                        findvar(proc, var, args[0] ? args : "x", 2);
        !           433:                break;
        !           434: 
        !           435:        case '!':
        !           436:                if (var[0] == '\0')
        !           437:                        addr = getaddr(proc, integ);
        !           438:                else
        !           439:                        addr = varaddr(proc, var);
        !           440:                if (addr == -1) 
        !           441:                        error("Unknown variable");
        !           442:                else {
        !           443:                        if (number(args[0]) || eqany(args[0], ".-")) {
        !           444:                                char *p;
        !           445:                                double atof();
        !           446:                                union {
        !           447:                                        struct{
        !           448:                                                int w1, w2;
        !           449:                                        } ww;
        !           450:                                        double d;
        !           451:                                } dbl;
        !           452: 
        !           453:                                p = (args[0] == '-') ? args+1 : args;
        !           454:                                for (; *p != '.' && *p != 'e'; p++) {
        !           455:                                        if (!number(*p)) goto l2;
        !           456:                                }
        !           457:                                dbl.d = atof(args);
        !           458:                                putval(addr, 'd', dbl.ww.w1);
        !           459:                                if (typetodesc(sl_type,0)[0] == 'g')
        !           460:                                        putval(addr+WORDSIZE, 'd', dbl.ww.w2);
        !           461:                                break;
        !           462:                        }
        !           463: l2:                    if (percentflag)
        !           464:                                *(ADDR *)(((ADDR)&u)+addr) = argvalue(args);
        !           465:                        else if (sl_class == N_RSYM && addr < 16)
        !           466:                                putreg(addr,typetodesc(sl_type,subflag)[0],
        !           467:                                                argvalue(args));
        !           468:                        else
        !           469:                                putval(addr,typetodesc(sl_type,subflag)[0],
        !           470:                                                argvalue(args));
        !           471:                }
        !           472:                lastcom = NOCOM;
        !           473:                break;
        !           474: 
        !           475:        case '"':
        !           476:                printf(args);
        !           477:                break;
        !           478:        }
        !           479: }
        !           480: 
        !           481: fpargs() {
        !           482:        register int i;
        !           483:        
        !           484:        switch(args[0]) {
        !           485:        case 'p':
        !           486:        case '\0':
        !           487:                fprint();
        !           488:                break;
        !           489: case 'w':
        !           490:                i = fline;
        !           491:                fback(WINDOW/2);
        !           492:                fprintn(WINDOW);
        !           493:                ffind(i);
        !           494:                break;
        !           495:        case 'z':
        !           496:                fprintn(WINDOW);
        !           497:                break;
        !           498:        }
        !           499: }
        !           500: 
        !           501: MSG    BADTXT;
        !           502: /* Used by a, b, c, C, d and g commands to find linenumber */
        !           503: setdot() {
        !           504:        if (ncolonflag) {
        !           505:                dot = integ;
        !           506:                get(dot, ISP);
        !           507:                if (errflg)
        !           508:                        dot = -1;
        !           509:        } else {
        !           510:                dot = getaddr(proc, integ);
        !           511:                if (dot == -1)
        !           512:                        errflg = "Bad line number";
        !           513:        }
        !           514: }

unix.superglobalmegacorp.com

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