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