|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: /* ! 3: * display(i,f) - display local variables of i most recent ! 4: * procedure activations, plus global variables. ! 5: * Output to file f (default &errout). ! 6: */ ! 7: ! 8: Xdisplay(nargs, arg2, arg1, arg0) ! 9: int nargs; ! 10: struct descrip arg2, arg1, arg0; ! 11: { ! 12: register int *ap, *fp; ! 13: register struct descrip *dp; ! 14: register struct descrip *np; ! 15: register int n; ! 16: long l; ! 17: int count; ! 18: FILE *f; ! 19: struct b_proc *bp; ! 20: extern int *boundary; ! 21: extern struct descrip *globals, *eglobals; ! 22: extern struct descrip *gnames; ! 23: extern struct descrip *statics; ! 24: ! 25: /* ! 26: * i defaults to &level; f defaults to &errout. ! 27: */ ! 28: defint(&arg1, &l, k_level); ! 29: deffile(&arg2, &errout); ! 30: /* ! 31: * Produce error if file can't be written on. ! 32: */ ! 33: f = BLKLOC(arg2)->file.fd; ! 34: if ((BLKLOC(arg2)->file.status & FS_WRITE) == 0) ! 35: runerr(213, &arg2); ! 36: ! 37: /* ! 38: * Produce error if i is negative; constrain i to be >= &level. ! 39: */ ! 40: if (l < 0) ! 41: runerr(205, &arg1); ! 42: else if (l > k_level) ! 43: count = k_level; ! 44: else ! 45: count = l; ! 46: ! 47: fp = boundary; /* start fp at most recent procedure frame */ ! 48: while (count--) { /* go back through 'count' frames */ ! 49: #ifdef VAX ! 50: ap = (int *) fp[2]; /* get old ap */ ! 51: fp = (int *) fp[3]; /* get old fp */ ! 52: if (fp == 0) /* only trace back to start of current stack*/ ! 53: break; ! 54: n = ap[1]; /* get number of arguments */ ! 55: /* calculate address of procedure descriptor*/ ! 56: dp = (struct descrip *) (ap + 2 + 2*n); ! 57: #endif VAX ! 58: #ifdef PORT ! 59: /* ! 60: * Insert code here to calculate (in dp) the address of arg0 in ! 61: * procedure frame prior to one referenced by fp. ! 62: */ ! 63: #endif PORT ! 64: #ifdef PDP11 ! 65: fp = fp[0]; /* get old fp */ ! 66: if (fp == 0) /* only trace back to start of current stack*/ ! 67: break; ! 68: n = fp[2]; /* get number of arguments */ ! 69: dp = fp + 3 + 2*n; /* calculate address of procedure descriptor*/ ! 70: #endif PDP11 ! 71: bp = (struct b_proc *) BLKLOC(*dp); /* get address of procedure block */ ! 72: ! 73: /* ! 74: * Print procedure name. ! 75: */ ! 76: putstr(f, STRLOC(bp->pname), STRLEN(bp->pname)); ! 77: fprintf(f, " local identifiers:\n"); ! 78: ! 79: /* ! 80: * Print arguments. ! 81: */ ! 82: np = bp->lnames; ! 83: for (n = bp->nparam; n > 0; n--) { ! 84: fprintf(f, " "); ! 85: putstr(f, STRLOC(*np), STRLEN(*np)); ! 86: fprintf(f, " = "); ! 87: outimage(f, --dp, 0); ! 88: putc('\n', f); ! 89: np++; ! 90: } ! 91: ! 92: /* ! 93: * Print local dynamics. ! 94: */ ! 95: dp = (struct descrip *) (fp - FRAMELIMIT); ! 96: for (n = bp->ndynam; n > 0; n--) { ! 97: fprintf(f, " "); ! 98: putstr(f, STRLOC(*np), STRLEN(*np)); ! 99: fprintf(f, " = "); ! 100: outimage(f, --dp, 0); ! 101: putc('\n', f); ! 102: np++; ! 103: } ! 104: ! 105: /* ! 106: * Print local statics. ! 107: */ ! 108: dp = &statics[bp->fstatic]; ! 109: for (n = bp->nstatic; n > 0; n--) { ! 110: fprintf(f, " "); ! 111: putstr(f, STRLOC(*np), STRLEN(*np)); ! 112: fprintf(f, " = "); ! 113: outimage(f, dp++, 0); ! 114: putc('\n', f); ! 115: np++; ! 116: } ! 117: ! 118: } ! 119: ! 120: /* ! 121: * Print globals. ! 122: */ ! 123: fprintf(f, "global identifiers:\n"); ! 124: dp = globals; ! 125: np = gnames; ! 126: while (dp < eglobals) { ! 127: fprintf(f, " "); ! 128: putstr(f, STRLOC(*np), STRLEN(*np)); ! 129: fprintf(f, " = "); ! 130: outimage(f, dp++, 0); ! 131: putc('\n', f); ! 132: np++; ! 133: } ! 134: fflush(f); ! 135: arg0 = nulldesc; /* Return null value. */ ! 136: } ! 137: ! 138: Procblock(display,2) ! 139:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.