1 /*	kdb_format.c	7.3	86/11/23	*/
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 #ifdef	ENTRYMASK
41 			/* check for entry mask */
42 			if (exact && dot==savdot &&
43 			   (cursym->n_type&N_TYPE)==N_TEXT &&
44 			   cursym->n_un.n_name[0]=='_' && *fp=='i') {
45 				exform(1,"x",itype,ptype);
46 				fp++;
47 				printc(EOR);
48 			} else
49 #endif
50 				fp=exform(fcount,fp,itype,ptype);
51 		}
52 		dotinc=dot-savdot;
53 		dot=savdot;
54 
55 		if (errflg) {
56 			if (icount<0) {
57 				 errflg=0;
58 				 break;
59 			}
60 			error(errflg);
61 		}
62 		if (--icount)
63 			dot=inkdot(dotinc);
64 		if (mkfault)
65 			error(0);
66 	}
67 }
68 
69 /*
70  * Execute single format item `fcount' times
71  * sets `dotinc' and moves `dot'
72  * returns address of next format item
73  */
74 char *
75 exform(fcount,ifp,itype,ptype)
76 	int fcount;
77 	char *ifp;
78 {
79 	register POS w;
80 	register long savdot, wx;
81 	register char *fp;
82 	char c, modifier, longpr;
83 
84 	while (fcount>0) {
85 	  	fp = ifp; c = *fp;
86 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
87 		if (itype != NSP && *fp != 'a') {
88 			wx = get(dot, itype);
89 			w = shorten(wx);
90 		} else {
91 			wx = w = dot;
92 			if (itype == NSP &&
93 			    (c == 'b' || c == 'B' ||
94 			     c == 'c' || c == 'C' || c == '1'))
95 				w = btol(wx);
96 		}
97 		if (errflg)
98 			return (fp);
99 		if (mkfault)
100 			error(0);
101 		var[0] = wx;
102 		modifier = *fp++;
103 		dotinc = (longpr ? sizeof (long):sizeof (short));
104 
105 		if (charpos()==0 && modifier!='a')
106 			printf("%16m");
107 		switch (modifier) {
108 
109 		case SP: case TB:
110 			break;
111 
112 		case 't': case 'T':
113 			printf("%T",fcount); return (fp);
114 
115 		case 'r': case 'R':
116 			printf("%M",fcount); return (fp);
117 
118 		case 'a':
119 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
120 
121 		case 'p':
122 			psymoff(var[0],ptype,"%16t"); break;
123 
124 		case 'u':
125 			printf("%-8u",w); break;
126 
127 		case 'U':
128 			printf("%-16U",wx); break;
129 
130 		case 'c': case 'C':
131 			if (modifier == 'C')
132 				printesc(byte(w));
133 			else
134 				printc(byte(w));
135 			dotinc=1; break;
136 
137 		case 'b': case 'B':
138 			printf("%-8o", byte(w)); dotinc=1; break;
139 
140 		case '1':
141 			printf("%-8R", byte(w)); dotinc=1; break;
142 
143 		case 'w': case '2':
144 			printf("%-8R", w); break;
145 
146 		case 'W': case '4':
147 			printf("%-16R", wx); break;
148 
149 		case 's': case 'S':
150 			savdot=dot; dotinc=1;
151 			while ((c=byte(get(dot,itype))) && errflg==0) {
152 				dot=inkdot(1);
153 				if (modifier == 'S')
154 					printesc(c);
155 				else
156 					printc(c);
157 				endline();
158 			}
159 			dotinc=dot-savdot+1; dot=savdot; break;
160 
161 		case 'x':
162 			printf("%-8x",w); break;
163 
164 		case 'X':
165 			printf("%-16X", wx); break;
166 
167 		case 'z':
168 			printf("%-8z",w); break;
169 
170 		case 'Z':
171 			printf("%-16Z", wx); break;
172 
173 		case 'Y':
174 			printf("%-24Y", wx); break;
175 
176 		case 'q':
177 			printf("%-8q", w); break;
178 
179 		case 'Q':
180 			printf("%-16Q", wx); break;
181 
182 		case 'o':
183 			printf("%-8o", w); break;
184 
185 		case 'O':
186 			printf("%-16O", wx); break;
187 
188 		case 'i': case 'I':
189 			printins(itype,wx); printc(EOR); break;
190 
191 		case 'd':
192 			printf("%-8d", w); break;
193 
194 		case 'D':
195 			printf("%-16D", wx); break;
196 
197 		case 'n': case 'N':
198 			printc('\n'); dotinc=0; break;
199 
200 		case '"':
201 			dotinc=0;
202 			while (*fp != '"' && *fp)
203 				printc(*fp++);
204 			if (*fp)
205 				fp++;
206 			break;
207 
208 		case '^':
209 			dot=inkdot(-dotinc*fcount); return (fp);
210 
211 		case '+':
212 			dot=inkdot(fcount); return (fp);
213 
214 		case '-':
215 			dot=inkdot(-fcount); return (fp);
216 
217 		default:
218 			error(BADMOD);
219 		}
220 		if (itype!=NSP)
221 			dot=inkdot(dotinc);
222 		fcount--; endline();
223 	}
224 	return (fp);
225 }
226 
227 static
228 printesc(c)
229 	register c;
230 {
231 
232 	c &= STRIP;
233 	if (c==0177 || c<SP)
234 		printf("^%c", c ^ 0100);
235 	else
236 		printc(c);
237 }
238 
239 long
240 inkdot(incr)
241 {
242 	register long newdot;
243 
244 	newdot=dot+incr;
245 	if (addrwrap(dot, newdot))
246 		error(ADWRAP);
247 	return (newdot);
248 }
249