Bell 32V development
[unix-history] / usr / src / cmd / sdb / pcs.c
CommitLineData
7deb380f
TL
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;
22struct user u;
23
24INT signo;
25L_INT dot;
26INT pid;
27L_INT cntval;
28L_INT loopcnt;
29
30
31
32/* sub process control */
33
34subpcs(modif)
35{
36 REG INT check;
37 INT execsig,runmode;
38 REG BKPTR bkptr;
39 STRING comptr;
40 execsig=0; loopcnt=cntval;
41
42 switch (modif) {
43
44 /* delete breakpoint */
45 case 'd': case 'D':
46 IF (bkptr=scanbkpt(dot))
47 THEN bkptr->flag=0; return;
48 ELSE error(NOBKPT);
49 FI
50
51 /* set breakpoint */
52 case 'b': case 'B':
53 IF (bkptr=scanbkpt(dot))
54 THEN bkptr->flag=0;
55 FI
56 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
57 DO IF bkptr->flag == 0
58 THEN break;
59 FI
60 OD
61 IF bkptr==0
62 THEN IF (bkptr=(BKPTR) sbrk(sizeof *bkptr)) == (BKPTR) -1
63 THEN error(SZBKPT);
64 ELSE bkptr->nxtbkpt=bkpthead;
65 bkpthead=bkptr;
66 FI
67 FI
68 bkptr->loc = dot;
69 bkptr->initcnt = bkptr->count = cntval;
70 bkptr->flag = BKPTSET;
71 check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
72 REP *comptr++ = readchar();
73 PER check-- ANDF lastc!=EOR DONE
74 *comptr=0; lp--;
75 IF check
76 THEN return;
77 ELSE error(EXBKPT);
78 FI
79
80 /* exit */
81 case 'k' :case 'K':
82 IF pid
83 THEN printf("%d: killed", pid); endpcs(); return;
84 FI
85 error(NOPCS);
86
87 /* run program */
88 case 'r': case 'R':
89 endpcs();
90 setup(); runmode=CONTIN;
91 break;
92
93 /* single step */
94 case 's': case 'S':
95 IF pid
96 THEN
97 runmode=SINGLE; execsig=getsig(signo);
98 ELSE setup(); loopcnt--;
99 FI
100 break;
101
102 /* continue with optional signal */
103 case 'c': case 'C': case 0:
104 IF pid==0 THEN error(NOPCS); FI
105 runmode=CONTIN; execsig=getsig(signo);
106 break;
107
108 default: error(BADMOD);
109 }
110
111 runpcs(runmode,execsig);
112 delbp();
113}
114