1 #ifndef lint 2 static char sccsid[] = "@(#)format.c 1.2 (Berkeley) 11/20/86"; 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 fw.d = 0; 214 fw.s[0] = w; 215 fw.s[1] = wx&0xffff; 216 printf("%-16.9f", fw.d); 217 dotinc=4; break; 218 219 case 'F': /* may be done with one get call on TAHOE */ 220 fw.s[0] = w; 221 fw.s[1] = wx&0xffff; 222 fw.s[2]=shorten(get(inkdot(4),itype)); 223 fw.s[3]=shorten(get(inkdot(6),itype)); 224 IF errflg THEN return(fp); FI 225 printf("%-32.18F", fw.d); 226 dotinc=8; break; 227 228 case 'n': case 'N': 229 printc('\n'); dotinc=0; break; 230 231 case '"': 232 dotinc=0; 233 WHILE *fp != '"' ANDF *fp 234 DO printc(*fp++); OD 235 IF *fp THEN fp++; FI 236 break; 237 238 case '^': 239 dot=inkdot(-dotinc*fcount); return(fp); 240 241 case '+': 242 dot=inkdot(fcount); return(fp); 243 244 case '-': 245 dot=inkdot(-fcount); return(fp); 246 247 default: error(BADMOD); 248 } 249 IF itype!=NSP 250 THEN dot=inkdot(dotinc); 251 FI 252 fcount--; endline(); 253 OD 254 255 return(fp); 256 } 257 258 shell() 259 { 260 #ifndef EDDT 261 REG rc, unixpid; 262 int status; 263 REG STRING argp = lp; 264 STRING getenv(), shell = getenv("SHELL"); 265 #ifdef VFORK 266 char oldstlp; 267 #endif 268 269 if (shell == 0) 270 shell = "/bin/sh"; 271 WHILE lastc!=EOR DO rdc(); OD 272 #ifndef VFORK 273 IF (unixpid=fork())==0 274 #else 275 oldstlp = *lp; 276 IF (unixpid=vfork())==0 277 #endif 278 THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit); 279 *lp=0; execl(shell, "sh", "-c", argp, 0); 280 _exit(16); 281 #ifndef VFORK 282 ELIF unixpid == -1 283 #else 284 ELIF *lp = oldstlp, unixpid == -1 285 #endif 286 THEN error(NOFORK); 287 ELSE signal(SIGINT,1); 288 WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE 289 signal(SIGINT,sigint); 290 printc('!'); lp--; 291 FI 292 #endif 293 } 294 295 296 printesc(c) 297 REG c; 298 { 299 c &= STRIP; 300 IF c==0177 ORF c<SP 301 THEN printf("^%c", c ^ 0100); 302 ELSE printc(c); 303 FI 304 } 305 306 L_INT inkdot(incr) 307 { 308 REG L_INT newdot; 309 310 newdot=dot+incr; 311 IF (dot ^ newdot) >> 24 THEN error(ADWRAP); FI 312 return(newdot); 313 } 314