1*30136Ssam /* kdb_format.c 7.3 86/11/23 */ 230108Ssam 330108Ssam #include "../kdb/defs.h" 430108Ssam 530108Ssam char *BADMOD; 630108Ssam char *ADWRAP; 730108Ssam 830108Ssam char *lp; 930108Ssam char lastc,peekc; 1030108Ssam long expv; 1130108Ssam 1230108Ssam scanform(icount,ifp,itype,ptype) 1330108Ssam long icount; 1430108Ssam char *ifp; 1530108Ssam { 1630108Ssam register char *fp; 1730108Ssam char modifier; 1830108Ssam register fcount, init=1; 1930108Ssam long savdot; 2030108Ssam int exact; 2130108Ssam 2230108Ssam while (icount) { 2330108Ssam fp=ifp; 2430108Ssam savdot=dot; init=0; 2530108Ssam if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff) 2630108Ssam printf("\n%s:%16t",cursym->n_un.n_name); 2730108Ssam /*now loop over format*/ 2830108Ssam while (*fp && errflg==0) { 2930108Ssam if (isdigit(modifier = *fp)) { 3030108Ssam fcount = 0; 3130108Ssam while (isdigit(modifier = *fp++)) { 3230108Ssam fcount *= 10; 3330108Ssam fcount += modifier-'0'; 3430108Ssam } 3530108Ssam fp--; 3630108Ssam } else 3730108Ssam fcount = 1; 3830108Ssam if (*fp==0) 3930108Ssam break; 40*30136Ssam #ifdef ENTRYMASK 4130108Ssam /* check for entry mask */ 4230108Ssam if (exact && dot==savdot && 4330108Ssam (cursym->n_type&N_TYPE)==N_TEXT && 4430108Ssam cursym->n_un.n_name[0]=='_' && *fp=='i') { 4530108Ssam exform(1,"x",itype,ptype); 4630108Ssam fp++; 4730108Ssam printc(EOR); 4830108Ssam } else 49*30136Ssam #endif 5030108Ssam fp=exform(fcount,fp,itype,ptype); 5130108Ssam } 5230108Ssam dotinc=dot-savdot; 5330108Ssam dot=savdot; 5430108Ssam 5530108Ssam if (errflg) { 5630108Ssam if (icount<0) { 5730108Ssam errflg=0; 5830108Ssam break; 5930108Ssam } 6030108Ssam error(errflg); 6130108Ssam } 6230108Ssam if (--icount) 6330108Ssam dot=inkdot(dotinc); 6430108Ssam if (mkfault) 6530108Ssam error(0); 6630108Ssam } 6730108Ssam } 6830108Ssam 6930108Ssam /* 7030108Ssam * Execute single format item `fcount' times 7130108Ssam * sets `dotinc' and moves `dot' 7230108Ssam * returns address of next format item 7330108Ssam */ 7430108Ssam char * 7530108Ssam exform(fcount,ifp,itype,ptype) 7630108Ssam int fcount; 7730108Ssam char *ifp; 7830108Ssam { 7930108Ssam register POS w; 8030108Ssam register long savdot, wx; 8130108Ssam register char *fp; 8230108Ssam char c, modifier, longpr; 8330108Ssam 8430108Ssam while (fcount>0) { 8530108Ssam fp = ifp; c = *fp; 8630119Ssam longpr = (isupper(c) || c=='f' || c=='4' || c=='p'); 8730119Ssam if (itype != NSP && *fp != 'a') { 8830119Ssam wx = get(dot, itype); 8930119Ssam w = shorten(wx); 9030108Ssam } else { 9130119Ssam wx = w = dot; 9230119Ssam if (itype == NSP && 9330119Ssam (c == 'b' || c == 'B' || 9430119Ssam c == 'c' || c == 'C' || c == '1')) 9530119Ssam w = btol(wx); 9630108Ssam } 9730108Ssam if (errflg) 9830108Ssam return (fp); 9930108Ssam if (mkfault) 10030108Ssam error(0); 10130119Ssam var[0] = wx; 10230108Ssam modifier = *fp++; 10330119Ssam dotinc = (longpr ? sizeof (long):sizeof (short)); 10430108Ssam 10530108Ssam if (charpos()==0 && modifier!='a') 10630108Ssam printf("%16m"); 10730108Ssam switch (modifier) { 10830108Ssam 10930108Ssam case SP: case TB: 11030108Ssam break; 11130108Ssam 11230108Ssam case 't': case 'T': 11330108Ssam printf("%T",fcount); return (fp); 11430108Ssam 11530108Ssam case 'r': case 'R': 11630108Ssam printf("%M",fcount); return (fp); 11730108Ssam 11830108Ssam case 'a': 11930108Ssam psymoff(dot,ptype,":%16t"); dotinc=0; break; 12030108Ssam 12130108Ssam case 'p': 12230108Ssam psymoff(var[0],ptype,"%16t"); break; 12330108Ssam 12430108Ssam case 'u': 12530108Ssam printf("%-8u",w); break; 12630108Ssam 12730108Ssam case 'U': 12830108Ssam printf("%-16U",wx); break; 12930108Ssam 13030108Ssam case 'c': case 'C': 13130119Ssam if (modifier == 'C') 13230119Ssam printesc(byte(w)); 13330108Ssam else 13430119Ssam printc(byte(w)); 13530108Ssam dotinc=1; break; 13630108Ssam 13730108Ssam case 'b': case 'B': 13830119Ssam printf("%-8o", byte(w)); dotinc=1; break; 13930108Ssam 14030108Ssam case '1': 14130119Ssam printf("%-8R", byte(w)); dotinc=1; break; 14230108Ssam 14330108Ssam case 'w': case '2': 14430108Ssam printf("%-8R", w); break; 14530108Ssam 14630108Ssam case 'W': case '4': 14730108Ssam printf("%-16R", wx); break; 14830108Ssam 14930108Ssam case 's': case 'S': 15030108Ssam savdot=dot; dotinc=1; 15130108Ssam while ((c=byte(get(dot,itype))) && errflg==0) { 15230108Ssam dot=inkdot(1); 15330108Ssam if (modifier == 'S') 15430108Ssam printesc(c); 15530108Ssam else 15630108Ssam printc(c); 15730108Ssam endline(); 15830108Ssam } 15930108Ssam dotinc=dot-savdot+1; dot=savdot; break; 16030108Ssam 16130108Ssam case 'x': 16230108Ssam printf("%-8x",w); break; 16330108Ssam 16430108Ssam case 'X': 16530108Ssam printf("%-16X", wx); break; 16630108Ssam 16730108Ssam case 'z': 16830108Ssam printf("%-8z",w); break; 16930108Ssam 17030108Ssam case 'Z': 17130108Ssam printf("%-16Z", wx); break; 17230108Ssam 17330108Ssam case 'Y': 17430108Ssam printf("%-24Y", wx); break; 17530108Ssam 17630108Ssam case 'q': 17730108Ssam printf("%-8q", w); break; 17830108Ssam 17930108Ssam case 'Q': 18030108Ssam printf("%-16Q", wx); break; 18130108Ssam 18230108Ssam case 'o': 18330108Ssam printf("%-8o", w); break; 18430108Ssam 18530108Ssam case 'O': 18630108Ssam printf("%-16O", wx); break; 18730108Ssam 18830108Ssam case 'i': case 'I': 18930108Ssam printins(itype,wx); printc(EOR); break; 19030108Ssam 19130108Ssam case 'd': 19230108Ssam printf("%-8d", w); break; 19330108Ssam 19430108Ssam case 'D': 19530108Ssam printf("%-16D", wx); break; 19630108Ssam 19730108Ssam case 'n': case 'N': 19830108Ssam printc('\n'); dotinc=0; break; 19930108Ssam 20030108Ssam case '"': 20130108Ssam dotinc=0; 20230108Ssam while (*fp != '"' && *fp) 20330108Ssam printc(*fp++); 20430108Ssam if (*fp) 20530108Ssam fp++; 20630108Ssam break; 20730108Ssam 20830108Ssam case '^': 20930108Ssam dot=inkdot(-dotinc*fcount); return (fp); 21030108Ssam 21130108Ssam case '+': 21230108Ssam dot=inkdot(fcount); return (fp); 21330108Ssam 21430108Ssam case '-': 21530108Ssam dot=inkdot(-fcount); return (fp); 21630108Ssam 21730108Ssam default: 21830108Ssam error(BADMOD); 21930108Ssam } 22030108Ssam if (itype!=NSP) 22130108Ssam dot=inkdot(dotinc); 22230108Ssam fcount--; endline(); 22330108Ssam } 22430108Ssam return (fp); 22530108Ssam } 22630108Ssam 22730108Ssam static 22830108Ssam printesc(c) 22930108Ssam register c; 23030108Ssam { 23130108Ssam 23230108Ssam c &= STRIP; 23330108Ssam if (c==0177 || c<SP) 23430108Ssam printf("^%c", c ^ 0100); 23530108Ssam else 23630108Ssam printc(c); 23730108Ssam } 23830108Ssam 23930108Ssam long 24030108Ssam inkdot(incr) 24130108Ssam { 24230108Ssam register long newdot; 24330108Ssam 24430108Ssam newdot=dot+incr; 245*30136Ssam if (addrwrap(dot, newdot)) 24630108Ssam error(ADWRAP); 24730108Ssam return (newdot); 24830108Ssam } 249