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