|
|
1.1 ! root 1: /* ! 2: * A debugger. ! 3: * Display. ! 4: */ ! 5: #include <stdio.h> ! 6: #include <ctype.h> ! 7: #include "trace.h" ! 8: ! 9: /* ! 10: * Execute a command string. ! 11: */ ! 12: execute(cp) ! 13: char *cp; ! 14: { ! 15: register INP *ip; ! 16: ! 17: while ((ip=inpp) != NULL) { ! 18: inpp = ip->i_next; ! 19: nfree(ip); ! 20: } ! 21: modsize = sizeof(int); ! 22: sincmod = SNULL; ! 23: dot = getpc(); ! 24: lastc = '\0'; ! 25: addstrp(cp); ! 26: request(); ! 27: testint(); ! 28: } ! 29: ! 30: /* ! 31: * Parse requests and execute them. ! 32: */ ! 33: request() ! 34: { ! 35: register int c; ! 36: register char *cp; ! 37: register unsigned segn; ! 38: register long l; ! 39: register long d; ! 40: VAL val[VALSIZE]; ! 41: ! 42: while ((c=getn()) != EOF) { ! 43: if (c == '!') { ! 44: syscall(); ! 45: continue; ! 46: } ! 47: if (c == '?') { ! 48: if ((c=getn()) != '\n') { ! 49: printe("Syntax error"); ! 50: goto next; ! 51: } ! 52: if (errrstr == NULL) ! 53: printx("No error\n"); ! 54: else ! 55: printx("%s\n", errrstr); ! 56: continue; ! 57: } ! 58: ungetn(c); ! 59: if (explist(val) == 0) ! 60: goto next; ! 61: switch (c=getn()) { ! 62: case ':': ! 63: sincmod = SNULL; ! 64: if (command(val) == 0) ! 65: return; ! 66: continue; ! 67: case '\n': ! 68: if (nvalue(&val[0]) && sincmod!=SNULL) { ! 69: if (excflag == 0) { ! 70: sincmod = SNULL; ! 71: printe("Cannot single step"); ! 72: continue; ! 73: } ! 74: sinmode = sincmod; ! 75: sindecr = rvalue(&val[1], (long)1); ! 76: return; ! 77: } ! 78: case '=': ! 79: ungetn(c); ! 80: case '?': ! 81: sincmod = SNULL; ! 82: segn = vsegno(&val[0], cseg); ! 83: if ((c=getn()) == '=') { ! 84: l = lvalue(&val[0], (long)dot); ! 85: if ((c=getn()) == '\n') { ! 86: putaddnum( l); ! 87: printx("\n"); ! 88: continue; ! 89: } ! 90: ungetn(c); ! 91: if (setdata(segn, l) == 0) ! 92: break; ! 93: continue; ! 94: } ! 95: if (c != '\n') { ! 96: cp = &segform[segn][0]; ! 97: while (c != '\n') { ! 98: *cp++ = c; ! 99: c = getn(); ! 100: } ! 101: *cp++ = '\0'; ! 102: } ! 103: d = dot; ! 104: l = lad; ! 105: dot = lvalue(&val[0], (long)lad); ! 106: dispfmt(segn, segform[segn], ! 107: (int)rvalue(&val[1], (long)1)); ! 108: if (segn != 2) ! 109: cseg = segn; ! 110: else { ! 111: dot = d; ! 112: lad = l; ! 113: } ! 114: continue; ! 115: default: ! 116: sincmod = SNULL; ! 117: printe("Syntax error"); ! 118: break; ! 119: } ! 120: next: ! 121: while ((c=getn()) != '\n') ! 122: ; ! 123: } ! 124: } ! 125: ! 126: /* ! 127: * Change the value of a location. ! 128: */ ! 129: setdata(segn, a) ! 130: long a; ! 131: { ! 132: register char *cp; ! 133: register int n; ! 134: register int c; ! 135: char b[1]; ! 136: char l3[3]; ! 137: int i[1]; ! 138: long l[1]; ! 139: VAL val[VALSIZE]; ! 140: ! 141: if (explist(val) == 0) ! 142: return (0); ! 143: if ((c=getn()) != '\n') ! 144: return (0); ! 145: for (n=0; n<VALSIZE; n++, a+=modsize) { ! 146: if (nvalue(&val[n])) ! 147: continue; ! 148: l[0] = rvalue(&val[n], (long)0); ! 149: switch (modsize) { ! 150: case (sizeof(char)): ! 151: b[0] = l[0]; ! 152: cp = b; ! 153: break; ! 154: case (sizeof(int)): ! 155: i[0] = l[0]; ! 156: cp = i; ! 157: break; ! 158: case (sizeof(l3)): ! 159: ltol3(l3, l, 1); ! 160: cp = l3; ! 161: break; ! 162: case (sizeof(long)): ! 163: cp = l; ! 164: break; ! 165: default: ! 166: printe("Bad change type"); ! 167: return (1); ! 168: } ! 169: add = a; ! 170: if (putb(segn, cp, modsize) == 0) { ! 171: printe("Cannot change value"); ! 172: return (1); ! 173: } ! 174: } ! 175: if (segn == 2) ! 176: setregs(); ! 177: return (1); ! 178: } ! 179: ! 180: /* ! 181: * Send a command to the shell. ! 182: */ ! 183: syscall() ! 184: { ! 185: register int c; ! 186: register char *cp; ! 187: ! 188: cp = miscbuf; ! 189: while ((c=getn()) != '\n') ! 190: *cp++ = c; ! 191: *cp++ = '\0'; ! 192: system(miscbuf); ! 193: testint(); ! 194: printf("!\n"); ! 195: } ! 196: ! 197: /* ! 198: * Print out data according to a format string. `n' is the number ! 199: * of times this is done. ! 200: */ ! 201: ! 202: static int addfmt = 32767; ! 203: ! 204: dispfmt(s, fs, n) ! 205: char *fs; ! 206: { ! 207: register char *sp1; ! 208: register char *sp2; ! 209: register int c; ! 210: register int r; ! 211: register int t1; ! 212: register int t2; ! 213: register char *sp3; ! 214: register char *fp; ! 215: register long nad; ! 216: register long pad; ! 217: register long uad; ! 218: ! 219: r = 1; ! 220: t2 = '\0'; ! 221: add = dot; ! 222: nad = dot; ! 223: pad = dot; ! 224: uad = dot; ! 225: sp1 = miscbuf; ! 226: sp3 = &sp1[DISSIZE]; ! 227: while (n--) { ! 228: fp = fs; ! 229: for (;;) { ! 230: c = *fp++; ! 231: if (isascii(c) && isdigit(c)) { ! 232: r = 0; ! 233: do { ! 234: r = r*10 + c-'0'; ! 235: c = *fp++; ! 236: } while (isascii(c) && isdigit(c)); ! 237: --fp; ! 238: continue; ! 239: } ! 240: switch (c) { ! 241: case '^': ! 242: add = uad; ! 243: continue; ! 244: case '+': ! 245: add += r; ! 246: r = 1; ! 247: continue; ! 248: case '-': ! 249: add -= r; ! 250: r = 1; ! 251: continue; ! 252: case 'n': ! 253: *sp1 = '\0'; ! 254: flushb((long)nad); ! 255: sp1 = miscbuf; ! 256: nad = add; ! 257: continue; ! 258: case 'd': ! 259: case 'o': ! 260: case 'u': ! 261: case 'x': ! 262: t2 = c; ! 263: continue; ! 264: case 'a': ! 265: addfmt = 32767; ! 266: continue; ! 267: case 'A': ! 268: addfmt = -1; ! 269: continue; ! 270: default: ! 271: t1 = c; ! 272: if (t1=='\0' && t2=='\0') ! 273: break; ! 274: if (t1 == '\0') ! 275: t1 = 'w'; ! 276: if (t2 == '\0') ! 277: t2 = DDCHR; ! 278: uad = add; ! 279: while (r--) { ! 280: if (testint()) ! 281: return (1); ! 282: *sp1++ = ' '; ! 283: pad = add; ! 284: sp2 = conform(sp1, s, t1, t2, getb); ! 285: if (sp2 == NULL) { ! 286: *--sp1 = '\0'; ! 287: if (sp1 != miscbuf) ! 288: flushb((long)nad); ! 289: printe("Addressing error"); ! 290: return (0); ! 291: } ! 292: if (sp2 <= sp3) ! 293: sp1 = sp2; ! 294: else { ! 295: *--sp1 = '\0'; ! 296: flushb((long)nad); ! 297: *sp2 = '\0'; ! 298: *sp1 = ' '; ! 299: sp2 = sp1; ! 300: sp1 = miscbuf; ! 301: while (*sp2) ! 302: *sp1++ = *sp2++; ! 303: nad = pad; ! 304: } ! 305: if (c == 'i') { ! 306: *sp1++ = '\0'; ! 307: flushb((long)nad); ! 308: sp1 = miscbuf; ! 309: nad = add; ! 310: } ! 311: } ! 312: r = 1; ! 313: t2 = '\0'; ! 314: if (c != '\0') ! 315: continue; ! 316: } ! 317: break; ! 318: } ! 319: lad = add; ! 320: } ! 321: if (sp1 != miscbuf) { ! 322: *sp1 = '\0'; ! 323: flushb((long)nad); ! 324: } ! 325: return (1); ! 326: } ! 327: ! 328: /* ! 329: * Flush the output buffer. The given address `a' is printed before the ! 330: * contents of the buffer and dot is set to it. ! 331: */ ! 332: flushb(a) ! 333: register long a; ! 334: { ! 335: char buf[40]; ! 336: ! 337: dot = a; ! 338: if( fflag) ! 339: printx( "%lx", a); ! 340: else { ! 341: conaddr( buf, -1, a, addfmt); ! 342: printx( "%s", buf); ! 343: } ! 344: printx("\t%s\n", miscbuf); ! 345: } ! 346: ! 347: /* ! 348: * Given a format character `f' and a function `func', print out ! 349: * data according to the given format. The function `get' is ! 350: * called to read characters. ! 351: */ ! 352: char * ! 353: conform(sp, s, t1, t2, get) ! 354: register char *sp; ! 355: int (*get)(); ! 356: { ! 357: register char *lp; ! 358: unsigned char c[1]; ! 359: unsigned char v[3]; ! 360: unsigned short h[1]; ! 361: char *p[1]; ! 362: int i[1]; ! 363: long l[1]; ! 364: #ifndef NFP ! 365: float f[1]; ! 366: double d[1]; ! 367: #endif ! 368: ! 369: switch (t1) { ! 370: case 'b': ! 371: if ((*get)(s, c, sizeof(c)) == 0) ! 372: return (NULL); ! 373: modsize = sizeof(c); ! 374: ! 375: /* ! 376: * There should be a better way to do this. ! 377: */ ! 378: if (t2 != 'd') ! 379: i[0] = c[0]; ! 380: else { ! 381: char x[1]; ! 382: ! 383: x[0] = c[0]; ! 384: i[0] = x[0]; ! 385: } ! 386: sprintf(sp, getform(t1, t2), i[0]); ! 387: break; ! 388: case 'c': ! 389: if ((*get)(s, c, sizeof(c)) == 0) ! 390: return (NULL); ! 391: modsize = sizeof(c); ! 392: sp = conescs(sp, c[0]); ! 393: return (sp); ! 394: case 'C': ! 395: if ((*get)(s, c, sizeof(c)) == 0) ! 396: return (NULL); ! 397: modsize = sizeof(c); ! 398: *sp++ = (c[0]>=040&&c[0]<0177) ? c[0] : '.'; ! 399: return (sp); ! 400: #ifndef NFP ! 401: case 'f': ! 402: if ((*get)(s, (char *)f, sizeof(f)) == 0) ! 403: return (NULL); ! 404: modsize = sizeof(f); ! 405: sprintf(sp, getform(t1, t2), f[0]); ! 406: break; ! 407: case 'F': ! 408: if ((*get)(s, (char *)d, sizeof(d)) == 0) ! 409: return (NULL); ! 410: modsize = sizeof(d); ! 411: sprintf(sp, getform(t1, t2), d[0]); ! 412: break; ! 413: #endif ! 414: case 'h': ! 415: if ((*get)(s, h, sizeof(h)) == 0) ! 416: return (NULL); ! 417: modsize = sizeof(h); ! 418: ! 419: /* ! 420: * Oh well. ! 421: */ ! 422: if (t2 != 'd') ! 423: i[0] = h[0]; ! 424: else { ! 425: short x[1]; ! 426: ! 427: x[0] = h[0]; ! 428: i[0] = x[0]; ! 429: } ! 430: sprintf(sp, getform(t1, t2), i[0]); ! 431: break; ! 432: case 'i': ! 433: sp = coninst(sp, s); ! 434: modsize = INLEN; ! 435: return (sp); ! 436: case 'l': ! 437: if ((*get)(s, (char *)l, sizeof(l)) == 0) ! 438: return (NULL); ! 439: modsize = sizeof(l); ! 440: sprintf(sp, getform(t1, t2), l[0]); ! 441: break; ! 442: case 'p': ! 443: if ((*get)(s, (char *)p, sizeof(p)) == 0) ! 444: return (NULL); ! 445: modsize = sizeof(p); ! 446: sp = conaddr(sp, -1, (long)p[0], I); ! 447: return (sp); ! 448: case 's': ! 449: case 'S': ! 450: lp = &sp[DISSIZE]; ! 451: c[0] = '\0'; ! 452: for (;;) { ! 453: if ((*get)(s, c, sizeof(c)) == 0) ! 454: return (NULL); ! 455: if (c[0] == '\0') ! 456: break; ! 457: if (t1 == 's') ! 458: sp = conescs(sp, c[0]); ! 459: else ! 460: *sp++ = c[0]; ! 461: if (sp > lp) ! 462: return (NULL); ! 463: } ! 464: modsize = sizeof(i); ! 465: return (sp); ! 466: case 'v': ! 467: if ((*get)(s, (char *)v, sizeof(v)) == 0) ! 468: return (NULL); ! 469: modsize = sizeof(v); ! 470: l3tol(l, v, 1); ! 471: sprintf(sp, getform(t1, t2), l[0]); ! 472: break; ! 473: case 'w': ! 474: if ((*get)(s, (char *)i, sizeof(i)) == 0) ! 475: return (NULL); ! 476: modsize = sizeof(i); ! 477: sprintf(sp, getform(t1, t2), i[0]); ! 478: break; ! 479: case 'Y': ! 480: sp = gettime(sp, cseg, get); ! 481: modsize = sizeof(i); ! 482: return (sp); ! 483: default: ! 484: return (NULL); ! 485: } ! 486: while (*sp) ! 487: sp++; ! 488: return (sp); ! 489: } ! 490: ! 491: /* ! 492: * If the given character is unprintable, convert it into ! 493: * an escape sequence. ! 494: */ ! 495: char * ! 496: conescs(sp, c) ! 497: register char *sp; ! 498: register int c; ! 499: { ! 500: *sp++ = '\\'; ! 501: switch (c) { ! 502: case '\0': ! 503: *sp++ = '0'; ! 504: break; ! 505: case '\b': ! 506: *sp++ = 'b'; ! 507: break; ! 508: case '\n': ! 509: *sp++ = 'n'; ! 510: break; ! 511: case '\f': ! 512: *sp++ = 'f'; ! 513: break; ! 514: case '\r': ! 515: *sp++ = 'r'; ! 516: break; ! 517: case '\\': ! 518: *sp++ = '\\'; ! 519: break; ! 520: default: ! 521: if (c<040 || c>=0177) { ! 522: sprintf(sp, "%03o", c); ! 523: while (*sp) ! 524: sp++; ! 525: break; ! 526: } ! 527: sp[-1] = c; ! 528: } ! 529: return (sp); ! 530: } ! 531: ! 532: /* ! 533: * Get the current time. ! 534: */ ! 535: char * ! 536: gettime(sp, s, get) ! 537: register char *sp; ! 538: int (*get)(); ! 539: { ! 540: long l; ! 541: register int n; ! 542: register char *cp; ! 543: ! 544: if ((*get)(s, (char *) &l, sizeof(l)) == 0) ! 545: return (NULL); ! 546: cp = ctime(&l); ! 547: n = 24; ! 548: do { ! 549: *sp++ = *cp++; ! 550: } while (--n); ! 551: return (sp); ! 552: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.