Commit | Line | Data |
---|---|---|
2ed89b40 TL |
1 | #include <signal.h> |
2 | #include "head.h" | |
3 | #include <a.out.h> | |
4 | ||
5 | struct user u; | |
6 | L_INT cntval; | |
7 | INT signo; | |
8 | INT adrflg; | |
9 | long oldaddr = -1; | |
10 | ||
11 | docommand() { | |
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 | ||
258 | fpargs() { | |
259 | register int i; | |
260 | ||
261 | switch(args[0]) { | |
262 | case 'p': | |
263 | case '\0': | |
264 | fprint(); | |
265 | break; | |
266 | case '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 | } |