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 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 * 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 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 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