1*30108Ssam /*	kdb_format.c	7.1	86/11/20	*/
2*30108Ssam 
3*30108Ssam #include "../kdb/defs.h"
4*30108Ssam 
5*30108Ssam char	*BADMOD;
6*30108Ssam char	*ADWRAP;
7*30108Ssam 
8*30108Ssam char	*lp;
9*30108Ssam char	lastc,peekc;
10*30108Ssam long	expv;
11*30108Ssam 
12*30108Ssam scanform(icount,ifp,itype,ptype)
13*30108Ssam 	long icount;
14*30108Ssam 	char *ifp;
15*30108Ssam {
16*30108Ssam 	register char *fp;
17*30108Ssam 	char modifier;
18*30108Ssam 	register fcount, init=1;
19*30108Ssam 	long savdot;
20*30108Ssam 	int exact;
21*30108Ssam 
22*30108Ssam 	while (icount) {
23*30108Ssam 		fp=ifp;
24*30108Ssam 		savdot=dot; init=0;
25*30108Ssam 		if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff)
26*30108Ssam 			printf("\n%s:%16t",cursym->n_un.n_name);
27*30108Ssam 		/*now loop over format*/
28*30108Ssam 		while (*fp && errflg==0) {
29*30108Ssam 			if (isdigit(modifier = *fp)) {
30*30108Ssam 				fcount = 0;
31*30108Ssam 				while (isdigit(modifier = *fp++)) {
32*30108Ssam 				   fcount *= 10;
33*30108Ssam 				   fcount += modifier-'0';
34*30108Ssam 				}
35*30108Ssam 				fp--;
36*30108Ssam 			} else
37*30108Ssam 				fcount = 1;
38*30108Ssam 			if (*fp==0)
39*30108Ssam 				break;
40*30108Ssam 			/* check for entry mask */
41*30108Ssam 			if (exact && dot==savdot &&
42*30108Ssam 			   (cursym->n_type&N_TYPE)==N_TEXT &&
43*30108Ssam 			   cursym->n_un.n_name[0]=='_' && *fp=='i') {
44*30108Ssam 				exform(1,"x",itype,ptype);
45*30108Ssam 				fp++;
46*30108Ssam 				printc(EOR);
47*30108Ssam 			} else
48*30108Ssam 				fp=exform(fcount,fp,itype,ptype);
49*30108Ssam 		}
50*30108Ssam 		dotinc=dot-savdot;
51*30108Ssam 		dot=savdot;
52*30108Ssam 
53*30108Ssam 		if (errflg) {
54*30108Ssam 			if (icount<0) {
55*30108Ssam 				 errflg=0;
56*30108Ssam 				 break;
57*30108Ssam 			}
58*30108Ssam 			error(errflg);
59*30108Ssam 		}
60*30108Ssam 		if (--icount)
61*30108Ssam 			dot=inkdot(dotinc);
62*30108Ssam 		if (mkfault)
63*30108Ssam 			error(0);
64*30108Ssam 	}
65*30108Ssam }
66*30108Ssam 
67*30108Ssam /*
68*30108Ssam  * Execute single format item `fcount' times
69*30108Ssam  * sets `dotinc' and moves `dot'
70*30108Ssam  * returns address of next format item
71*30108Ssam  */
72*30108Ssam char *
73*30108Ssam exform(fcount,ifp,itype,ptype)
74*30108Ssam 	int fcount;
75*30108Ssam 	char *ifp;
76*30108Ssam {
77*30108Ssam 	register POS w;
78*30108Ssam 	register long savdot, wx;
79*30108Ssam 	register char *fp;
80*30108Ssam 	char c, modifier, longpr;
81*30108Ssam 	union{	/* compatible with both VAX and TAHOE */
82*30108Ssam 		double	d;
83*30108Ssam 		int	s[4];
84*30108Ssam 	} fw;
85*30108Ssam 
86*30108Ssam 	while (fcount>0) {
87*30108Ssam 	  	fp = ifp; c = *fp;
88*30108Ssam 		longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p');
89*30108Ssam 		if (itype==NSP || *fp=='a') {
90*30108Ssam 			wx=dot; w=dot;
91*30108Ssam 		} else {
92*30108Ssam 			wx=get(dot,itype);
93*30108Ssam 			w=shorten(wx);
94*30108Ssam 		}
95*30108Ssam 		if (errflg)
96*30108Ssam 			return (fp);
97*30108Ssam 		if (mkfault)
98*30108Ssam 			error(0);
99*30108Ssam 		var[0]=wx;
100*30108Ssam 		modifier = *fp++;
101*30108Ssam 		dotinc=(longpr?4:2);
102*30108Ssam 
103*30108Ssam 		if (charpos()==0 && modifier!='a')
104*30108Ssam 			printf("%16m");
105*30108Ssam 		switch (modifier) {
106*30108Ssam 
107*30108Ssam 		case SP: case TB:
108*30108Ssam 			break;
109*30108Ssam 
110*30108Ssam 		case 't': case 'T':
111*30108Ssam 			printf("%T",fcount); return (fp);
112*30108Ssam 
113*30108Ssam 		case 'r': case 'R':
114*30108Ssam 			printf("%M",fcount); return (fp);
115*30108Ssam 
116*30108Ssam 		case 'a':
117*30108Ssam 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
118*30108Ssam 
119*30108Ssam 		case 'p':
120*30108Ssam 			psymoff(var[0],ptype,"%16t"); break;
121*30108Ssam 
122*30108Ssam 		case 'u':
123*30108Ssam 			printf("%-8u",w); break;
124*30108Ssam 
125*30108Ssam 		case 'U':
126*30108Ssam 			printf("%-16U",wx); break;
127*30108Ssam 
128*30108Ssam 		case 'c': case 'C':
129*30108Ssam 			if (modifier=='C')
130*30108Ssam 				printesc(byte(wx));
131*30108Ssam 			else
132*30108Ssam 				printc(byte(wx));
133*30108Ssam 			dotinc=1; break;
134*30108Ssam 
135*30108Ssam 		case 'b': case 'B':
136*30108Ssam 			printf("%-8o", byte(wx)); dotinc=1; break;
137*30108Ssam 
138*30108Ssam 		case '1':
139*30108Ssam 			printf("%-8R", byte(wx)); dotinc=1; break;
140*30108Ssam 
141*30108Ssam 		case 'w': case '2':
142*30108Ssam 			printf("%-8R", w); break;
143*30108Ssam 
144*30108Ssam 		case 'W': case '4':
145*30108Ssam 			printf("%-16R", wx); break;
146*30108Ssam 
147*30108Ssam 		case 's': case 'S':
148*30108Ssam 			savdot=dot; dotinc=1;
149*30108Ssam 			while ((c=byte(get(dot,itype))) && errflg==0) {
150*30108Ssam 				dot=inkdot(1);
151*30108Ssam 				if (modifier == 'S')
152*30108Ssam 					printesc(c);
153*30108Ssam 				else
154*30108Ssam 					printc(c);
155*30108Ssam 				endline();
156*30108Ssam 			}
157*30108Ssam 			dotinc=dot-savdot+1; dot=savdot; break;
158*30108Ssam 
159*30108Ssam 		case 'x':
160*30108Ssam 			printf("%-8x",w); break;
161*30108Ssam 
162*30108Ssam 		case 'X':
163*30108Ssam 			printf("%-16X", wx); break;
164*30108Ssam 
165*30108Ssam 		case 'z':
166*30108Ssam 			printf("%-8z",w); break;
167*30108Ssam 
168*30108Ssam 		case 'Z':
169*30108Ssam 			printf("%-16Z", wx); break;
170*30108Ssam 
171*30108Ssam 		case 'Y':
172*30108Ssam 			printf("%-24Y", wx); break;
173*30108Ssam 
174*30108Ssam 		case 'q':
175*30108Ssam 			printf("%-8q", w); break;
176*30108Ssam 
177*30108Ssam 		case 'Q':
178*30108Ssam 			printf("%-16Q", wx); break;
179*30108Ssam 
180*30108Ssam 		case 'o':
181*30108Ssam 			printf("%-8o", w); break;
182*30108Ssam 
183*30108Ssam 		case 'O':
184*30108Ssam 			printf("%-16O", wx); break;
185*30108Ssam 
186*30108Ssam 		case 'i': case 'I':
187*30108Ssam 			printins(itype,wx); printc(EOR); break;
188*30108Ssam 
189*30108Ssam 		case 'd':
190*30108Ssam 			printf("%-8d", w); break;
191*30108Ssam 
192*30108Ssam 		case 'D':
193*30108Ssam 			printf("%-16D", wx); break;
194*30108Ssam 
195*30108Ssam 		case 'f':
196*30108Ssam 			fw.d = 0;
197*30108Ssam 			fw.s[0] = w;
198*30108Ssam 			fw.s[1] = wx&0xffff;
199*30108Ssam 			printf("%-16.9f", fw.d);
200*30108Ssam 			dotinc=4; break;
201*30108Ssam 
202*30108Ssam 		case 'F':	/* may be done with one get call on TAHOE */
203*30108Ssam 			fw.s[0] = w;
204*30108Ssam 			fw.s[1] = wx&0xffff;
205*30108Ssam 			fw.s[2]=shorten(get(inkdot(4),itype));
206*30108Ssam 			fw.s[3]=shorten(get(inkdot(6),itype));
207*30108Ssam 			if (errflg)
208*30108Ssam 				return (fp);
209*30108Ssam 			printf("%-32.18F", fw.d);
210*30108Ssam 			dotinc=8; break;
211*30108Ssam 
212*30108Ssam 		case 'n': case 'N':
213*30108Ssam 			printc('\n'); dotinc=0; break;
214*30108Ssam 
215*30108Ssam 		case '"':
216*30108Ssam 			dotinc=0;
217*30108Ssam 			while (*fp != '"' && *fp)
218*30108Ssam 				printc(*fp++);
219*30108Ssam 			if (*fp)
220*30108Ssam 				fp++;
221*30108Ssam 			break;
222*30108Ssam 
223*30108Ssam 		case '^':
224*30108Ssam 			dot=inkdot(-dotinc*fcount); return (fp);
225*30108Ssam 
226*30108Ssam 		case '+':
227*30108Ssam 			dot=inkdot(fcount); return (fp);
228*30108Ssam 
229*30108Ssam 		case '-':
230*30108Ssam 			dot=inkdot(-fcount); return (fp);
231*30108Ssam 
232*30108Ssam 		default:
233*30108Ssam 			error(BADMOD);
234*30108Ssam 		}
235*30108Ssam 		if (itype!=NSP)
236*30108Ssam 			dot=inkdot(dotinc);
237*30108Ssam 		fcount--; endline();
238*30108Ssam 	}
239*30108Ssam 	return (fp);
240*30108Ssam }
241*30108Ssam 
242*30108Ssam static
243*30108Ssam printesc(c)
244*30108Ssam 	register c;
245*30108Ssam {
246*30108Ssam 
247*30108Ssam 	c &= STRIP;
248*30108Ssam 	if (c==0177 || c<SP)
249*30108Ssam 		printf("^%c", c ^ 0100);
250*30108Ssam 	else
251*30108Ssam 		printc(c);
252*30108Ssam }
253*30108Ssam 
254*30108Ssam long
255*30108Ssam inkdot(incr)
256*30108Ssam {
257*30108Ssam 	register long newdot;
258*30108Ssam 
259*30108Ssam 	newdot=dot+incr;
260*30108Ssam 	if ((dot ^ newdot) >> 24)
261*30108Ssam 		error(ADWRAP);
262*30108Ssam 	return (newdot);
263*30108Ssam }
264