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