1 /* kdb_format.c 7.1 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 union{ /* compatible with both VAX and TAHOE */ 82 double d; 83 int s[4]; 84 } fw; 85 86 while (fcount>0) { 87 fp = ifp; c = *fp; 88 longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p'); 89 if (itype==NSP || *fp=='a') { 90 wx=dot; w=dot; 91 } else { 92 wx=get(dot,itype); 93 w=shorten(wx); 94 } 95 if (errflg) 96 return (fp); 97 if (mkfault) 98 error(0); 99 var[0]=wx; 100 modifier = *fp++; 101 dotinc=(longpr?4:2); 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(wx)); 131 else 132 printc(byte(wx)); 133 dotinc=1; break; 134 135 case 'b': case 'B': 136 printf("%-8o", byte(wx)); dotinc=1; break; 137 138 case '1': 139 printf("%-8R", byte(wx)); 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 'f': 196 fw.d = 0; 197 fw.s[0] = w; 198 fw.s[1] = wx&0xffff; 199 printf("%-16.9f", fw.d); 200 dotinc=4; break; 201 202 case 'F': /* may be done with one get call on TAHOE */ 203 fw.s[0] = w; 204 fw.s[1] = wx&0xffff; 205 fw.s[2]=shorten(get(inkdot(4),itype)); 206 fw.s[3]=shorten(get(inkdot(6),itype)); 207 if (errflg) 208 return (fp); 209 printf("%-32.18F", fw.d); 210 dotinc=8; break; 211 212 case 'n': case 'N': 213 printc('\n'); dotinc=0; break; 214 215 case '"': 216 dotinc=0; 217 while (*fp != '"' && *fp) 218 printc(*fp++); 219 if (*fp) 220 fp++; 221 break; 222 223 case '^': 224 dot=inkdot(-dotinc*fcount); return (fp); 225 226 case '+': 227 dot=inkdot(fcount); return (fp); 228 229 case '-': 230 dot=inkdot(-fcount); return (fp); 231 232 default: 233 error(BADMOD); 234 } 235 if (itype!=NSP) 236 dot=inkdot(dotinc); 237 fcount--; endline(); 238 } 239 return (fp); 240 } 241 242 static 243 printesc(c) 244 register c; 245 { 246 247 c &= STRIP; 248 if (c==0177 || c<SP) 249 printf("^%c", c ^ 0100); 250 else 251 printc(c); 252 } 253 254 long 255 inkdot(incr) 256 { 257 register long newdot; 258 259 newdot=dot+incr; 260 if ((dot ^ newdot) >> 24) 261 error(ADWRAP); 262 return (newdot); 263 } 264