1*30108Ssam /* kdb_format.c 7.1 86/11/20 */ 2*30108Ssam 3*30108Ssam #include "../kdb/defs.h" 4*30108Ssam 5*30108Ssam char *BADMOD; 6*30108Ssam char *ADWRAP; 7*30108Ssam 8*30108Ssam char *lp; 9*30108Ssam char lastc,peekc; 10*30108Ssam long expv; 11*30108Ssam 12*30108Ssam scanform(icount,ifp,itype,ptype) 13*30108Ssam long icount; 14*30108Ssam char *ifp; 15*30108Ssam { 16*30108Ssam register char *fp; 17*30108Ssam char modifier; 18*30108Ssam register fcount, init=1; 19*30108Ssam long savdot; 20*30108Ssam int exact; 21*30108Ssam 22*30108Ssam while (icount) { 23*30108Ssam fp=ifp; 24*30108Ssam savdot=dot; init=0; 25*30108Ssam if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff) 26*30108Ssam printf("\n%s:%16t",cursym->n_un.n_name); 27*30108Ssam /*now loop over format*/ 28*30108Ssam while (*fp && errflg==0) { 29*30108Ssam if (isdigit(modifier = *fp)) { 30*30108Ssam fcount = 0; 31*30108Ssam while (isdigit(modifier = *fp++)) { 32*30108Ssam fcount *= 10; 33*30108Ssam fcount += modifier-'0'; 34*30108Ssam } 35*30108Ssam fp--; 36*30108Ssam } else 37*30108Ssam fcount = 1; 38*30108Ssam if (*fp==0) 39*30108Ssam break; 40*30108Ssam /* check for entry mask */ 41*30108Ssam if (exact && dot==savdot && 42*30108Ssam (cursym->n_type&N_TYPE)==N_TEXT && 43*30108Ssam cursym->n_un.n_name[0]=='_' && *fp=='i') { 44*30108Ssam exform(1,"x",itype,ptype); 45*30108Ssam fp++; 46*30108Ssam printc(EOR); 47*30108Ssam } else 48*30108Ssam fp=exform(fcount,fp,itype,ptype); 49*30108Ssam } 50*30108Ssam dotinc=dot-savdot; 51*30108Ssam dot=savdot; 52*30108Ssam 53*30108Ssam if (errflg) { 54*30108Ssam if (icount<0) { 55*30108Ssam errflg=0; 56*30108Ssam break; 57*30108Ssam } 58*30108Ssam error(errflg); 59*30108Ssam } 60*30108Ssam if (--icount) 61*30108Ssam dot=inkdot(dotinc); 62*30108Ssam if (mkfault) 63*30108Ssam error(0); 64*30108Ssam } 65*30108Ssam } 66*30108Ssam 67*30108Ssam /* 68*30108Ssam * Execute single format item `fcount' times 69*30108Ssam * sets `dotinc' and moves `dot' 70*30108Ssam * returns address of next format item 71*30108Ssam */ 72*30108Ssam char * 73*30108Ssam exform(fcount,ifp,itype,ptype) 74*30108Ssam int fcount; 75*30108Ssam char *ifp; 76*30108Ssam { 77*30108Ssam register POS w; 78*30108Ssam register long savdot, wx; 79*30108Ssam register char *fp; 80*30108Ssam char c, modifier, longpr; 81*30108Ssam union{ /* compatible with both VAX and TAHOE */ 82*30108Ssam double d; 83*30108Ssam int s[4]; 84*30108Ssam } fw; 85*30108Ssam 86*30108Ssam while (fcount>0) { 87*30108Ssam fp = ifp; c = *fp; 88*30108Ssam longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p'); 89*30108Ssam if (itype==NSP || *fp=='a') { 90*30108Ssam wx=dot; w=dot; 91*30108Ssam } else { 92*30108Ssam wx=get(dot,itype); 93*30108Ssam w=shorten(wx); 94*30108Ssam } 95*30108Ssam if (errflg) 96*30108Ssam return (fp); 97*30108Ssam if (mkfault) 98*30108Ssam error(0); 99*30108Ssam var[0]=wx; 100*30108Ssam modifier = *fp++; 101*30108Ssam dotinc=(longpr?4:2); 102*30108Ssam 103*30108Ssam if (charpos()==0 && modifier!='a') 104*30108Ssam printf("%16m"); 105*30108Ssam switch (modifier) { 106*30108Ssam 107*30108Ssam case SP: case TB: 108*30108Ssam break; 109*30108Ssam 110*30108Ssam case 't': case 'T': 111*30108Ssam printf("%T",fcount); return (fp); 112*30108Ssam 113*30108Ssam case 'r': case 'R': 114*30108Ssam printf("%M",fcount); return (fp); 115*30108Ssam 116*30108Ssam case 'a': 117*30108Ssam psymoff(dot,ptype,":%16t"); dotinc=0; break; 118*30108Ssam 119*30108Ssam case 'p': 120*30108Ssam psymoff(var[0],ptype,"%16t"); break; 121*30108Ssam 122*30108Ssam case 'u': 123*30108Ssam printf("%-8u",w); break; 124*30108Ssam 125*30108Ssam case 'U': 126*30108Ssam printf("%-16U",wx); break; 127*30108Ssam 128*30108Ssam case 'c': case 'C': 129*30108Ssam if (modifier=='C') 130*30108Ssam printesc(byte(wx)); 131*30108Ssam else 132*30108Ssam printc(byte(wx)); 133*30108Ssam dotinc=1; break; 134*30108Ssam 135*30108Ssam case 'b': case 'B': 136*30108Ssam printf("%-8o", byte(wx)); dotinc=1; break; 137*30108Ssam 138*30108Ssam case '1': 139*30108Ssam printf("%-8R", byte(wx)); dotinc=1; break; 140*30108Ssam 141*30108Ssam case 'w': case '2': 142*30108Ssam printf("%-8R", w); break; 143*30108Ssam 144*30108Ssam case 'W': case '4': 145*30108Ssam printf("%-16R", wx); break; 146*30108Ssam 147*30108Ssam case 's': case 'S': 148*30108Ssam savdot=dot; dotinc=1; 149*30108Ssam while ((c=byte(get(dot,itype))) && errflg==0) { 150*30108Ssam dot=inkdot(1); 151*30108Ssam if (modifier == 'S') 152*30108Ssam printesc(c); 153*30108Ssam else 154*30108Ssam printc(c); 155*30108Ssam endline(); 156*30108Ssam } 157*30108Ssam dotinc=dot-savdot+1; dot=savdot; break; 158*30108Ssam 159*30108Ssam case 'x': 160*30108Ssam printf("%-8x",w); break; 161*30108Ssam 162*30108Ssam case 'X': 163*30108Ssam printf("%-16X", wx); break; 164*30108Ssam 165*30108Ssam case 'z': 166*30108Ssam printf("%-8z",w); break; 167*30108Ssam 168*30108Ssam case 'Z': 169*30108Ssam printf("%-16Z", wx); break; 170*30108Ssam 171*30108Ssam case 'Y': 172*30108Ssam printf("%-24Y", wx); break; 173*30108Ssam 174*30108Ssam case 'q': 175*30108Ssam printf("%-8q", w); break; 176*30108Ssam 177*30108Ssam case 'Q': 178*30108Ssam printf("%-16Q", wx); break; 179*30108Ssam 180*30108Ssam case 'o': 181*30108Ssam printf("%-8o", w); break; 182*30108Ssam 183*30108Ssam case 'O': 184*30108Ssam printf("%-16O", wx); break; 185*30108Ssam 186*30108Ssam case 'i': case 'I': 187*30108Ssam printins(itype,wx); printc(EOR); break; 188*30108Ssam 189*30108Ssam case 'd': 190*30108Ssam printf("%-8d", w); break; 191*30108Ssam 192*30108Ssam case 'D': 193*30108Ssam printf("%-16D", wx); break; 194*30108Ssam 195*30108Ssam case 'f': 196*30108Ssam fw.d = 0; 197*30108Ssam fw.s[0] = w; 198*30108Ssam fw.s[1] = wx&0xffff; 199*30108Ssam printf("%-16.9f", fw.d); 200*30108Ssam dotinc=4; break; 201*30108Ssam 202*30108Ssam case 'F': /* may be done with one get call on TAHOE */ 203*30108Ssam fw.s[0] = w; 204*30108Ssam fw.s[1] = wx&0xffff; 205*30108Ssam fw.s[2]=shorten(get(inkdot(4),itype)); 206*30108Ssam fw.s[3]=shorten(get(inkdot(6),itype)); 207*30108Ssam if (errflg) 208*30108Ssam return (fp); 209*30108Ssam printf("%-32.18F", fw.d); 210*30108Ssam dotinc=8; break; 211*30108Ssam 212*30108Ssam case 'n': case 'N': 213*30108Ssam printc('\n'); dotinc=0; break; 214*30108Ssam 215*30108Ssam case '"': 216*30108Ssam dotinc=0; 217*30108Ssam while (*fp != '"' && *fp) 218*30108Ssam printc(*fp++); 219*30108Ssam if (*fp) 220*30108Ssam fp++; 221*30108Ssam break; 222*30108Ssam 223*30108Ssam case '^': 224*30108Ssam dot=inkdot(-dotinc*fcount); return (fp); 225*30108Ssam 226*30108Ssam case '+': 227*30108Ssam dot=inkdot(fcount); return (fp); 228*30108Ssam 229*30108Ssam case '-': 230*30108Ssam dot=inkdot(-fcount); return (fp); 231*30108Ssam 232*30108Ssam default: 233*30108Ssam error(BADMOD); 234*30108Ssam } 235*30108Ssam if (itype!=NSP) 236*30108Ssam dot=inkdot(dotinc); 237*30108Ssam fcount--; endline(); 238*30108Ssam } 239*30108Ssam return (fp); 240*30108Ssam } 241*30108Ssam 242*30108Ssam static 243*30108Ssam printesc(c) 244*30108Ssam register c; 245*30108Ssam { 246*30108Ssam 247*30108Ssam c &= STRIP; 248*30108Ssam if (c==0177 || c<SP) 249*30108Ssam printf("^%c", c ^ 0100); 250*30108Ssam else 251*30108Ssam printc(c); 252*30108Ssam } 253*30108Ssam 254*30108Ssam long 255*30108Ssam inkdot(incr) 256*30108Ssam { 257*30108Ssam register long newdot; 258*30108Ssam 259*30108Ssam newdot=dot+incr; 260*30108Ssam if ((dot ^ newdot) >> 24) 261*30108Ssam error(ADWRAP); 262*30108Ssam return (newdot); 263*30108Ssam } 264