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