Commit | Line | Data |
---|---|---|
b4c8f1da | 1 | #ifndef lint |
559a8aee | 2 | static 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 | ||
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 | ||
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 | |
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 | ||
77 | STRING | |
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; | |
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 | ||
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 | ||
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 | ||
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 | } |