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