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