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