Bell 32V release
[unix-history] / usr / src / cmd / sdb / docomm.c
CommitLineData
2ed89b40
TL
1#include <signal.h>
2#include "head.h"
3#include <a.out.h>
4
5struct user u;
6L_INT cntval;
7INT signo;
8INT adrflg;
9long oldaddr = -1;
10
11docommand() {
12 register char *p;
13 register int i;
14 register ADDR addr, odot;
15 struct proct *procp;
16
17 if (signo == SIGINT) signo = 0;
18 cntval = 1;
19 adrflg = 0;
20 errflg = 0;
21
22 if (scallf) {
23 doscall();
24 setcur();
25 return;
26 }
27
28 if (reflag) { /* search for regular expression */
29 dore();
30 return;
31 }
32
33 if (cmd == '\0') {
34 if (integ != 0 && var[0] != '\0') {
35 error("Invalid command (1)");
36 return;
37 }
38 if (integ != 0) { /* print line number */
39 ffind(integ);
40 fprint();
41 return;
42 }
43 if (var[0] != 0) {
44 printf("Unexpected null command\n");
45 return;
46 }
47 }
48
49 switch (cmd) {
50
51 case 'a':
52 debug = !debug;
53 break;
54
55 case 't':
56 prframe();
57 break;
58
59 case 'e':
60 p = args;
61 if (*p == '\0') {
62 printf("%.8s() in \"%s\"\n", curproc()->pname, curfile);
63 break;
64 }
65
66 while (*p != '\0')
67 if (*p++ == '.') goto l1;
68 /* argument is procedure name */
69 procp = findproc(args);
70 if ((procp->pname[0] != '\0') && (procp->sfptr != badfile)) {
71 finit(adrtofilep(procp->paddr)->sfilename);
72 ffind(procp->lineno);
73 }
74 else printf("Can't find %s\n", args);
75 printf("%.8s() in \"%s\"\n", curproc()->pname, curfile);
76 break;
77
78 l1: /* argument is filename */
79 finit(args);
80 printf("\"%s\"\n", curfile);
81 break;
82
83 case 'p':
84 if (integ) ffind(integ);
85 fprint();
86 break;
87
88 case 'q':
89 exit(0);
90
91 case 'w':
92 if (integ) ffind(integ);
93 i = fline;
94 fback(WINDOW/2);
95 fprintn(WINDOW);
96 ffind(i);
97 break;
98
99 case 'x':
100 prdebug();
101 break;
102
103 case 'z':
104 if (integ) ffind(integ);
105 fprintn(WINDOW);
106 break;
107
108 case '-':
109 fback(integ ? integ : 1);
110 fpargs();
111 break;
112
113 case '+':
114 fforward(integ ? integ : 1);
115 fpargs();
116 break;
117
118 case '\n':
119 fforward(1);
120 fprint();
121 break;
122
123 case '\004':
124 fforward(1);
125 printf("\b");
126 fprintn(WINDOW);
127 break;
128
129 case 'r':
130 if (debug) error("calling subpcs");
131 if (integ) cntval = integ;
132 if (!executing) {
133 executing = TRUE;
134 if (integ) cntval = integ;
135 subpcs('r');
136 executing = FALSE;
137 }
138 if (debug) error("exiting subpcs");
139/*
140 setcur();
141 break;
142*/
143
144 case 'c':
145 if (debug) error("calling subpcs");
146 if (integ) cntval = integ;
147 subpcs('c');
148 if (debug) error("exiting subpcs");
149 if (!signo) printf("Breakpoint");
150 printf(" at\n");
151 setcur();
152 break;
153
154 case 's':
155 singstep(integ ? integ : 1);
156 if (signo) printf("\n");
157 setcur();
158 break;
159
160 case 'n':
161 odot = *(ADDR *) (((ADDR) &u) + PC);
162 for (i=1; i<100; i++) {
163 dot = getaddr(adrtoprocp(odot)->pname, adrtolineno(odot)+i);
164 if (dot != odot || dot == -1) break;
165 }
166 if (odot == dot || dot == -1) {
167 error("Cannot find next line");
168 break;
169 }
170 if (debug) printf("Setting bkpt with i=%d at %d, odot = %d\n", i, dot, odot);
171 odot = dot;
172 subpcs('b');
173 subpcs('c');
174 if (!signo) printf("Next statement\n");
175 else printf(" at\n");
176 setcur();
177 dot = odot;
178 subpcs('d');
179 break;
180
181 case 'b':
182 if (proc[0] == '\0' && integ == 0) {
183 prbkpt();
184 }
185 else {
186 dot = getaddr(proc,integ);
187 if (dot == -1) {
188 error("Cannot set breakpoint");
189 break;
190 }
191 subpcs('b');
192 printf("%.8s:%d b\n",adrtoprocp(dot)->pname,
193 adrtolineno(dot));
194 }
195 break;
196
197 case 'd':
198 if (proc[0] == '\0' && integ == 0) {
199 idbkpt();
200 break;
201 }
202 dot = getaddr(proc,integ);
203 if (dot == -1) {
204 error("Non existent breakpoint");
205 break;
206 }
207 subpcs('d');
208 break;
209
210 case 'm':
211 addr = varaddr(proc[0] ? proc : curproc()->pname, var);
212 printf("stopped with value %d\n", monex(addr, 'd'));
213 setcur();
214 break;
215
216 case '/':
217 if (var[0] == '.' && var[1] == '\0') {
218 if (integ == 0) integ = oldaddr;
219 dispf((ADDR) integ, args[0] ? args : odesc,
220 oclass == N_RSYM ? oclass : N_GSYM, otype, 0);
221 oldaddr = integ;
222 break;
223 }
224 if (integ) {
225 dispf((ADDR) integ, args, N_GSYM, 0, 0);
226 break;
227 }
228 oldaddr = dispvar(proc[0] ? proc : curproc()->pname, var, args);
229 break;
230
231 case '=':
232 if (var[0] == '\0')
233 addr = getaddr(proc, integ);
234 else
235 addr = varaddr(proc[0] ? proc : curproc()->pname, var);
236 if (addr == -1)
237 error("Unknown address");
238 else
239 printf("0x%x\n", addr);
240 break;
241
242 case '!':
243 if (var[0] == '\0')
244 addr = getaddr(proc, integ);
245 else
246 addr = varaddr(proc[0] ? proc : curproc()->pname, var);
247 if (addr == -1)
248 error("Unknown variable");
249 else
250 if (sl_class == N_RSYM)
251 putreg(addr,typetodesc(sl_type,subflag)[0],argvalue(args));
252 else
253 putval(addr,typetodesc(sl_type,subflag)[0],argvalue(args));
254 break;
255 }
256}
257
258fpargs() {
259 register int i;
260
261 switch(args[0]) {
262 case 'p':
263 case '\0':
264 fprint();
265 break;
266case 'w':
267 i = fline;
268 fback(WINDOW/2);
269 fprintn(WINDOW);
270 ffind(i);
271 break;
272 case 'z':
273 fprintn(WINDOW);
274 break;
275 }
276}