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