|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)pcs.c 1.1 (Berkeley) 2/25/86"; ! 3: #endif ! 4: ! 5: /* ! 6: * ! 7: * UNIX debugger ! 8: * ! 9: */ ! 10: ! 11: #include "defs.h" ! 12: ! 13: ! 14: MSG NOBKPT; ! 15: MSG SZBKPT; ! 16: MSG EXBKPT; ! 17: MSG NOPCS; ! 18: MSG BADMOD; ! 19: ! 20: /* breakpoints */ ! 21: BKPTR bkpthead; ! 22: ! 23: CHAR *lp; ! 24: CHAR lastc; ! 25: ! 26: INT signo; ! 27: L_INT dot; ! 28: L_INT pid; ! 29: L_INT cntval; ! 30: L_INT loopcnt; ! 31: ! 32: L_INT entrypt; ! 33: INT adrflg; ! 34: ! 35: ! 36: ! 37: /* sub process control */ ! 38: ! 39: subpcs(modif) ! 40: { ! 41: REG check; ! 42: REG execsig,runmode; ! 43: REG BKPTR bkptr; ! 44: REG STRING comptr; ! 45: execsig=0; loopcnt=cntval; ! 46: ! 47: switch (modif) { ! 48: ! 49: /* delete breakpoint */ ! 50: case 'd': case 'D': ! 51: IF (bkptr=scanbkpt(dot)) ! 52: THEN bkptr->flag=0; return; ! 53: ELSE error(NOBKPT); ! 54: FI ! 55: ! 56: /* set breakpoint */ ! 57: case 'b': case 'B': ! 58: IF (bkptr=scanbkpt(dot)) ! 59: THEN bkptr->flag=0; ! 60: FI ! 61: FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt ! 62: DO IF bkptr->flag == 0 ! 63: THEN break; ! 64: FI ! 65: OD ! 66: IF bkptr==0 ! 67: THEN IF (bkptr=(BKPTR)sbrk(sizeof *bkptr)) == (BKPTR)-1 ! 68: THEN error(SZBKPT); ! 69: ELSE bkptr->nxtbkpt=bkpthead; ! 70: bkpthead=bkptr; ! 71: FI ! 72: FI ! 73: bkptr->loc = dot; ! 74: bkptr->initcnt = bkptr->count = cntval; ! 75: bkptr->flag = BKPTSET; ! 76: check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--; ! 77: REP *comptr++ = readchar(); ! 78: PER check-- ANDF lastc!=EOR DONE ! 79: *comptr=0; lp--; ! 80: IF check ! 81: THEN return; ! 82: ELSE error(EXBKPT); ! 83: FI ! 84: ! 85: /* exit */ ! 86: case 'k' :case 'K': ! 87: IF pid ! 88: THEN printf("%d: killed", pid); endpcs(); return; ! 89: FI ! 90: error(NOPCS); ! 91: ! 92: /* run program */ ! 93: case 'r': case 'R': ! 94: endpcs(); ! 95: setup(); runmode=CONTIN; ! 96: /* ! 97: IF adrflg ! 98: THEN IF !scanbkpt(dot) THEN loopcnt++; FI ! 99: ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI ! 100: FI ! 101: */ ! 102: break; ! 103: ! 104: /* single step */ ! 105: case 's': case 'S': ! 106: IF pid ! 107: THEN ! 108: runmode=SINGLE; execsig=getsig(signo); ! 109: ELSE setup(); loopcnt--; ! 110: FI ! 111: break; ! 112: ! 113: /* continue with optional signal */ ! 114: case 'c': case 'C': case 0: ! 115: IF pid==0 THEN error(NOPCS); FI ! 116: runmode=CONTIN; execsig=getsig(signo); ! 117: break; ! 118: ! 119: default: error(BADMOD); ! 120: } ! 121: ! 122: IF loopcnt>0 ANDF runpcs(runmode,execsig) ! 123: THEN printf("breakpoint%16t"); ! 124: ELSE printf("stopped at%16t"); ! 125: FI ! 126: delbp(); ! 127: printpc(); ! 128: } ! 129:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.