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