|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: #include <a.out.h> ! 10: ! 11: MSG BADMOD; ! 12: MSG ADWRAP; ! 13: ! 14: char lastc, peekc; ! 15: ! 16: scanform(icount,ifp,itype,ptype) ! 17: WORD icount; ! 18: char *ifp; ! 19: { ! 20: register char *fp; ! 21: register char c; ! 22: register int fcount; ! 23: ADDR savdot; ! 24: ! 25: while (icount) { ! 26: fp=ifp; ! 27: savdot=dot; ! 28: /*now loop over format*/ ! 29: while (*fp && errflg==0) { ! 30: if (!isdigit(*fp)) ! 31: fcount = 1; ! 32: else { ! 33: fcount = 0; ! 34: while (isdigit(c = *fp++)) { ! 35: fcount *= 10; ! 36: fcount += c-'0'; ! 37: } ! 38: fp--; ! 39: } ! 40: if (*fp==0) ! 41: break; ! 42: fp=exform(fcount,fp,itype,ptype); ! 43: } ! 44: dotinc=dot-savdot; ! 45: dot=savdot; ! 46: if (errflg) { ! 47: if (icount<0) { ! 48: errflg=0; ! 49: break; ! 50: } ! 51: else ! 52: error(errflg); ! 53: } ! 54: if (--icount) ! 55: dot=inkdot(dotinc); ! 56: if (mkfault) ! 57: error(NULL); ! 58: } ! 59: } ! 60: ! 61: char * ! 62: exform(fcount,ifp,itype,ptype) ! 63: int fcount; ! 64: char *ifp; ! 65: { ! 66: /* execute single format item `fcount' times ! 67: * sets `dotinc' and moves `dot' ! 68: * returns address of next format item ! 69: */ ! 70: register WORD w; ! 71: ADDR savdot; ! 72: register char *fp; ! 73: register char c, modifier; ! 74: union { ! 75: TFLOAT s; ! 76: TDOUBLE d; ! 77: } fl; ! 78: ! 79: while (fcount > 0) { ! 80: fp = ifp; ! 81: c = *fp; ! 82: modifier = *fp++; ! 83: if (charpos()==0 && modifier!='a') ! 84: printf("%16m"); ! 85: switch(modifier) { ! 86: ! 87: case SP: ! 88: case TB: ! 89: break; ! 90: ! 91: case 't': ! 92: case 'T': ! 93: printf("%T", fcount); ! 94: return(fp); ! 95: ! 96: case 'r': ! 97: case 'R': ! 98: printf("%M", fcount); ! 99: return(fp); ! 100: ! 101: case 'a': ! 102: psymoff((WORD)dot, ptype, itype & SYMF ?"?%16t":"/%16t"); ! 103: dotinc = 0; ! 104: break; ! 105: ! 106: case 'p': ! 107: w = atow(aget(dot, itype)); ! 108: if (errflg) ! 109: return (fp); ! 110: if (mkfault) ! 111: return (0); ! 112: psymoff(w, ptype, "%16t"); ! 113: dotinc = sizeof(TADDR); ! 114: break; ! 115: ! 116: case 'u': ! 117: case 'w': ! 118: case 'd': ! 119: case 'x': ! 120: case 'o': ! 121: case 'q': ! 122: w = stow(sget(dot, itype)); ! 123: if (errflg) ! 124: return (fp); ! 125: if (mkfault) ! 126: return (0); ! 127: dotinc = sizeof(TSHORT); ! 128: if (c == 'u') ! 129: printf("%-8U", w); ! 130: else if (c == 'w') ! 131: printf("%-8R", w); ! 132: else if (c == 'd') ! 133: printf("%-8D", w); ! 134: else if (c == 'x') ! 135: printf("%-8X", w); ! 136: else if (c == 'o') ! 137: printf("%-8O", w); ! 138: else if (c == 'q') ! 139: printf("%-8Q", w); ! 140: break; ! 141: ! 142: case 'U': ! 143: case 'W': ! 144: case 'D': ! 145: case 'X': ! 146: case 'O': ! 147: case 'Q': ! 148: w = ltow(lget(dot, itype)); ! 149: if (errflg) ! 150: return (fp); ! 151: if (mkfault) ! 152: return (0); ! 153: dotinc = sizeof(TLONG); ! 154: if (c == 'U') ! 155: printf("%-16U", w); ! 156: else if (c == 'W') ! 157: printf("%-16R", w); ! 158: else if (c == 'D') ! 159: printf("%-16D", w); ! 160: else if (c == 'X') ! 161: printf("%-16X", w); ! 162: else if (c == 'O') ! 163: printf("%-16O", w); ! 164: else if (c == 'Q') ! 165: printf("%-16Q", w); ! 166: break; ! 167: ! 168: case 'b': ! 169: case 'B': ! 170: case 'c': ! 171: case 'C': ! 172: w = ctow(cget(dot, itype)); ! 173: if (errflg) ! 174: return (fp); ! 175: if (mkfault) ! 176: return (0); ! 177: if (modifier == 'C') ! 178: printesc((char)w); ! 179: else if (modifier == 'B' || modifier == 'b') ! 180: printf("%-8O", w); ! 181: else ! 182: printc((char)w); ! 183: dotinc = sizeof(TCHAR); ! 184: break; ! 185: ! 186: case 's': ! 187: case 'S': ! 188: savdot=dot; ! 189: dotinc=sizeof(TCHAR); ! 190: while ((w=ctow(cget(dot,itype))) && errflg==0) { ! 191: dot=inkdot((WORD)sizeof(TCHAR)); ! 192: if (modifier == 'S') ! 193: printesc((char)w); ! 194: else ! 195: printc((char)w); ! 196: endline(); ! 197: } ! 198: dotinc=(dot-savdot+1) * sizeof(TCHAR); ! 199: dot=savdot; ! 200: break; ! 201: ! 202: case 'Y': ! 203: printf("%-24Y", (long)ltow(lget(dot, itype))); ! 204: break; ! 205: ! 206: case 'i': ! 207: printins(itype,lget(dot, itype)); ! 208: printc(EOR); ! 209: break; ! 210: ! 211: case 'f': ! 212: if (fget(dot, itype, (char *)&fl.s, sizeof(TFLOAT)) == 0) ! 213: return (fp); ! 214: if (mkfault) ! 215: return (0); ! 216: dotinc = sizeof(TFLOAT); ! 217: fpout('f', (char *)&fl.s); ! 218: break; ! 219: ! 220: case 'F': ! 221: if (fget(dot, itype, (char *)&fl.d, sizeof(TDOUBLE)) == 0) ! 222: return (fp); ! 223: if (mkfault) ! 224: return (0); ! 225: dotinc = sizeof(TDOUBLE); ! 226: fpout('F', (char *)&fl.d); ! 227: break; ! 228: ! 229: case 'n': ! 230: case 'N': ! 231: printc('\n'); ! 232: dotinc=0; ! 233: break; ! 234: ! 235: case '"': ! 236: dotinc=0; ! 237: while (*fp != '"' && *fp) ! 238: printc(*fp++); ! 239: if (*fp) ! 240: fp++; ! 241: break; ! 242: ! 243: case '^': ! 244: dot=inkdot(-dotinc*fcount); ! 245: return(fp); ! 246: ! 247: case '+': ! 248: dot=inkdot((WORD)fcount); ! 249: return(fp); ! 250: ! 251: case '-': ! 252: dot=inkdot(-(WORD)fcount); ! 253: return(fp); ! 254: ! 255: default: ! 256: error(BADMOD); ! 257: } ! 258: if ((itype & SPTYPE) != NOSP) ! 259: dot=inkdot(dotinc); ! 260: fcount--; ! 261: endline(); ! 262: } ! 263: ! 264: return(fp); ! 265: } ! 266: ! 267: printesc(c) ! 268: { ! 269: c &= STRIP; ! 270: if (c == 0177) ! 271: printf("^?"); ! 272: else if (c < SP) ! 273: printf("^%c", c + '@'); ! 274: else ! 275: printc(c); ! 276: } ! 277: ! 278: ADDR ! 279: inkdot(incr) ! 280: WORD incr; ! 281: { ! 282: ADDR newdot; ! 283: ! 284: newdot=dot+incr; ! 285: if ((incr >= 0 && newdot < dot) ! 286: || (incr < 0 && newdot > dot)) ! 287: error(ADWRAP); ! 288: return(newdot); ! 289: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.