1*30296Ssam /* 2*30296Ssam * Copyright (c) 1986 Regents of the University of California. 3*30296Ssam * All rights reserved. The Berkeley software License Agreement 4*30296Ssam * specifies the terms and conditions for redistribution. 5*30296Ssam * 6*30296Ssam * @(#)kdb_format.c 7.4 (Berkeley) 12/15/86 7*30296Ssam */ 830108Ssam 930108Ssam #include "../kdb/defs.h" 1030108Ssam 1130108Ssam char *BADMOD; 1230108Ssam char *ADWRAP; 1330108Ssam 1430108Ssam char *lp; 1530108Ssam char lastc,peekc; 1630108Ssam long expv; 1730108Ssam 1830108Ssam scanform(icount,ifp,itype,ptype) 1930108Ssam long icount; 2030108Ssam char *ifp; 2130108Ssam { 2230108Ssam register char *fp; 2330108Ssam char modifier; 2430108Ssam register fcount, init=1; 2530108Ssam long savdot; 2630108Ssam int exact; 2730108Ssam 2830108Ssam while (icount) { 2930108Ssam fp=ifp; 3030108Ssam savdot=dot; init=0; 3130108Ssam if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff) 3230108Ssam printf("\n%s:%16t",cursym->n_un.n_name); 3330108Ssam /*now loop over format*/ 3430108Ssam while (*fp && errflg==0) { 3530108Ssam if (isdigit(modifier = *fp)) { 3630108Ssam fcount = 0; 3730108Ssam while (isdigit(modifier = *fp++)) { 3830108Ssam fcount *= 10; 3930108Ssam fcount += modifier-'0'; 4030108Ssam } 4130108Ssam fp--; 4230108Ssam } else 4330108Ssam fcount = 1; 4430108Ssam if (*fp==0) 4530108Ssam break; 4630136Ssam #ifdef ENTRYMASK 4730108Ssam /* check for entry mask */ 4830108Ssam if (exact && dot==savdot && 4930108Ssam (cursym->n_type&N_TYPE)==N_TEXT && 5030108Ssam cursym->n_un.n_name[0]=='_' && *fp=='i') { 51*30296Ssam (void) exform(1,"x",itype,ptype); 5230108Ssam fp++; 5330108Ssam printc(EOR); 5430108Ssam } else 5530136Ssam #endif 56*30296Ssam fp = exform(fcount,fp,itype,ptype); 5730108Ssam } 5830108Ssam dotinc=dot-savdot; 5930108Ssam dot=savdot; 6030108Ssam 6130108Ssam if (errflg) { 6230108Ssam if (icount<0) { 6330108Ssam errflg=0; 6430108Ssam break; 6530108Ssam } 6630108Ssam error(errflg); 6730108Ssam } 6830108Ssam if (--icount) 6930108Ssam dot=inkdot(dotinc); 7030108Ssam if (mkfault) 71*30296Ssam error((char *)0); 7230108Ssam } 7330108Ssam } 7430108Ssam 7530108Ssam /* 7630108Ssam * Execute single format item `fcount' times 7730108Ssam * sets `dotinc' and moves `dot' 7830108Ssam * returns address of next format item 7930108Ssam */ 8030108Ssam char * 8130108Ssam exform(fcount,ifp,itype,ptype) 8230108Ssam int fcount; 8330108Ssam char *ifp; 8430108Ssam { 8530108Ssam register POS w; 8630108Ssam register long savdot, wx; 8730108Ssam register char *fp; 8830108Ssam char c, modifier, longpr; 8930108Ssam 9030108Ssam while (fcount>0) { 9130108Ssam fp = ifp; c = *fp; 9230119Ssam longpr = (isupper(c) || c=='f' || c=='4' || c=='p'); 9330119Ssam if (itype != NSP && *fp != 'a') { 9430119Ssam wx = get(dot, itype); 9530119Ssam w = shorten(wx); 9630108Ssam } else { 9730119Ssam wx = w = dot; 9830119Ssam if (itype == NSP && 9930119Ssam (c == 'b' || c == 'B' || 10030119Ssam c == 'c' || c == 'C' || c == '1')) 10130119Ssam w = btol(wx); 10230108Ssam } 10330108Ssam if (errflg) 10430108Ssam return (fp); 10530108Ssam if (mkfault) 106*30296Ssam error((char *)0); 10730119Ssam var[0] = wx; 10830108Ssam modifier = *fp++; 10930119Ssam dotinc = (longpr ? sizeof (long):sizeof (short)); 11030108Ssam 11130108Ssam if (charpos()==0 && modifier!='a') 11230108Ssam printf("%16m"); 11330108Ssam switch (modifier) { 11430108Ssam 11530108Ssam case SP: case TB: 11630108Ssam break; 11730108Ssam 11830108Ssam case 't': case 'T': 11930108Ssam printf("%T",fcount); return (fp); 12030108Ssam 12130108Ssam case 'r': case 'R': 12230108Ssam printf("%M",fcount); return (fp); 12330108Ssam 12430108Ssam case 'a': 12530108Ssam psymoff(dot,ptype,":%16t"); dotinc=0; break; 12630108Ssam 12730108Ssam case 'p': 12830108Ssam psymoff(var[0],ptype,"%16t"); break; 12930108Ssam 13030108Ssam case 'u': 13130108Ssam printf("%-8u",w); break; 13230108Ssam 13330108Ssam case 'U': 13430108Ssam printf("%-16U",wx); break; 13530108Ssam 13630108Ssam case 'c': case 'C': 13730119Ssam if (modifier == 'C') 138*30296Ssam printesc((int)byte(w)); 13930108Ssam else 140*30296Ssam printc((char)byte(w)); 14130108Ssam dotinc=1; break; 14230108Ssam 14330108Ssam case 'b': case 'B': 14430119Ssam printf("%-8o", byte(w)); dotinc=1; break; 14530108Ssam 14630108Ssam case '1': 14730119Ssam printf("%-8R", byte(w)); dotinc=1; break; 14830108Ssam 14930108Ssam case 'w': case '2': 15030108Ssam printf("%-8R", w); break; 15130108Ssam 15230108Ssam case 'W': case '4': 15330108Ssam printf("%-16R", wx); break; 15430108Ssam 15530108Ssam case 's': case 'S': 15630108Ssam savdot=dot; dotinc=1; 15730108Ssam while ((c=byte(get(dot,itype))) && errflg==0) { 15830108Ssam dot=inkdot(1); 15930108Ssam if (modifier == 'S') 160*30296Ssam printesc((int)c); 16130108Ssam else 16230108Ssam printc(c); 16330108Ssam endline(); 16430108Ssam } 16530108Ssam dotinc=dot-savdot+1; dot=savdot; break; 16630108Ssam 16730108Ssam case 'x': 16830108Ssam printf("%-8x",w); break; 16930108Ssam 17030108Ssam case 'X': 17130108Ssam printf("%-16X", wx); break; 17230108Ssam 17330108Ssam case 'z': 17430108Ssam printf("%-8z",w); break; 17530108Ssam 17630108Ssam case 'Z': 17730108Ssam printf("%-16Z", wx); break; 17830108Ssam 17930108Ssam case 'Y': 18030108Ssam printf("%-24Y", wx); break; 18130108Ssam 18230108Ssam case 'q': 18330108Ssam printf("%-8q", w); break; 18430108Ssam 18530108Ssam case 'Q': 18630108Ssam printf("%-16Q", wx); break; 18730108Ssam 18830108Ssam case 'o': 18930108Ssam printf("%-8o", w); break; 19030108Ssam 19130108Ssam case 'O': 19230108Ssam printf("%-16O", wx); break; 19330108Ssam 19430108Ssam case 'i': case 'I': 19530108Ssam printins(itype,wx); printc(EOR); break; 19630108Ssam 19730108Ssam case 'd': 19830108Ssam printf("%-8d", w); break; 19930108Ssam 20030108Ssam case 'D': 20130108Ssam printf("%-16D", wx); break; 20230108Ssam 20330108Ssam case 'n': case 'N': 20430108Ssam printc('\n'); dotinc=0; break; 20530108Ssam 20630108Ssam case '"': 20730108Ssam dotinc=0; 20830108Ssam while (*fp != '"' && *fp) 20930108Ssam printc(*fp++); 21030108Ssam if (*fp) 21130108Ssam fp++; 21230108Ssam break; 21330108Ssam 21430108Ssam case '^': 21530108Ssam dot=inkdot(-dotinc*fcount); return (fp); 21630108Ssam 21730108Ssam case '+': 21830108Ssam dot=inkdot(fcount); return (fp); 21930108Ssam 22030108Ssam case '-': 22130108Ssam dot=inkdot(-fcount); return (fp); 22230108Ssam 22330108Ssam default: 22430108Ssam error(BADMOD); 22530108Ssam } 22630108Ssam if (itype!=NSP) 22730108Ssam dot=inkdot(dotinc); 22830108Ssam fcount--; endline(); 22930108Ssam } 23030108Ssam return (fp); 23130108Ssam } 23230108Ssam 23330108Ssam static 23430108Ssam printesc(c) 235*30296Ssam register int c; 23630108Ssam { 23730108Ssam 23830108Ssam c &= STRIP; 23930108Ssam if (c==0177 || c<SP) 24030108Ssam printf("^%c", c ^ 0100); 24130108Ssam else 24230108Ssam printc(c); 24330108Ssam } 24430108Ssam 24530108Ssam long 24630108Ssam inkdot(incr) 24730108Ssam { 24830108Ssam register long newdot; 24930108Ssam 25030108Ssam newdot=dot+incr; 25130136Ssam if (addrwrap(dot, newdot)) 25230108Ssam error(ADWRAP); 25330108Ssam return (newdot); 25430108Ssam } 255