1*0b87e0abSsam #ifndef lint 2*0b87e0abSsam static char sccsid[] = "@(#)pcs.c 4.2 08/11/83"; 3*0b87e0abSsam #endif 42580ab78Sroot /* 52580ab78Sroot * 62580ab78Sroot * UNIX debugger 72580ab78Sroot * 82580ab78Sroot */ 92580ab78Sroot 102580ab78Sroot #include "defs.h" 112580ab78Sroot 122580ab78Sroot 132580ab78Sroot MSG NOBKPT; 142580ab78Sroot MSG SZBKPT; 152580ab78Sroot MSG EXBKPT; 162580ab78Sroot MSG NOPCS; 172580ab78Sroot MSG BADMOD; 182580ab78Sroot 192580ab78Sroot /* breakpoints */ 202580ab78Sroot BKPTR bkpthead; 212580ab78Sroot 222580ab78Sroot CHAR *lp; 232580ab78Sroot CHAR lastc; 242580ab78Sroot 252580ab78Sroot INT signo; 262580ab78Sroot L_INT dot; 272580ab78Sroot INT pid; 282580ab78Sroot L_INT cntval; 292580ab78Sroot L_INT loopcnt; 302580ab78Sroot 312580ab78Sroot L_INT entrypt; 322580ab78Sroot INT adrflg; 332580ab78Sroot 342580ab78Sroot 352580ab78Sroot 362580ab78Sroot /* sub process control */ 372580ab78Sroot subpcs(modif)382580ab78Srootsubpcs(modif) 392580ab78Sroot { 402580ab78Sroot REG INT check; 412580ab78Sroot INT execsig,runmode; 422580ab78Sroot REG BKPTR bkptr; 432580ab78Sroot STRING comptr; 442580ab78Sroot execsig=0; loopcnt=cntval; 452580ab78Sroot 462580ab78Sroot switch (modif) { 472580ab78Sroot 482580ab78Sroot /* delete breakpoint */ 492580ab78Sroot case 'd': case 'D': 502580ab78Sroot IF (bkptr=scanbkpt(dot)) 512580ab78Sroot THEN bkptr->flag=0; return; 522580ab78Sroot ELSE error(NOBKPT); 532580ab78Sroot FI 542580ab78Sroot 552580ab78Sroot /* set breakpoint */ 562580ab78Sroot case 'b': case 'B': 572580ab78Sroot IF (bkptr=scanbkpt(dot)) 582580ab78Sroot THEN bkptr->flag=0; 592580ab78Sroot FI 602580ab78Sroot FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt 612580ab78Sroot DO IF bkptr->flag == 0 622580ab78Sroot THEN break; 632580ab78Sroot FI 642580ab78Sroot OD 652580ab78Sroot IF bkptr==0 662580ab78Sroot THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1 672580ab78Sroot THEN error(SZBKPT); 682580ab78Sroot ELSE bkptr->nxtbkpt=bkpthead; 692580ab78Sroot bkpthead=bkptr; 702580ab78Sroot FI 712580ab78Sroot FI 722580ab78Sroot bkptr->loc = dot; 732580ab78Sroot bkptr->initcnt = bkptr->count = cntval; 742580ab78Sroot bkptr->flag = BKPTSET; 752580ab78Sroot check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--; 762580ab78Sroot REP *comptr++ = readchar(); 772580ab78Sroot PER check-- ANDF lastc!=EOR DONE 782580ab78Sroot *comptr=0; lp--; 792580ab78Sroot IF check 802580ab78Sroot THEN return; 812580ab78Sroot ELSE error(EXBKPT); 822580ab78Sroot FI 832580ab78Sroot 842580ab78Sroot /* exit */ 852580ab78Sroot case 'k' :case 'K': 862580ab78Sroot IF pid 872580ab78Sroot THEN printf("%d: killed", pid); endpcs(); return; 882580ab78Sroot FI 892580ab78Sroot error(NOPCS); 902580ab78Sroot 912580ab78Sroot /* run program */ 922580ab78Sroot case 'r': case 'R': 932580ab78Sroot endpcs(); 942580ab78Sroot setup(); runmode=CONTIN; 952580ab78Sroot IF adrflg 962580ab78Sroot THEN IF !scanbkpt(dot) THEN loopcnt++; FI 972580ab78Sroot ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI 982580ab78Sroot FI 992580ab78Sroot break; 1002580ab78Sroot 1012580ab78Sroot /* single step */ 1022580ab78Sroot case 's': case 'S': 1032580ab78Sroot IF pid 1042580ab78Sroot THEN 1052580ab78Sroot runmode=SINGLE; execsig=getsig(signo); 1062580ab78Sroot ELSE setup(); loopcnt--; 1072580ab78Sroot FI 1082580ab78Sroot break; 1092580ab78Sroot 1102580ab78Sroot /* continue with optional signal */ 1112580ab78Sroot case 'c': case 'C': case 0: 1122580ab78Sroot IF pid==0 THEN error(NOPCS); FI 1132580ab78Sroot runmode=CONTIN; execsig=getsig(signo); 1142580ab78Sroot break; 1152580ab78Sroot 1162580ab78Sroot default: error(BADMOD); 1172580ab78Sroot } 1182580ab78Sroot 1192580ab78Sroot IF loopcnt>0 ANDF runpcs(runmode,execsig) 1202580ab78Sroot THEN printf("breakpoint%16t"); 1212580ab78Sroot ELSE printf("stopped at%16t"); 1222580ab78Sroot FI 1232580ab78Sroot delbp(); 1242580ab78Sroot printpc(); 1252580ab78Sroot } 1262580ab78Sroot 127