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