date and time created 88/03/30 14:46:04 by bostic
[unix-history] / usr / src / old / adb / adb.tahoe / format.c
CommitLineData
b4c8f1da 1#ifndef lint
559a8aee 2static char sccsid[] = "@(#)format.c 1.4 (Berkeley) 4/1/87";
b4c8f1da
SL
3#endif
4/*
5 *
6 * UNIX debugger
7 *
8 */
9
10#include "defs.h"
11
12MSG BADMOD;
13MSG NOFORK;
14MSG ADWRAP;
15
16INT mkfault;
17CHAR *lp;
18ADDR maxoff;
19SIG sigint;
20SIG sigqit;
21STRING errflg;
22CHAR lastc,peekc;
23L_INT dot;
24INT dotinc;
25L_INT expv;
26L_INT var[];
27
28scanform(icount,ifp,itype,ptype)
29L_INT icount;
30STRING 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
559a8aee 59 fp=exform(fcount,fp,itype,ptype);
b4c8f1da
SL
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
77STRING
78exform(fcount,ifp,itype,ptype)
79INT fcount;
80STRING 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;
c61c3991
SL
100 IF c=='b' ORF c=='B' ORF c=='c' ORF c=='C' ORF c=='1'
101 THEN w=btol(wx); FI
b4c8f1da
SL
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'
728761fd
KB
138 THEN printesc((w>>8)&0xff);
139 ELSE printc((w>>8)&0xff);
b4c8f1da
SL
140 FI
141 dotinc=1; break;
142
143 case 'b': case 'B':
728761fd 144 printf("%-8o", (w>>8)&0xff); dotinc=1; break;
b4c8f1da
SL
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':
d4a9f478
KB
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;
b4c8f1da
SL
217
218 case 'F': /* may be done with one get call on TAHOE */
d4a9f478
KB
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;
b4c8f1da
SL
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
263shell()
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
301printesc(c)
302REG 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
311L_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}