1*26418Ssam #ifndef lint 2*26418Ssam static char sccsid[] = "@(#)format.c 1.1 (Berkeley) 02/25/86"; 3*26418Ssam #endif 4*26418Ssam /* 5*26418Ssam * 6*26418Ssam * UNIX debugger 7*26418Ssam * 8*26418Ssam */ 9*26418Ssam 10*26418Ssam #include "defs.h" 11*26418Ssam 12*26418Ssam MSG BADMOD; 13*26418Ssam MSG NOFORK; 14*26418Ssam MSG ADWRAP; 15*26418Ssam 16*26418Ssam INT mkfault; 17*26418Ssam CHAR *lp; 18*26418Ssam ADDR maxoff; 19*26418Ssam SIG sigint; 20*26418Ssam SIG sigqit; 21*26418Ssam STRING errflg; 22*26418Ssam CHAR lastc,peekc; 23*26418Ssam L_INT dot; 24*26418Ssam INT dotinc; 25*26418Ssam L_INT expv; 26*26418Ssam L_INT var[]; 27*26418Ssam 28*26418Ssam scanform(icount,ifp,itype,ptype) 29*26418Ssam L_INT icount; 30*26418Ssam STRING ifp; 31*26418Ssam { 32*26418Ssam REG STRING fp; 33*26418Ssam CHAR modifier; 34*26418Ssam REG fcount, init=1; 35*26418Ssam L_INT savdot; 36*26418Ssam BOOL exact; 37*26418Ssam 38*26418Ssam WHILE icount 39*26418Ssam DO fp=ifp; 40*26418Ssam savdot=dot; init=0; 41*26418Ssam 42*26418Ssam IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff 43*26418Ssam THEN printf("\n%s:%16t",cursym->n_un.n_name); 44*26418Ssam FI 45*26418Ssam 46*26418Ssam /*now loop over format*/ 47*26418Ssam WHILE *fp ANDF errflg==0 48*26418Ssam DO IF isdigit(modifier = *fp) 49*26418Ssam THEN fcount = 0; 50*26418Ssam WHILE isdigit(modifier = *fp++) 51*26418Ssam DO fcount *= 10; 52*26418Ssam fcount += modifier-'0'; 53*26418Ssam OD 54*26418Ssam fp--; 55*26418Ssam ELSE fcount = 1; 56*26418Ssam FI 57*26418Ssam 58*26418Ssam IF *fp==0 THEN break; FI 59*26418Ssam /* check for entry mask */ 60*26418Ssam IF exact ANDF dot==savdot ANDF 61*26418Ssam (cursym->n_type&N_TYPE)==N_TEXT ANDF 62*26418Ssam cursym->n_un.n_name[0]=='_' ANDF *fp=='i' 63*26418Ssam THEN exform(1,"x",itype,ptype); fp++; printc(EOR); 64*26418Ssam ELSE fp=exform(fcount,fp,itype,ptype); 65*26418Ssam FI 66*26418Ssam OD 67*26418Ssam dotinc=dot-savdot; 68*26418Ssam dot=savdot; 69*26418Ssam 70*26418Ssam IF errflg 71*26418Ssam THEN IF icount<0 72*26418Ssam THEN errflg=0; break; 73*26418Ssam ELSE error(errflg); 74*26418Ssam FI 75*26418Ssam FI 76*26418Ssam IF --icount 77*26418Ssam THEN dot=inkdot(dotinc); 78*26418Ssam FI 79*26418Ssam IF mkfault THEN error(0); FI 80*26418Ssam OD 81*26418Ssam } 82*26418Ssam 83*26418Ssam STRING 84*26418Ssam exform(fcount,ifp,itype,ptype) 85*26418Ssam INT fcount; 86*26418Ssam STRING ifp; 87*26418Ssam { 88*26418Ssam /* execute single format item `fcount' times 89*26418Ssam * sets `dotinc' and moves `dot' 90*26418Ssam * returns address of next format item 91*26418Ssam */ 92*26418Ssam REG POS w; 93*26418Ssam REG L_INT savdot, wx; 94*26418Ssam REG STRING fp; 95*26418Ssam CHAR c, modifier, longpr; 96*26418Ssam union{ /* compatible with both VAX and TAHOE */ 97*26418Ssam L_REAL d; 98*26418Ssam INT s[4]; 99*26418Ssam }fw; 100*26418Ssam 101*26418Ssam WHILE fcount>0 102*26418Ssam DO fp = ifp; c = *fp; 103*26418Ssam longpr=(c>='A')&&(c<='Z')||(c=='f')||(c=='4')||(c=='p'); 104*26418Ssam IF itype==NSP ORF *fp=='a' 105*26418Ssam THEN wx=dot; w=dot; 106*26418Ssam ELSE wx=get(dot,itype); 107*26418Ssam w=shorten(wx); 108*26418Ssam FI 109*26418Ssam IF errflg THEN return(fp); FI 110*26418Ssam IF mkfault THEN error(0); FI 111*26418Ssam var[0]=wx; 112*26418Ssam modifier = *fp++; 113*26418Ssam dotinc=(longpr?4:2); 114*26418Ssam 115*26418Ssam IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI 116*26418Ssam 117*26418Ssam switch(modifier) { 118*26418Ssam 119*26418Ssam case SP: case TB: 120*26418Ssam break; 121*26418Ssam 122*26418Ssam case 't': case 'T': 123*26418Ssam printf("%T",fcount); return(fp); 124*26418Ssam 125*26418Ssam case 'r': case 'R': 126*26418Ssam printf("%M",fcount); return(fp); 127*26418Ssam 128*26418Ssam case 'a': 129*26418Ssam psymoff(dot,ptype,":%16t"); dotinc=0; break; 130*26418Ssam 131*26418Ssam case 'p': 132*26418Ssam psymoff(var[0],ptype,"%16t"); break; 133*26418Ssam 134*26418Ssam case 'u': 135*26418Ssam printf("%-8u",w); break; 136*26418Ssam 137*26418Ssam case 'U': 138*26418Ssam printf("%-16U",wx); break; 139*26418Ssam 140*26418Ssam case 'c': case 'C': 141*26418Ssam IF modifier=='C' 142*26418Ssam THEN printesc(byte(wx)); 143*26418Ssam ELSE printc(byte(wx)); 144*26418Ssam FI 145*26418Ssam dotinc=1; break; 146*26418Ssam 147*26418Ssam case 'b': case 'B': 148*26418Ssam printf("%-8o", byte(wx)); dotinc=1; break; 149*26418Ssam 150*26418Ssam case '1': 151*26418Ssam printf("%-8R", byte(wx)); dotinc=1; break; 152*26418Ssam 153*26418Ssam case '2': 154*26418Ssam case 'w': 155*26418Ssam printf("%-8R", w); break; 156*26418Ssam 157*26418Ssam case '4': 158*26418Ssam case 'W': 159*26418Ssam printf("%-16R", wx); break; 160*26418Ssam 161*26418Ssam case 's': case 'S': 162*26418Ssam savdot=dot; dotinc=1; 163*26418Ssam WHILE (c=byte(get(dot,itype))) ANDF errflg==0 164*26418Ssam DO dot=inkdot(1); 165*26418Ssam IF modifier == 'S' 166*26418Ssam THEN printesc(c); 167*26418Ssam ELSE printc(c); 168*26418Ssam FI 169*26418Ssam endline(); 170*26418Ssam OD 171*26418Ssam dotinc=dot-savdot+1; dot=savdot; break; 172*26418Ssam 173*26418Ssam case 'x': 174*26418Ssam printf("%-8x",w); break; 175*26418Ssam 176*26418Ssam case 'X': 177*26418Ssam printf("%-16X", wx); break; 178*26418Ssam 179*26418Ssam case 'z': 180*26418Ssam printf("%-8z",w); break; 181*26418Ssam 182*26418Ssam case 'Z': 183*26418Ssam printf("%-16Z", wx); break; 184*26418Ssam 185*26418Ssam case 'Y': 186*26418Ssam printf("%-24Y", wx); break; 187*26418Ssam 188*26418Ssam case 'q': 189*26418Ssam printf("%-8q", w); break; 190*26418Ssam 191*26418Ssam case 'Q': 192*26418Ssam printf("%-16Q", wx); break; 193*26418Ssam 194*26418Ssam case 'o': 195*26418Ssam printf("%-8o", w); break; 196*26418Ssam 197*26418Ssam case 'O': 198*26418Ssam printf("%-16O", wx); break; 199*26418Ssam 200*26418Ssam case 'i': 201*26418Ssam case 'I': 202*26418Ssam printins(itype,wx); printc(EOR); break; 203*26418Ssam 204*26418Ssam case 'd': 205*26418Ssam printf("%-8d", w); break; 206*26418Ssam 207*26418Ssam case 'D': 208*26418Ssam printf("%-16D", wx); break; 209*26418Ssam 210*26418Ssam case 'f': 211*26418Ssam fw.d = 0; 212*26418Ssam fw.s[0] = w; 213*26418Ssam fw.s[1] = wx&0xffff; 214*26418Ssam printf("%-16.9f", fw.d); 215*26418Ssam dotinc=4; break; 216*26418Ssam 217*26418Ssam case 'F': /* may be done with one get call on TAHOE */ 218*26418Ssam fw.s[0] = w; 219*26418Ssam fw.s[1] = wx&0xffff; 220*26418Ssam fw.s[2]=shorten(get(inkdot(4),itype)); 221*26418Ssam fw.s[3]=shorten(get(inkdot(6),itype)); 222*26418Ssam IF errflg THEN return(fp); FI 223*26418Ssam printf("%-32.18F", fw.d); 224*26418Ssam dotinc=8; break; 225*26418Ssam 226*26418Ssam case 'n': case 'N': 227*26418Ssam printc('\n'); dotinc=0; break; 228*26418Ssam 229*26418Ssam case '"': 230*26418Ssam dotinc=0; 231*26418Ssam WHILE *fp != '"' ANDF *fp 232*26418Ssam DO printc(*fp++); OD 233*26418Ssam IF *fp THEN fp++; FI 234*26418Ssam break; 235*26418Ssam 236*26418Ssam case '^': 237*26418Ssam dot=inkdot(-dotinc*fcount); return(fp); 238*26418Ssam 239*26418Ssam case '+': 240*26418Ssam dot=inkdot(fcount); return(fp); 241*26418Ssam 242*26418Ssam case '-': 243*26418Ssam dot=inkdot(-fcount); return(fp); 244*26418Ssam 245*26418Ssam default: error(BADMOD); 246*26418Ssam } 247*26418Ssam IF itype!=NSP 248*26418Ssam THEN dot=inkdot(dotinc); 249*26418Ssam FI 250*26418Ssam fcount--; endline(); 251*26418Ssam OD 252*26418Ssam 253*26418Ssam return(fp); 254*26418Ssam } 255*26418Ssam 256*26418Ssam shell() 257*26418Ssam { 258*26418Ssam #ifndef EDDT 259*26418Ssam REG rc, unixpid; 260*26418Ssam int status; 261*26418Ssam REG STRING argp = lp; 262*26418Ssam STRING getenv(), shell = getenv("SHELL"); 263*26418Ssam #ifdef VFORK 264*26418Ssam char oldstlp; 265*26418Ssam #endif 266*26418Ssam 267*26418Ssam if (shell == 0) 268*26418Ssam shell = "/bin/sh"; 269*26418Ssam WHILE lastc!=EOR DO rdc(); OD 270*26418Ssam #ifndef VFORK 271*26418Ssam IF (unixpid=fork())==0 272*26418Ssam #else 273*26418Ssam oldstlp = *lp; 274*26418Ssam IF (unixpid=vfork())==0 275*26418Ssam #endif 276*26418Ssam THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit); 277*26418Ssam *lp=0; execl(shell, "sh", "-c", argp, 0); 278*26418Ssam _exit(16); 279*26418Ssam #ifndef VFORK 280*26418Ssam ELIF unixpid == -1 281*26418Ssam #else 282*26418Ssam ELIF *lp = oldstlp, unixpid == -1 283*26418Ssam #endif 284*26418Ssam THEN error(NOFORK); 285*26418Ssam ELSE signal(SIGINT,1); 286*26418Ssam WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE 287*26418Ssam signal(SIGINT,sigint); 288*26418Ssam printc('!'); lp--; 289*26418Ssam FI 290*26418Ssam #endif 291*26418Ssam } 292*26418Ssam 293*26418Ssam 294*26418Ssam printesc(c) 295*26418Ssam REG c; 296*26418Ssam { 297*26418Ssam c &= STRIP; 298*26418Ssam IF c==0177 ORF c<SP 299*26418Ssam THEN printf("^%c", c ^ 0100); 300*26418Ssam ELSE printc(c); 301*26418Ssam FI 302*26418Ssam } 303*26418Ssam 304*26418Ssam L_INT inkdot(incr) 305*26418Ssam { 306*26418Ssam REG L_INT newdot; 307*26418Ssam 308*26418Ssam newdot=dot+incr; 309*26418Ssam IF (dot ^ newdot) >> 24 THEN error(ADWRAP); FI 310*26418Ssam return(newdot); 311*26418Ssam } 312