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