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