xref: /original-bsd/old/adb/adb.tahoe/format.c (revision 0db3846e)
1 #ifndef lint
2 static	char sccsid[] = "@(#)format.c	1.4 (Berkeley) 4/1/87";
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
59 		fp=exform(fcount,fp,itype,ptype);
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;
100 		     IF c=='b' ORF c=='B' ORF c=='c' ORF c=='C' ORF c=='1'
101 		     THEN w=btol(wx); FI
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'
138 			THEN printesc((w>>8)&0xff);
139 			ELSE printc((w>>8)&0xff);
140 			FI
141 			dotinc=1; break;
142 
143 		    case 'b': case 'B':
144 			printf("%-8o", (w>>8)&0xff); dotinc=1; break;
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':
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;
217 
218 		    case 'F':	/* may be done with one get call on TAHOE */
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;
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 }
319