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