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