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