fix to do writes in memory properly
[unix-history] / usr / src / old / adb / adb.vax / pcs.c
CommitLineData
04711a0c
BJ
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9static char sccsid[] = "@(#)pcs.c 4.1 %G%";
10
11
12MSG NOBKPT;
13MSG SZBKPT;
14MSG EXBKPT;
15MSG NOPCS;
16MSG BADMOD;
17
18/* breakpoints */
19BKPTR bkpthead;
20
21CHAR *lp;
22CHAR lastc;
23
24INT signo;
25L_INT dot;
26INT pid;
27L_INT cntval;
28L_INT loopcnt;
29
30L_INT entrypt;
31INT adrflg;
32
33
34
35/* sub process control */
36
37subpcs(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