1 #ifndef lint 2 static char sccsid[] = "@(#)format.c 4.2 08/11/83"; 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 L_INT maxoff; 19 ADDR sigint; 20 ADDR 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 29 STRING fphack; 30 rdfp() 31 { 32 return(lastc= *fphack++); 33 } 34 35 scanform(icount,ifp,itype,ptype) 36 L_INT icount; 37 STRING ifp; 38 { 39 STRING fp; 40 CHAR modifier; 41 INT fcount, init=1; 42 L_INT savdot; 43 BOOL exact; 44 BOOL doit = 1; 45 46 WHILE icount 47 DO fp=ifp; 48 savdot=dot; init=0; 49 50 IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff 51 THEN printf("\n%s:%16t",cursym->n_un.n_name); 52 FI 53 54 /*now loop over format*/ 55 WHILE *fp ANDF errflg==0 56 DO IF digit(modifier = *fp) 57 THEN fcount = 0; 58 WHILE digit(modifier = *fp++) 59 DO fcount *= 10; 60 fcount += modifier-'0'; 61 OD 62 fp--; 63 ELSE fcount = 1; 64 FI 65 66 IF *fp==0 THEN break; FI 67 IF exact ANDF dot==savdot ANDF itype==ISP ANDF cursym->n_un.n_name[0]=='_' ANDF *fp=='i' 68 THEN exform(1,"x",itype,ptype); fp++; printc(EOR); /* entry mask */ 69 ELSE fp=exform(fcount,fp,itype,ptype); 70 FI 71 OD 72 dotinc=dot-savdot; 73 dot=savdot; 74 75 IF errflg 76 THEN IF icount<0 77 THEN errflg=0; break; 78 ELSE error(errflg); 79 FI 80 FI 81 IF --icount 82 THEN dot=inkdot(dotinc); 83 FI 84 IF mkfault THEN error(0); FI 85 OD 86 } 87 88 STRING 89 exform(fcount,ifp,itype,ptype) 90 INT fcount; 91 STRING ifp; 92 { 93 /* execute single format item `fcount' times 94 * sets `dotinc' and moves `dot' 95 * returns address of next format item 96 */ 97 POS w; 98 L_INT savdot, wx; 99 STRING fp; 100 CHAR c, modifier, longpr; 101 L_REAL fw; 102 struct{ 103 L_INT sa; 104 INT sb,sc; 105 }; 106 107 WHILE fcount>0 108 DO fp = ifp; c = *fp; 109 longpr=(c>='A')&(c<='Z')|(c=='f')|(c=='4')|(c=='p'); 110 IF itype==NSP ORF *fp=='a' 111 THEN wx=dot; w=dot; 112 ELSE w=get(dot,itype); 113 IF longpr 114 THEN wx=itol(get(inkdot(2),itype),w); 115 ELSE wx=w; 116 FI 117 FI 118 IF c=='F' 119 THEN fw.sb=get(inkdot(4),itype); 120 fw.sc=get(inkdot(6),itype); 121 FI 122 IF errflg THEN return(fp); FI 123 IF mkfault THEN error(0); FI 124 var[0]=wx; 125 modifier = *fp++; 126 dotinc=(longpr?4:2);; 127 128 IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI 129 130 switch(modifier) { 131 132 case SP: case TB: 133 break; 134 135 case 't': case 'T': 136 printf("%T",fcount); return(fp); 137 138 case 'r': case 'R': 139 printf("%M",fcount); return(fp); 140 141 case 'a': 142 psymoff(dot,ptype,":%16t"); dotinc=0; break; 143 144 case 'p': 145 psymoff(var[0],ptype,"%16t"); break; 146 147 case 'u': 148 printf("%-8u",w); break; 149 150 case 'U': 151 printf("%-16U",wx); break; 152 153 case 'c': case 'C': 154 IF modifier=='C' 155 THEN printesc(w&LOBYTE); 156 ELSE printc(w&LOBYTE); 157 FI 158 dotinc=1; break; 159 160 case 'b': case 'B': 161 printf("%-8o", w&LOBYTE); dotinc=1; break; 162 163 case '1': 164 printf("%-8r", w&LOBYTE); dotinc=1; break; 165 166 case '2': 167 case 'w': 168 printf("%-8r", w); break; 169 170 case '4': 171 case 'W': 172 printf("%-16R", wx); break; 173 174 case 's': case 'S': 175 savdot=dot; dotinc=1; 176 WHILE (c=get(dot,itype)&LOBYTE) ANDF errflg==0 177 DO dot=inkdot(1); 178 IF modifier == 'S' 179 THEN printesc(c); 180 ELSE printc(c); 181 FI 182 endline(); 183 OD 184 dotinc=dot-savdot+1; dot=savdot; break; 185 186 case 'x': 187 printf("%-8x",w); break; 188 189 case 'X': 190 printf("%-16X", wx); break; 191 192 case 'Y': 193 printf("%-24Y", wx); break; 194 195 case 'q': 196 printf("%-8q", w); break; 197 198 case 'Q': 199 printf("%-16Q", wx); break; 200 201 case 'o': 202 printf("%-8o", w); break; 203 204 case 'O': 205 printf("%-16O", wx); break; 206 207 case 'i': 208 printins(0,itype,w); printc(EOR); break; 209 210 case 'd': 211 printf("%-8d", w); break; 212 213 case 'D': 214 printf("%-16D", wx); break; 215 216 case 'f': 217 fw = 0; 218 fw.sa = wx; 219 printf("%-16.9f", fw); 220 dotinc=4; break; 221 222 case 'F': 223 fw.sa = wx; 224 printf("%-32.18F", fw); 225 dotinc=8; break; 226 227 case 'n': case 'N': 228 printc('\n'); dotinc=0; break; 229 230 case '"': 231 dotinc=0; 232 WHILE *fp != '"' ANDF *fp 233 DO printc(*fp++); OD 234 IF *fp THEN fp++; FI 235 break; 236 237 case '^': 238 dot=inkdot(-dotinc*fcount); return(fp); 239 240 case '+': 241 dot=inkdot(fcount); return(fp); 242 243 case '-': 244 dot=inkdot(-fcount); return(fp); 245 246 default: error(BADMOD); 247 } 248 IF itype!=NSP 249 THEN dot=inkdot(dotinc); 250 FI 251 fcount--; endline(); 252 OD 253 254 return(fp); 255 } 256 257 shell() 258 { 259 #ifndef EDDT 260 INT rc, status, unixpid; 261 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 prints("!"); lp--; 289 FI 290 #endif 291 } 292 293 294 printesc(c) 295 { 296 c &= STRIP; 297 IF c==0177 THEN printf("^?"); 298 ELIF c<SP 299 THEN printf("^%c", c + '@'); 300 ELSE printc(c); 301 FI 302 } 303 304 L_INT inkdot(incr) 305 { 306 L_INT newdot; 307 308 newdot=dot+incr; 309 IF (dot NEQ newdot) >> 24 THEN error(ADWRAP); FI 310 return(newdot); 311 } 312 313 digit(c) 314 { 315 return c >= '0' && c <= '9'; 316 } 317