xref: /original-bsd/old/adb/adb.tahoe/format.c (revision 576c43b3)
1 #ifndef lint
2 static	char sccsid[] = "@(#)format.c	1.1 (Berkeley) 02/25/86";
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 		/* 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 
83 STRING
84 exform(fcount,ifp,itype,ptype)
85 INT		fcount;
86 STRING		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;
106 		ELSE wx=get(dot,itype);
107 		     w=shorten(wx);
108 		FI
109 		IF errflg THEN return(fp); FI
110 		IF mkfault THEN error(0); FI
111 		var[0]=wx;
112 		modifier = *fp++;
113 		dotinc=(longpr?4:2);
114 
115 		IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI
116 
117 		switch(modifier) {
118 
119 		    case SP: case TB:
120 			break;
121 
122 		    case 't': case 'T':
123 			printf("%T",fcount); return(fp);
124 
125 		    case 'r': case 'R':
126 			printf("%M",fcount); return(fp);
127 
128 		    case 'a':
129 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
130 
131 		    case 'p':
132 			psymoff(var[0],ptype,"%16t"); break;
133 
134 		    case 'u':
135 			printf("%-8u",w); break;
136 
137 		    case 'U':
138 			printf("%-16U",wx); break;
139 
140 		    case 'c': case 'C':
141 			IF modifier=='C'
142 			THEN printesc(byte(wx));
143 			ELSE printc(byte(wx));
144 			FI
145 			dotinc=1; break;
146 
147 		    case 'b': case 'B':
148 			printf("%-8o", byte(wx)); dotinc=1; break;
149 
150 			case '1':
151 			printf("%-8R", byte(wx)); dotinc=1; break;
152 
153 			case '2':
154 		    case 'w':
155 			printf("%-8R", w); break;
156 
157 			case '4':
158 		    case 'W':
159 			printf("%-16R", wx); break;
160 
161 		    case 's': case 'S':
162 			savdot=dot; dotinc=1;
163 			WHILE (c=byte(get(dot,itype))) ANDF errflg==0
164 			DO dot=inkdot(1);
165 			   IF modifier == 'S'
166 			   THEN printesc(c);
167 			   ELSE printc(c);
168 			   FI
169 			   endline();
170 			OD
171 			dotinc=dot-savdot+1; dot=savdot; break;
172 
173 		    case 'x':
174 			printf("%-8x",w); break;
175 
176 		    case 'X':
177 			printf("%-16X", wx); break;
178 
179 		    case 'z':
180 			printf("%-8z",w); break;
181 
182 		    case 'Z':
183 			printf("%-16Z", wx); break;
184 
185 		    case 'Y':
186 			printf("%-24Y", wx); break;
187 
188 		    case 'q':
189 			printf("%-8q", w); break;
190 
191 		    case 'Q':
192 			printf("%-16Q", wx); break;
193 
194 		    case 'o':
195 			printf("%-8o", w); break;
196 
197 		    case 'O':
198 			printf("%-16O", wx); break;
199 
200 		    case 'i':
201 		    case 'I':
202 			printins(itype,wx); printc(EOR); break;
203 
204 		    case 'd':
205 			printf("%-8d", w); break;
206 
207 		    case 'D':
208 			printf("%-16D", wx); break;
209 
210 		    case 'f':
211 			fw.d = 0;
212 			fw.s[0] = w;
213 			fw.s[1] = wx&0xffff;
214 			printf("%-16.9f", fw.d);
215 			dotinc=4; break;
216 
217 		    case 'F':	/* may be done with one get call on TAHOE */
218 			fw.s[0] = w;
219 			fw.s[1] = wx&0xffff;
220 			fw.s[2]=shorten(get(inkdot(4),itype));
221 			fw.s[3]=shorten(get(inkdot(6),itype));
222 			IF errflg THEN return(fp); FI
223 			printf("%-32.18F", fw.d);
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 
256 shell()
257 {
258 #ifndef EDDT
259 	REG	rc, unixpid;
260 	int	status;
261 	REG STRING	argp = lp;
262 	STRING	getenv(), shell = getenv("SHELL");
263 #ifdef VFORK
264 	char		oldstlp;
265 #endif
266 
267 	if (shell == 0)
268 		shell = "/bin/sh";
269 	WHILE lastc!=EOR DO rdc(); OD
270 #ifndef VFORK
271 	IF (unixpid=fork())==0
272 #else
273 	oldstlp = *lp;
274 	IF (unixpid=vfork())==0
275 #endif
276 	THEN	signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
277 		*lp=0; execl(shell, "sh", "-c", argp, 0);
278 		_exit(16);
279 #ifndef VFORK
280 	ELIF unixpid == -1
281 #else
282 	ELIF *lp = oldstlp, unixpid == -1
283 #endif
284 	THEN	error(NOFORK);
285 	ELSE	signal(SIGINT,1);
286 		WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE
287 		signal(SIGINT,sigint);
288 		printc('!'); lp--;
289 	FI
290 #endif
291 }
292 
293 
294 printesc(c)
295 REG c;
296 {
297 	c &= STRIP;
298 	IF c==0177 ORF c<SP
299 	THEN printf("^%c", c ^ 0100);
300 	ELSE printc(c);
301 	FI
302 }
303 
304 L_INT	inkdot(incr)
305 {
306 	REG	L_INT	newdot;
307 
308 	newdot=dot+incr;
309 	IF (dot ^ newdot) >> 24 THEN error(ADWRAP); FI
310 	return(newdot);
311 }
312