|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.