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