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