1*30119Ssam /* kdb_format.c 7.2 86/11/20 */ 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; 4030108Ssam /* check for entry mask */ 4130108Ssam if (exact && dot==savdot && 4230108Ssam (cursym->n_type&N_TYPE)==N_TEXT && 4330108Ssam cursym->n_un.n_name[0]=='_' && *fp=='i') { 4430108Ssam exform(1,"x",itype,ptype); 4530108Ssam fp++; 4630108Ssam printc(EOR); 4730108Ssam } else 4830108Ssam fp=exform(fcount,fp,itype,ptype); 4930108Ssam } 5030108Ssam dotinc=dot-savdot; 5130108Ssam dot=savdot; 5230108Ssam 5330108Ssam if (errflg) { 5430108Ssam if (icount<0) { 5530108Ssam errflg=0; 5630108Ssam break; 5730108Ssam } 5830108Ssam error(errflg); 5930108Ssam } 6030108Ssam if (--icount) 6130108Ssam dot=inkdot(dotinc); 6230108Ssam if (mkfault) 6330108Ssam error(0); 6430108Ssam } 6530108Ssam } 6630108Ssam 6730108Ssam /* 6830108Ssam * Execute single format item `fcount' times 6930108Ssam * sets `dotinc' and moves `dot' 7030108Ssam * returns address of next format item 7130108Ssam */ 7230108Ssam char * 7330108Ssam exform(fcount,ifp,itype,ptype) 7430108Ssam int fcount; 7530108Ssam char *ifp; 7630108Ssam { 7730108Ssam register POS w; 7830108Ssam register long savdot, wx; 7930108Ssam register char *fp; 8030108Ssam char c, modifier, longpr; 8130108Ssam 8230108Ssam while (fcount>0) { 8330108Ssam fp = ifp; c = *fp; 84*30119Ssam longpr = (isupper(c) || c=='f' || c=='4' || c=='p'); 85*30119Ssam if (itype != NSP && *fp != 'a') { 86*30119Ssam wx = get(dot, itype); 87*30119Ssam w = shorten(wx); 8830108Ssam } else { 89*30119Ssam wx = w = dot; 90*30119Ssam if (itype == NSP && 91*30119Ssam (c == 'b' || c == 'B' || 92*30119Ssam c == 'c' || c == 'C' || c == '1')) 93*30119Ssam w = btol(wx); 9430108Ssam } 9530108Ssam if (errflg) 9630108Ssam return (fp); 9730108Ssam if (mkfault) 9830108Ssam error(0); 99*30119Ssam var[0] = wx; 10030108Ssam modifier = *fp++; 101*30119Ssam dotinc = (longpr ? sizeof (long):sizeof (short)); 10230108Ssam 10330108Ssam if (charpos()==0 && modifier!='a') 10430108Ssam printf("%16m"); 10530108Ssam switch (modifier) { 10630108Ssam 10730108Ssam case SP: case TB: 10830108Ssam break; 10930108Ssam 11030108Ssam case 't': case 'T': 11130108Ssam printf("%T",fcount); return (fp); 11230108Ssam 11330108Ssam case 'r': case 'R': 11430108Ssam printf("%M",fcount); return (fp); 11530108Ssam 11630108Ssam case 'a': 11730108Ssam psymoff(dot,ptype,":%16t"); dotinc=0; break; 11830108Ssam 11930108Ssam case 'p': 12030108Ssam psymoff(var[0],ptype,"%16t"); break; 12130108Ssam 12230108Ssam case 'u': 12330108Ssam printf("%-8u",w); break; 12430108Ssam 12530108Ssam case 'U': 12630108Ssam printf("%-16U",wx); break; 12730108Ssam 12830108Ssam case 'c': case 'C': 129*30119Ssam if (modifier == 'C') 130*30119Ssam printesc(byte(w)); 13130108Ssam else 132*30119Ssam printc(byte(w)); 13330108Ssam dotinc=1; break; 13430108Ssam 13530108Ssam case 'b': case 'B': 136*30119Ssam printf("%-8o", byte(w)); dotinc=1; break; 13730108Ssam 13830108Ssam case '1': 139*30119Ssam printf("%-8R", byte(w)); dotinc=1; break; 14030108Ssam 14130108Ssam case 'w': case '2': 14230108Ssam printf("%-8R", w); break; 14330108Ssam 14430108Ssam case 'W': case '4': 14530108Ssam printf("%-16R", wx); break; 14630108Ssam 14730108Ssam case 's': case 'S': 14830108Ssam savdot=dot; dotinc=1; 14930108Ssam while ((c=byte(get(dot,itype))) && errflg==0) { 15030108Ssam dot=inkdot(1); 15130108Ssam if (modifier == 'S') 15230108Ssam printesc(c); 15330108Ssam else 15430108Ssam printc(c); 15530108Ssam endline(); 15630108Ssam } 15730108Ssam dotinc=dot-savdot+1; dot=savdot; break; 15830108Ssam 15930108Ssam case 'x': 16030108Ssam printf("%-8x",w); break; 16130108Ssam 16230108Ssam case 'X': 16330108Ssam printf("%-16X", wx); break; 16430108Ssam 16530108Ssam case 'z': 16630108Ssam printf("%-8z",w); break; 16730108Ssam 16830108Ssam case 'Z': 16930108Ssam printf("%-16Z", wx); break; 17030108Ssam 17130108Ssam case 'Y': 17230108Ssam printf("%-24Y", wx); break; 17330108Ssam 17430108Ssam case 'q': 17530108Ssam printf("%-8q", w); break; 17630108Ssam 17730108Ssam case 'Q': 17830108Ssam printf("%-16Q", wx); break; 17930108Ssam 18030108Ssam case 'o': 18130108Ssam printf("%-8o", w); break; 18230108Ssam 18330108Ssam case 'O': 18430108Ssam printf("%-16O", wx); break; 18530108Ssam 18630108Ssam case 'i': case 'I': 18730108Ssam printins(itype,wx); printc(EOR); break; 18830108Ssam 18930108Ssam case 'd': 19030108Ssam printf("%-8d", w); break; 19130108Ssam 19230108Ssam case 'D': 19330108Ssam printf("%-16D", wx); break; 19430108Ssam 19530108Ssam case 'n': case 'N': 19630108Ssam printc('\n'); dotinc=0; break; 19730108Ssam 19830108Ssam case '"': 19930108Ssam dotinc=0; 20030108Ssam while (*fp != '"' && *fp) 20130108Ssam printc(*fp++); 20230108Ssam if (*fp) 20330108Ssam fp++; 20430108Ssam break; 20530108Ssam 20630108Ssam case '^': 20730108Ssam dot=inkdot(-dotinc*fcount); return (fp); 20830108Ssam 20930108Ssam case '+': 21030108Ssam dot=inkdot(fcount); return (fp); 21130108Ssam 21230108Ssam case '-': 21330108Ssam dot=inkdot(-fcount); return (fp); 21430108Ssam 21530108Ssam default: 21630108Ssam error(BADMOD); 21730108Ssam } 21830108Ssam if (itype!=NSP) 21930108Ssam dot=inkdot(dotinc); 22030108Ssam fcount--; endline(); 22130108Ssam } 22230108Ssam return (fp); 22330108Ssam } 22430108Ssam 22530108Ssam static 22630108Ssam printesc(c) 22730108Ssam register c; 22830108Ssam { 22930108Ssam 23030108Ssam c &= STRIP; 23130108Ssam if (c==0177 || c<SP) 23230108Ssam printf("^%c", c ^ 0100); 23330108Ssam else 23430108Ssam printc(c); 23530108Ssam } 23630108Ssam 23730108Ssam long 23830108Ssam inkdot(incr) 23930108Ssam { 24030108Ssam register long newdot; 24130108Ssam 24230108Ssam newdot=dot+incr; 24330108Ssam if ((dot ^ newdot) >> 24) 24430108Ssam error(ADWRAP); 24530108Ssam return (newdot); 24630108Ssam } 247