1 /*
2  * Copyright (c) 1986 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)kdb_format.c	7.5 (Berkeley) 05/03/90
7  */
8 
9 #include "../kdb/defs.h"
10 
11 char	*kdbBADMOD;
12 char	*kdbADWRAP;
13 
14 char	*kdblp;
15 char	kdblastc,kdbpeekc;
16 long	kdbexpv;
17 
kdbscanform(icount,ifp,itype,ptype)18 kdbscanform(icount,ifp,itype,ptype)
19 	long icount;
20 	char *ifp;
21 {
22 	register char *fp;
23 	char modifier;
24 	register fcount, init=1;
25 	long savdot;
26 	int exact;
27 
28 	while (icount) {
29 		fp=ifp;
30 		savdot=kdbdot; init=0;
31 		if (!init && (exact=(kdbfindsym(kdbdot,ptype)==0)) && kdbmaxoff)
32 			kdbprintf("\n%s:%16t",kdbcursym->n_un.n_name);
33 		/*now loop over format*/
34 		while (*fp && kdberrflg==0) {
35 			if (isdigit(modifier = *fp)) {
36 				fcount = 0;
37 				while (isdigit(modifier = *fp++)) {
38 				   fcount *= 10;
39 				   fcount += modifier-'0';
40 				}
41 				fp--;
42 			} else
43 				fcount = 1;
44 			if (*fp==0)
45 				break;
46 #ifdef	ENTRYMASK
47 			/* check for entry mask */
48 			if (exact && kdbdot==savdot &&
49 			   (kdbcursym->n_type&N_TYPE)==N_TEXT &&
50 			   kdbcursym->n_un.n_name[0]=='_' && *fp=='i') {
51 				(void) kdbexform(1,"x",itype,ptype);
52 				fp++;
53 				kdbprintc(EOR);
54 			} else
55 #endif
56 				fp = kdbexform(fcount,fp,itype,ptype);
57 		}
58 		kdbdotinc=kdbdot-savdot;
59 		kdbdot=savdot;
60 
61 		if (kdberrflg) {
62 			if (icount<0) {
63 				 kdberrflg=0;
64 				 break;
65 			}
66 			kdberror(kdberrflg);
67 		}
68 		if (--icount)
69 			kdbdot=kdbinkdot(kdbdotinc);
70 		if (kdbmkfault)
71 			kdberror((char *)0);
72 	}
73 }
74 
75 /*
76  * Execute single format item `fcount' times
77  * sets `dotinc' and moves `dot'
78  * returns address of next format item
79  */
80 char *
kdbexform(fcount,ifp,itype,ptype)81 kdbexform(fcount,ifp,itype,ptype)
82 	int fcount;
83 	char *ifp;
84 {
85 	register POS w;
86 	register long savdot, wx;
87 	register char *fp;
88 	char c, modifier, longpr;
89 
90 	while (fcount>0) {
91 	  	fp = ifp; c = *fp;
92 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
93 		if (itype != NSP && *fp != 'a') {
94 			wx = kdbget(kdbdot, itype);
95 			w = shorten(wx);
96 		} else {
97 			wx = w = kdbdot;
98 			if (itype == NSP &&
99 			    (c == 'b' || c == 'B' ||
100 			     c == 'c' || c == 'C' || c == '1'))
101 				w = btol(wx);
102 		}
103 		if (kdberrflg)
104 			return (fp);
105 		if (kdbmkfault)
106 			kdberror((char *)0);
107 		kdbvar[0] = wx;
108 		modifier = *fp++;
109 		kdbdotinc = (longpr ? sizeof (long):sizeof (short));
110 
111 		if (kdbcharpos()==0 && modifier!='a')
112 			kdbprintf("%16m");
113 		switch (modifier) {
114 
115 		case SP: case TB:
116 			break;
117 
118 		case 't': case 'T':
119 			kdbprintf("%T",fcount); return (fp);
120 
121 		case 'r': case 'R':
122 			kdbprintf("%M",fcount); return (fp);
123 
124 		case 'a':
125 			kdbpsymoff(kdbdot,ptype,":%16t"); kdbdotinc=0; break;
126 
127 		case 'p':
128 			kdbpsymoff(kdbvar[0],ptype,"%16t"); break;
129 
130 		case 'u':
131 			kdbprintf("%-8u",w); break;
132 
133 		case 'U':
134 			kdbprintf("%-16U",wx); break;
135 
136 		case 'c': case 'C':
137 			if (modifier == 'C')
138 				kdbprintesc((int)byte(w));
139 			else
140 				kdbprintc((char)byte(w));
141 			kdbdotinc=1; break;
142 
143 		case 'b': case 'B':
144 			kdbprintf("%-8o", byte(w)); kdbdotinc=1; break;
145 
146 		case '1':
147 			kdbprintf("%-8R", byte(w)); kdbdotinc=1; break;
148 
149 		case 'w': case '2':
150 			kdbprintf("%-8R", w); break;
151 
152 		case 'W': case '4':
153 			kdbprintf("%-16R", wx); break;
154 
155 		case 's': case 'S':
156 			savdot=kdbdot; kdbdotinc=1;
157 			while ((c=byte(kdbget(kdbdot,itype))) && kdberrflg==0) {
158 				kdbdot=kdbinkdot(1);
159 				if (modifier == 'S')
160 					kdbprintesc((int)c);
161 				else
162 					kdbprintc(c);
163 				kdbendline();
164 			}
165 			kdbdotinc=kdbdot-savdot+1; kdbdot=savdot; break;
166 
167 		case 'x':
168 			kdbprintf("%-8x",w); break;
169 
170 		case 'X':
171 			kdbprintf("%-16X", wx); break;
172 
173 		case 'z':
174 			kdbprintf("%-8z",w); break;
175 
176 		case 'Z':
177 			kdbprintf("%-16Z", wx); break;
178 
179 		case 'Y':
180 			kdbprintf("%-24Y", wx); break;
181 
182 		case 'q':
183 			kdbprintf("%-8q", w); break;
184 
185 		case 'Q':
186 			kdbprintf("%-16Q", wx); break;
187 
188 		case 'o':
189 			kdbprintf("%-8o", w); break;
190 
191 		case 'O':
192 			kdbprintf("%-16O", wx); break;
193 
194 		case 'i': case 'I':
195 			kdbprintins(itype,wx); kdbprintc(EOR); break;
196 
197 		case 'd':
198 			kdbprintf("%-8d", w); break;
199 
200 		case 'D':
201 			kdbprintf("%-16D", wx); break;
202 
203 		case 'n': case 'N':
204 			kdbprintc('\n'); kdbdotinc=0; break;
205 
206 		case '"':
207 			kdbdotinc=0;
208 			while (*fp != '"' && *fp)
209 				kdbprintc(*fp++);
210 			if (*fp)
211 				fp++;
212 			break;
213 
214 		case '^':
215 			kdbdot=kdbinkdot(-kdbdotinc*fcount); return (fp);
216 
217 		case '+':
218 			kdbdot=kdbinkdot(fcount); return (fp);
219 
220 		case '-':
221 			kdbdot=kdbinkdot(-fcount); return (fp);
222 
223 		default:
224 			kdberror(kdbBADMOD);
225 		}
226 		if (itype!=NSP)
227 			kdbdot=kdbinkdot(kdbdotinc);
228 		fcount--; kdbendline();
229 	}
230 	return (fp);
231 }
232 
233 static
kdbprintesc(c)234 kdbprintesc(c)
235 	register int c;
236 {
237 
238 	c &= STRIP;
239 	if (c==0177 || c<SP)
240 		kdbprintf("^%c", c ^ 0100);
241 	else
242 		kdbprintc(c);
243 }
244 
245 long
kdbinkdot(incr)246 kdbinkdot(incr)
247 {
248 	register long newdot;
249 
250 	newdot=kdbdot+incr;
251 	if (addrwrap(kdbdot, newdot))
252 		kdberror(kdbADWRAP);
253 	return (newdot);
254 }
255