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