|
|
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.