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