| 1 | # |
| 2 | /* |
| 3 | * |
| 4 | * UNIX debugger |
| 5 | * |
| 6 | */ |
| 7 | |
| 8 | #include "defs.h" |
| 9 | static char sccsid[] = "@(#)pcs.c 4.1 %G%"; |
| 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 | |