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