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