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