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