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