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