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