1 #ifndef lint
2 static char sccsid[] = "@(#)format.c 1.4 (Berkeley) 4/1/87";
3 #endif
4 /*
5 *
6 * UNIX debugger
7 *
8 */
9
10 #include "defs.h"
11
12 MSG BADMOD;
13 MSG NOFORK;
14 MSG ADWRAP;
15
16 INT mkfault;
17 CHAR *lp;
18 ADDR maxoff;
19 SIG sigint;
20 SIG sigqit;
21 STRING errflg;
22 CHAR lastc,peekc;
23 L_INT dot;
24 INT dotinc;
25 L_INT expv;
26 L_INT var[];
27
scanform(icount,ifp,itype,ptype)28 scanform(icount,ifp,itype,ptype)
29 L_INT icount;
30 STRING ifp;
31 {
32 REG STRING fp;
33 CHAR modifier;
34 REG fcount, init=1;
35 L_INT savdot;
36 BOOL exact;
37
38 WHILE icount
39 DO fp=ifp;
40 savdot=dot; init=0;
41
42 IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff
43 THEN printf("\n%s:%16t",cursym->n_un.n_name);
44 FI
45
46 /*now loop over format*/
47 WHILE *fp ANDF errflg==0
48 DO IF isdigit(modifier = *fp)
49 THEN fcount = 0;
50 WHILE isdigit(modifier = *fp++)
51 DO fcount *= 10;
52 fcount += modifier-'0';
53 OD
54 fp--;
55 ELSE fcount = 1;
56 FI
57
58 IF *fp==0 THEN break; FI
59 fp=exform(fcount,fp,itype,ptype);
60 OD
61 dotinc=dot-savdot;
62 dot=savdot;
63
64 IF errflg
65 THEN IF icount<0
66 THEN errflg=0; break;
67 ELSE error(errflg);
68 FI
69 FI
70 IF --icount
71 THEN dot=inkdot(dotinc);
72 FI
73 IF mkfault THEN error(0); FI
74 OD
75 }
76
77 STRING
exform(fcount,ifp,itype,ptype)78 exform(fcount,ifp,itype,ptype)
79 INT fcount;
80 STRING ifp;
81 {
82 /* execute single format item `fcount' times
83 * sets `dotinc' and moves `dot'
84 * returns address of next format item
85 */
86 REG POS w;
87 REG L_INT savdot, wx;
88 REG STRING fp;
89 CHAR c, modifier, longpr;
90 union{ /* compatible with both VAX and TAHOE */
91 L_REAL d;
92 INT s[4];
93 }fw;
94
95 WHILE fcount>0
96 DO fp = ifp; c = *fp;
97 longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p');
98 IF itype==NSP ORF *fp=='a'
99 THEN wx=dot; w=dot;
100 IF c=='b' ORF c=='B' ORF c=='c' ORF c=='C' ORF c=='1'
101 THEN w=btol(wx); FI
102 ELSE wx=get(dot,itype);
103 w=shorten(wx);
104 FI
105 IF errflg THEN return(fp); FI
106 IF mkfault THEN error(0); FI
107 var[0]=wx;
108 modifier = *fp++;
109 dotinc=(longpr?4:2);
110
111 IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI
112
113 switch(modifier) {
114
115 case SP: case TB:
116 break;
117
118 case 't': case 'T':
119 printf("%T",fcount); return(fp);
120
121 case 'r': case 'R':
122 printf("%M",fcount); return(fp);
123
124 case 'a':
125 psymoff(dot,ptype,":%16t"); dotinc=0; break;
126
127 case 'p':
128 psymoff(var[0],ptype,"%16t"); break;
129
130 case 'u':
131 printf("%-8u",w); break;
132
133 case 'U':
134 printf("%-16U",wx); break;
135
136 case 'c': case 'C':
137 IF modifier=='C'
138 THEN printesc((w>>8)&0xff);
139 ELSE printc((w>>8)&0xff);
140 FI
141 dotinc=1; break;
142
143 case 'b': case 'B':
144 printf("%-8o", (w>>8)&0xff); dotinc=1; break;
145
146 case '1':
147 printf("%-8R", byte(wx)); dotinc=1; break;
148
149 case '2':
150 case 'w':
151 printf("%-8R", w); break;
152
153 case '4':
154 case 'W':
155 printf("%-16R", wx); break;
156
157 case 's': case 'S':
158 savdot=dot; dotinc=1;
159 WHILE (c=byte(get(dot,itype))) ANDF errflg==0
160 DO dot=inkdot(1);
161 IF modifier == 'S'
162 THEN printesc(c);
163 ELSE printc(c);
164 FI
165 endline();
166 OD
167 dotinc=dot-savdot+1; dot=savdot; break;
168
169 case 'x':
170 printf("%-8x",w); break;
171
172 case 'X':
173 printf("%-16X", wx); break;
174
175 case 'z':
176 printf("%-8z",w); break;
177
178 case 'Z':
179 printf("%-16Z", wx); break;
180
181 case 'Y':
182 printf("%-24Y", wx); break;
183
184 case 'q':
185 printf("%-8q", w); break;
186
187 case 'Q':
188 printf("%-16Q", wx); break;
189
190 case 'o':
191 printf("%-8o", w); break;
192
193 case 'O':
194 printf("%-16O", wx); break;
195
196 case 'i':
197 case 'I':
198 printins(itype,wx); printc(EOR); break;
199
200 case 'd':
201 printf("%-8d", w); break;
202
203 case 'D':
204 printf("%-16D", wx); break;
205
206 case 'f':
207 if ((w & ~0xFFFF00FF) == 0x8000)
208 printf("(reserved oprnd)");
209 else {
210 fw.d = 0;
211 fw.s[0] = w;
212 fw.s[1] = wx&0xffff;
213 printf("%-16.9f", fw.d);
214 }
215 dotinc = 4;
216 break;
217
218 case 'F': /* may be done with one get call on TAHOE */
219 if ((w & ~0xFFFF00FF) == 0x8000)
220 printf("(reserved oprnd)");
221 else {
222 fw.s[2] = shorten(get(inkdot(4),itype));
223 fw.s[3] = shorten(get(inkdot(6),itype));
224 if (errflg)
225 return(fp);
226 fw.s[0] = w;
227 fw.s[1] = wx&0xffff;
228 printf("%-32.18F", fw.d);
229 }
230 dotinc = 8;
231 break;
232
233 case 'n': case 'N':
234 printc('\n'); dotinc=0; break;
235
236 case '"':
237 dotinc=0;
238 WHILE *fp != '"' ANDF *fp
239 DO printc(*fp++); OD
240 IF *fp THEN fp++; FI
241 break;
242
243 case '^':
244 dot=inkdot(-dotinc*fcount); return(fp);
245
246 case '+':
247 dot=inkdot(fcount); return(fp);
248
249 case '-':
250 dot=inkdot(-fcount); return(fp);
251
252 default: error(BADMOD);
253 }
254 IF itype!=NSP
255 THEN dot=inkdot(dotinc);
256 FI
257 fcount--; endline();
258 OD
259
260 return(fp);
261 }
262
shell()263 shell()
264 {
265 #ifndef EDDT
266 REG rc, unixpid;
267 int status;
268 REG STRING argp = lp;
269 STRING getenv(), shell = getenv("SHELL");
270 #ifdef VFORK
271 char oldstlp;
272 #endif
273
274 if (shell == 0)
275 shell = "/bin/sh";
276 WHILE lastc!=EOR DO rdc(); OD
277 #ifndef VFORK
278 IF (unixpid=fork())==0
279 #else
280 oldstlp = *lp;
281 IF (unixpid=vfork())==0
282 #endif
283 THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
284 *lp=0; execl(shell, "sh", "-c", argp, 0);
285 _exit(16);
286 #ifndef VFORK
287 ELIF unixpid == -1
288 #else
289 ELIF *lp = oldstlp, unixpid == -1
290 #endif
291 THEN error(NOFORK);
292 ELSE signal(SIGINT,1);
293 WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE
294 signal(SIGINT,sigint);
295 printc('!'); lp--;
296 FI
297 #endif
298 }
299
300
printesc(c)301 printesc(c)
302 REG c;
303 {
304 c &= STRIP;
305 IF c==0177 ORF c<SP
306 THEN printf("^%c", c ^ 0100);
307 ELSE printc(c);
308 FI
309 }
310
inkdot(incr)311 L_INT inkdot(incr)
312 {
313 REG L_INT newdot;
314
315 newdot=dot+incr;
316 IF (dot ^ newdot) >> 24 THEN error(ADWRAP); FI
317 return(newdot);
318 }
319