|
|
1.1 ! root 1: static char sccsid[] = "@(#)docomm.c 4.1 10/9/80"; ! 2: #include <signal.h> ! 3: #include "head.h" ! 4: #include <a.out.h> ! 5: #include <stab.h> ! 6: ! 7: struct user u; ! 8: L_INT cntval; ! 9: INT signo; ! 10: INT adrflg; ! 11: INT pid; ! 12: ADDR userpc; ! 13: char *s; ! 14: enum {NOCOM, PRCOM, DSCOM, DSICOM} lastcom; ! 15: /* last command: nothing noteworthy, print source, ! 16: display variable, display instruction */ ! 17: ! 18: docommand() { ! 19: register char *p; ! 20: register int i; ! 21: register ADDR addr, bkaddr; ! 22: struct proct *procp; ! 23: char s[4]; ! 24: ! 25: cntval = 1; ! 26: adrflg = 0; ! 27: errflg = 0; ! 28: ! 29: if (scallf) { ! 30: doscall(); ! 31: setcur(1); ! 32: lastcom = NOCOM; ! 33: return; ! 34: } ! 35: ! 36: if (reflag) { /* search for regular expression */ ! 37: dore(); ! 38: lastcom = PRCOM; ! 39: return; ! 40: } ! 41: ! 42: if (cmd == '\0') { ! 43: if (integ != 0 && var[0] != '\0') { ! 44: error("Invalid command (1)"); ! 45: return; ! 46: } ! 47: if (integ != 0) { /* print line number */ ! 48: ffind(integ); ! 49: fprint(); ! 50: lastcom = PRCOM; ! 51: return; ! 52: } ! 53: if (var[0] != 0) { ! 54: printf("Unexpected null command\n"); ! 55: return; ! 56: } ! 57: } ! 58: ! 59: switch (cmd) { ! 60: ! 61: case 'Y': ! 62: debug = !debug; ! 63: break; ! 64: ! 65: case 'V': ! 66: version(); ! 67: break; ! 68: ! 69: case 'M': ! 70: if (args[0]) { ! 71: setmap(args); ! 72: } else { ! 73: printmap("? map", &txtmap); ! 74: printmap("/ map", &datmap); ! 75: } ! 76: break; ! 77: ! 78: case 'x': ! 79: printregs(); ! 80: break; ! 81: ! 82: case 'X': ! 83: printpc(); ! 84: break; ! 85: ! 86: case 'a': ! 87: if (integ) { ! 88: cpstr(args, "l\n"); ! 89: } else if (proc[0]) { ! 90: cpall(args, "T\n"); ! 91: } else { ! 92: error("Bad arguments"); ! 93: break; ! 94: } ! 95: goto setbrk; ! 96: break; ! 97: ! 98: case 'l': ! 99: setcur(1); ! 100: lastcom = NOCOM; ! 101: break; ! 102: ! 103: case 'T': ! 104: prfrx(1); ! 105: lastcom = NOCOM; ! 106: break; ! 107: ! 108: case 't': ! 109: prframe(); ! 110: lastcom = NOCOM; ! 111: break; ! 112: ! 113: case 'e': ! 114: p = args; ! 115: if (*p == '\0') { ! 116: #ifndef FLEXNAMES ! 117: printf("%.16s() in \"%s\"\n", ! 118: curproc()->pname, curfile); ! 119: #else ! 120: printf("%s() in \"%s\"\n", ! 121: curproc()->pname, curfile); ! 122: #endif ! 123: break; ! 124: } ! 125: ! 126: while (*p != '\0') ! 127: if (*p++ == '.') goto l1; ! 128: /* argument is procedure name */ ! 129: procp = findproc(args); ! 130: if ((procp->pname[0] != '\0') && (procp->sfptr != badfile)) { ! 131: finit(adrtofilep(procp->paddr)->sfilename); ! 132: ffind(procp->lineno); ! 133: } ! 134: else printf("Can't find %s\n", args); ! 135: #ifndef FLEXNAMES ! 136: printf("%.16s() in \"%s\"\n", curproc()->pname, curfile); ! 137: #else ! 138: printf("%s() in \"%s\"\n", curproc()->pname, curfile); ! 139: #endif ! 140: lastcom = PRCOM; ! 141: break; ! 142: ! 143: l1: /* argument is filename */ ! 144: finit(args); ! 145: printf("\"%s\"\n", curfile); ! 146: lastcom = PRCOM; ! 147: break; ! 148: ! 149: case 'p': ! 150: if (integ) ffind(integ); ! 151: fprint(); ! 152: lastcom = PRCOM; ! 153: break; ! 154: ! 155: case 'q': ! 156: exit(0); ! 157: ! 158: case 'w': ! 159: if (integ) ffind(integ); ! 160: i = fline; ! 161: fback(WINDOW/2); ! 162: fprintn(WINDOW); ! 163: ffind(i); ! 164: lastcom = PRCOM; ! 165: break; ! 166: ! 167: case 'Q': ! 168: prdebug(); ! 169: break; ! 170: ! 171: case 'z': ! 172: if (integ) ffind(integ); ! 173: fprintn(WINDOW); ! 174: lastcom = PRCOM; ! 175: break; ! 176: ! 177: case '-': ! 178: fback(integ ? integ : 1); ! 179: fpargs(); ! 180: lastcom = PRCOM; ! 181: break; ! 182: ! 183: case '+': ! 184: fforward(integ ? integ : 1); ! 185: fpargs(); ! 186: lastcom = PRCOM; ! 187: break; ! 188: ! 189: case '\n': ! 190: switch (lastcom) { ! 191: case PRCOM: ! 192: fforward(1); ! 193: fprint(); ! 194: break; ! 195: case DSCOM: ! 196: oaddr += oincr ? oincr : typetosize(otype, WORDSIZE); ! 197: printf("0x%x/ ", oaddr); ! 198: dispf((ADDR) oaddr, odesc, ! 199: oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); ! 200: break; ! 201: case DSICOM: ! 202: dot += oincr; ! 203: prisploc(); ! 204: dispi(dot, odesc, N_GSYM, 0, 0); ! 205: break; ! 206: } ! 207: break; ! 208: ! 209: case '\004': ! 210: if (!isatty(0)) ! 211: exit(0); ! 212: switch (lastcom) { ! 213: case PRCOM: ! 214: fforward(1); ! 215: printf("\b"); ! 216: fprintn(WINDOW); ! 217: lastcom = PRCOM; ! 218: break; ! 219: case DSICOM: ! 220: printf("\b"); ! 221: for (i=0; i<WINDOW; i++) { ! 222: dot += oincr; ! 223: prisploc(); ! 224: if (dispi(dot, odesc, N_GSYM, 0, 0) == -1) ! 225: break; ! 226: } ! 227: break; ! 228: case DSCOM: ! 229: printf("\b"); ! 230: for (i=0; i<WINDOW; i++) { ! 231: oaddr += oincr ? ! 232: oincr : typetosize(otype, WORDSIZE); ! 233: printf("0x%x/ ", oaddr); ! 234: if (dispf((ADDR) oaddr, odesc, ! 235: oclass == N_RSYM ? oclass : ! 236: N_GSYM, otype, 0, 0, DSP) == -1) ! 237: break; ! 238: } ! 239: break; ! 240: default: ! 241: printf("\n"); ! 242: } ! 243: break; ! 244: ! 245: case 'r': ! 246: if (args[0] == '\0') getargs(); ! 247: case 'R': ! 248: signo = 0; ! 249: cpstr(oldargs, args); ! 250: if (debug) error("calling dopcs"); ! 251: if (integ) cntval = integ; ! 252: if (!executing) { ! 253: executing = TRUE; ! 254: if (integ) cntval = integ; ! 255: dopcs('r'); ! 256: executing = FALSE; ! 257: } ! 258: if (debug) error("exiting dopcs"); ! 259: bkaddr = -1; ! 260: goto tumor; ! 261: ! 262: case 'c': ! 263: signo = 0; ! 264: case 'C': ! 265: if (proc[0] != '\0' || integ != 0) { ! 266: setdot(); ! 267: if (dot == -1) { ! 268: error("Cannot set temporary breakpoint"); ! 269: break; ! 270: } ! 271: dopcs('b'); ! 272: bkaddr = dot; ! 273: } else ! 274: bkaddr = -1; ! 275: integ = atoi(args); ! 276: if (debug) error("calling dopcs"); ! 277: if (integ) cntval = integ; ! 278: dopcs('c'); ! 279: if (debug) error("exiting dopcs"); ! 280: if (bkaddr != -1) { ! 281: ADDR dotsave; ! 282: dotsave = dot; ! 283: dot = bkaddr; ! 284: dopcs('d'); ! 285: dot = dotsave; ! 286: } ! 287: tumor: ! 288: if (!signo) printf("Breakpoint"); ! 289: printf(" at\n"); ! 290: setcur(1); ! 291: lastcom = NOCOM; ! 292: break; ! 293: ! 294: case 'S': ! 295: case 's': ! 296: signo = 0; ! 297: integ = atoi(args); ! 298: singstep(integ ? integ : 1, cmd); ! 299: if (signo) printf("\n"); ! 300: setcur(1); ! 301: lastcom = NOCOM; ! 302: break; ! 303: ! 304: case 'g': ! 305: if (pid == 0 || signo) { ! 306: error("Not stopped at breakpoint"); ! 307: break; ! 308: } ! 309: setdot(); ! 310: if (dot == -1) { ! 311: error("Bad address"); ! 312: break; ! 313: } ! 314: adrflg = 1; ! 315: integ = atoi(args); ! 316: if (integ) cntval = integ; ! 317: dopcs('c'); ! 318: if (!signo) printf("Breakpoint"); ! 319: printf(" at\n"); ! 320: setcur(1); ! 321: lastcom = NOCOM; ! 322: break; ! 323: ! 324: case 'k': ! 325: if (scallx) { ! 326: userpc = dot = *(ADDR *)(((ADDR)&u)+PC) = pcs; ! 327: *(ADDR *)(((ADDR)&u)+FP) = fps; ! 328: *(ADDR *)(((ADDR)&u)+AP) = aps; ! 329: if (bkpts) ! 330: bkpts->flag = flagss; ! 331: scallx = 0; ! 332: error("Procedure killed"); ! 333: longjmp(env, 0); ! 334: } else { ! 335: dopcs('k'); ! 336: printf("\n"); ! 337: lastcom = NOCOM; ! 338: break; ! 339: } ! 340: ! 341: case 'B': ! 342: prbkpt(); ! 343: break; ! 344: ! 345: case 'b': ! 346: setbrk: ! 347: if (proc[0] == '\0' && integ == 0) { ! 348: integ = fline; ! 349: } ! 350: setdot(); ! 351: if (dot == -1 || dot == 0) { ! 352: error("Cannot set breakpoint"); ! 353: break; ! 354: } ! 355: dopcs('b'); ! 356: s[0] = ' '; ! 357: s[1] = cmd; ! 358: s[2] = '\n'; ! 359: s[3] = 0; ! 360: s[1] = cmd; ! 361: printbkpt(s, adrtoprocp(dot), dot); ! 362: break; ! 363: ! 364: case 'd': ! 365: if (proc[0] == '\0' && integ == 0) { ! 366: idbkpt(); ! 367: break; ! 368: } ! 369: setdot(); ! 370: if (dot == -1) { ! 371: error("Non existent breakpoint"); ! 372: break; ! 373: } ! 374: dopcs('d'); ! 375: break; ! 376: ! 377: case 'D': ! 378: dabkpt(); ! 379: error("All breakpoints deleted"); ! 380: break; ! 381: ! 382: case 'm': ! 383: addr = varaddr(proc[0] ? proc : curproc()->pname, var); ! 384: printf("stopped with value %d\n", monex(addr, 'd')); ! 385: setcur(1); ! 386: lastcom = NOCOM; ! 387: break; ! 388: ! 389: case '?': ! 390: if (!(var[0] == '.' && var[1] == '\0')) ! 391: setdot(); ! 392: if (errflg) { ! 393: error(errflg); ! 394: break; ! 395: } ! 396: prisploc(); ! 397: dispi(dot, args[0] ? args : "i", N_GSYM, 0, 0); ! 398: lastcom = DSICOM; ! 399: break; ! 400: ! 401: case '/': ! 402: if (var[0] == '.' && var[1] == '\0') { ! 403: if (integ == 0) integ = oaddr; ! 404: dispf((ADDR) integ, args[0] ? args : odesc, ! 405: oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); ! 406: oaddr = integ; ! 407: } else ! 408: if (integ && (var[0] == '\0')) { ! 409: dispf((ADDR) integ, args, N_GSYM, 0, 0, 0, DSP); ! 410: oaddr = integ; ! 411: cpstr(odesc, args); ! 412: oclass = N_GSYM; ! 413: otype = 0; ! 414: } else ! 415: dispvar(proc, var, args); ! 416: lastcom = DSCOM; ! 417: break; ! 418: ! 419: case '=': ! 420: if (var[0] == '\0') { ! 421: if (proc[0]) { ! 422: addr = getaddr(proc, integ); ! 423: if (addr == -1) { ! 424: error("Unknown address"); ! 425: break; ! 426: } ! 427: } ! 428: else ! 429: addr = integ; ! 430: dispf(addr, args[0] ? args : "x", 0, -1, 0, 0, DSP); ! 431: } else ! 432: findvar(proc, var, args[0] ? args : "x", 2); ! 433: break; ! 434: ! 435: case '!': ! 436: if (var[0] == '\0') ! 437: addr = getaddr(proc, integ); ! 438: else ! 439: addr = varaddr(proc, var); ! 440: if (addr == -1) ! 441: error("Unknown variable"); ! 442: else { ! 443: if (number(args[0]) || eqany(args[0], ".-")) { ! 444: char *p; ! 445: double atof(); ! 446: union { ! 447: struct{ ! 448: int w1, w2; ! 449: } ww; ! 450: double d; ! 451: } dbl; ! 452: ! 453: p = (args[0] == '-') ? args+1 : args; ! 454: for (; *p != '.' && *p != 'e'; p++) { ! 455: if (!number(*p)) goto l2; ! 456: } ! 457: dbl.d = atof(args); ! 458: putval(addr, 'd', dbl.ww.w1); ! 459: if (typetodesc(sl_type,0)[0] == 'g') ! 460: putval(addr+WORDSIZE, 'd', dbl.ww.w2); ! 461: break; ! 462: } ! 463: l2: if (percentflag) ! 464: *(ADDR *)(((ADDR)&u)+addr) = argvalue(args); ! 465: else if (sl_class == N_RSYM && addr < 16) ! 466: putreg(addr,typetodesc(sl_type,subflag)[0], ! 467: argvalue(args)); ! 468: else ! 469: putval(addr,typetodesc(sl_type,subflag)[0], ! 470: argvalue(args)); ! 471: } ! 472: lastcom = NOCOM; ! 473: break; ! 474: ! 475: case '"': ! 476: printf(args); ! 477: break; ! 478: } ! 479: } ! 480: ! 481: fpargs() { ! 482: register int i; ! 483: ! 484: switch(args[0]) { ! 485: case 'p': ! 486: case '\0': ! 487: fprint(); ! 488: break; ! 489: case 'w': ! 490: i = fline; ! 491: fback(WINDOW/2); ! 492: fprintn(WINDOW); ! 493: ffind(i); ! 494: break; ! 495: case 'z': ! 496: fprintn(WINDOW); ! 497: break; ! 498: } ! 499: } ! 500: ! 501: MSG BADTXT; ! 502: /* Used by a, b, c, C, d and g commands to find linenumber */ ! 503: setdot() { ! 504: if (ncolonflag) { ! 505: dot = integ; ! 506: get(dot, ISP); ! 507: if (errflg) ! 508: dot = -1; ! 509: } else { ! 510: dot = getaddr(proc, integ); ! 511: if (dot == -1) ! 512: errflg = "Bad line number"; ! 513: } ! 514: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.