|
|
1.1 root 1: static char sccsid[] = "@(#)prvar.c 4.1 10/9/80";
2: #include "head.h"
3: #include <a.out.h>
4: #include <stab.h>
5: #include "cdefs.h"
6: struct user u;
7: BKPTR bkpthead;
8: STRING errflg;
9:
10: /*
11: * outvar():
12: * Prints named variable, recursing once for each structure member or
13: * subscript.
14: * proc:var: variable name
15: * fmt: print format
16: * metaflag: set iff var contains metacharacters * or ?
17: * addr: partial address of variable, initally 0
18: * class: type class of variable
19: * subflag: number of levels of subscript indirection
20: * prnamep: pointer to end of partially formed print name of variable
21: * comblk: name of common block containing variable, if any
22: * prvar: as in findvar
23: *
24: * Here and elsewhere we assume that -1 is an invalid address, and
25: * its is used to indicate error.
26: */
27: outvar(proc, var, fmt, metaflag, addr, class, subflag, prnamep,
28: comblk, prvar)
29: ADDR addr; char *proc, *var, *fmt, class, *prnamep, *comblk; {
30: char *p, *q, *r, *oldpr;
31: register int match;
32: long soffset, goffset;
33: register ADDR newaddr = -1, arrowaddr;
34: register enum {INIT, ARROW, DOT} typeflag;
35:
36: switch (var[0]) {
37: case '\0':
38: if (prvar == 0) return(addr);
39: if (metaflag) {
40: if (comblk[0] && !(eqstr(comblk, "*")))
41: #ifndef FLEXNAMES
42: printf("%.8s:%.8s", comblk, prname);
43: #else
44: printf("%s:%s", comblk, prname);
45: #endif
46: else if (proc[0])
47: #ifndef FLEXNAMES
48: printf("%.8s:%.8s", proc, prname);
49: #else
50: printf("%s:%s", proc, prname);
51: #endif
52: else
53: printf("%s", prname);
54: }
55: printit(metaflag, prvar, addr, fmt, class, sl_type,
56: sl_size, subflag, DSP);
57: return(addr);
58:
59: case '[':
60: *prnamep++ = *var++;
61: p = var;
62: for (;;) {
63: *prnamep++ = *var;
64: if (*var == '\0' || *var == ']') break;
65: var++;
66: }
67: newaddr = getindir(class, addr, sl_type);
68: newaddr += typetosize(sl_type, sl_size) * readint(&p);
69: return(outvar(proc, var+1, fmt, metaflag, newaddr, N_GSYM,
70: subflag+1, prnamep, comblk, prvar));
71:
72: case '-':
73: case '>':
74: typeflag = ARROW;
75: while (eqany(*var, "->"))
76: *prnamep++ = *var++;
77: subflag++;
78: arrowaddr = getindir(class, addr, sl_type);
79: if (errflg) {
80: printf("%s\n", errflg);
81: errflg = 0;
82: return(0);
83: }
84: class = N_GSYM;
85: if (var[0] == '\0') {
86: p = var;
87: newaddr = arrowaddr;
88: goto recurse;
89: }
90: break;
91:
92: case '.':
93: typeflag = DOT;
94: if (class == N_RSYM) {
95: error("Not with a register variable");
96: return(0);
97: }
98: *prnamep++ = *var++;
99: subflag = 0;
100: break;
101:
102: default:
103: typeflag = INIT;
104: break;
105: }
106:
107: if (typeflag == INIT) {
108: soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
109: goffset = proc[0] ? -1 : findfile(curfile)->stf_offset;
110: } else {
111: soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
112: goffset = findfile(curfile)->stf_offset;
113: }
114:
115: p = var;
116: oldpr = prnamep;
117: while (!eqany(*p, "->.[") && *p != '\0')
118: *prnamep++ = *p++;
119: *prnamep = '\0';
120:
121: match = 0;
122: slookinit();
123:
124: for (;;) {
125: if (soffset != -1)
126: if ((soffset = slooknext(var, soffset, typeflag!=INIT,
127: comblk)) != -1)
128: goto found;
129: if (goffset != -1)
130: if ((goffset = globallookup(var, goffset,
131: typeflag!=INIT)) != -1)
132: goto found;
133: return(newaddr);
134:
135: found:
136: r = sl_name;
137: q = oldpr;
138: while (*r) *q++ = *r++;
139: *q ='\0';
140:
141: switch(typeflag) {
142: case INIT:
143: class = sl_class & STABMASK;
144: if (!varclass(class) || class == N_SSYM)
145: goto l;
146: newaddr = (class == N_LSYM) ? -sl_addr : sl_addr;
147: newaddr = formaddr(class, newaddr);
148: break;
149:
150: case ARROW:
151: class = sl_class & STABMASK;
152: if (!varclass(class) || class != N_SSYM)
153: goto l;
154: newaddr = arrowaddr + sl_addr;
155: break;
156:
157: case DOT:
158: class = sl_class & STABMASK;
159: if (!varclass(class) || class != N_SSYM)
160: goto l;
161: newaddr = addr + sl_addr;
162: break;
163: }
164:
165: recurse:
166: newaddr = outvar(proc, p, fmt, metaflag, newaddr,
167: class, subflag, prnamep, comblk, prvar);
168:
169: if (!metaflag)
170: return(newaddr);
171: l:; }
172: }
173:
174: /* Output external variables. Arguments as in outvar() */
175: extoutvar(var, fmt, metaflag, prvar)
176: char *var, *fmt; {
177: long offset;
178: ADDR addr = -1;
179:
180: offset = extstart;
181: sl_addr = -1;
182:
183: for (;;) {
184: offset = extlookup(var, offset);
185: addr = sl_addr;
186: if (offset == -1)
187: return(addr);
188: if (metaflag)
189: #ifndef FLEXNAMES
190: printf("%.7s", sl_name);
191: #else
192: printf("%s", sl_name);
193: #endif
194: printit(metaflag, prvar, addr, fmt[0] ? fmt : "d",
195: N_GSYM, 0, 0, 0, DSP);
196: if (!metaflag)
197: return(addr);
198: }
199: }
200:
201: prdebug() {
202: register struct proct *procp;
203: register struct filet *filep;
204:
205: printf("dot=%d\n", dot);
206: printf("extstart = %d\n", extstart);
207: printf("firstdata = %d\n", firstdata);
208: for(filep=files;filep->sfilename[0];filep++)
209: printf("%s offs %d @ %d flag %d addr 0x%x\n", filep->sfilename, filep->stf_offset, filep, filep->lineflag, filep->faddr);
210: for(procp=procs;procp->pname[0];procp++) {
211: #ifndef FLEXNAMES
212: printf("%s addr 0x%x; offs %d; sfptr %d; line %d",
213: #else
214: printf("%8.8s addr 0x%x; offs %d; sfptr %d; line %d",
215: #endif
216: procp->pname, procp->paddr, procp->st_offset,
217: procp->sfptr, procp->lineno);
218: if (procp->entrypt) printf(" entrypoint");
219: printf("\n");
220: }
221: }
222:
223: /*
224: * display addr in data space using format desc or class s
225: * type == 1 => use addr for value to print
226: */
227: dispf(addr, desc, class, type, size, subflag, space)
228: char *desc; short type; ADDR addr; {
229: dispx(addr, desc, class, type, size, subflag, DSP);
230: printf("\n");
231: }
232:
233: /* display addr in instruction space using format desc or class s */
234: /* returns -1 if bad address */
235: dispi(addr, desc, class, type, size, subflag, space)
236: char *desc; short type; ADDR addr; {
237: register i;
238: i = dispx(addr, desc, class, type, size, subflag, ISP);
239: printf("\n");
240: return(i);
241: }
242:
243: char pd[3];
244: dispx(addr, desc, class, type, size, subflag, space)
245: char *desc; short type; ADDR addr; {
246: int i, sflag;
247: char *p;
248: char dlen, dfmt;
249: long value;
250: union {
251: char c[WORDSIZE];
252: int w;
253: float f;
254: } word;
255: union {
256: struct{
257: int w1, w2;
258: } ww;
259: double d;
260: } dbl;
261:
262: class &= STABMASK;
263: if (desc[0] == '\0') desc = typetodesc(type, subflag);
264: cpstr(odesc, desc);
265: otype = type;
266: oclass = class;
267: oaddr = addr;
268: oincr = 0;
269: if (debug) printf("dispx(addr=%d,desc=%s,class=%d,type=%d,size=%d,subflg=%d,space=%d)\n",
270: addr, desc, class, type, size, subflag, space);
271: pd[0] = '%';
272: pd[1] = dfmt = 'd';
273: dlen = '\0';
274: for (p = desc; *p; p++) {
275: if (*p>= '0' && *p<'9') {
276: size = readint(&p);
277: p--;
278: } else switch (*p) {
279: case 'l':
280: case 'h':
281: case 'b':
282: dlen = *p;
283: break;
284:
285: case 'a':
286: case 'c':
287: case 'd':
288: case 'f':
289: case 'g':
290: case 'i':
291: case 'I':
292: case 'o':
293: case 'p':
294: case 's':
295: case 'u':
296: case 'x':
297: pd[1] = dfmt = *p;
298: break;
299:
300: default:
301: printf("Illegal descriptor: %c\n", *p);
302: return(1);
303: }
304: }
305:
306: if (type == -1)
307: value = addr;
308: else if (class == N_RSYM && addr < 16) {
309: /* MACHINE DEPENDENT */
310: if ((addr > 0 && addr < 6) || addr > 11) {
311: printf("Bad register var %d\n", addr);
312: return(-1);
313: }
314: value = *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr);
315: }
316: else {
317: value = getval(addr, dfmt == 'g' ? 'd' : dfmt, space);
318: }
319:
320: if (errflg) {
321: printf("%s", errflg);
322: errflg = 0;
323: return(-1);
324: }
325:
326: switch (dfmt) {
327: default:
328: switch (dfmt) {
329: case 'u':
330: case 'x':
331: case 'o':
332: switch (dlen) {
333: case 'h':
334: value = (unsigned short) value;
335: oincr = 2;
336: break;
337: case 'b':
338: value = (unsigned char) value;
339: oincr = 1;
340: break;
341: case 'l':
342: value = (unsigned long) value;
343: oincr = 4;
344: break;
345: default:
346: oincr = WORDSIZE;
347: break;
348: }
349: break;
350:
351: default:
352: switch (dlen) {
353: case 'h':
354: value = (short) value;
355: oincr = 2;
356: break;
357: case 'b':
358: value = (char) value;
359: oincr = 1;
360: break;
361: case 'l':
362: value = (long) value;
363: oincr = 4;
364: break;
365: default:
366: oincr = WORDSIZE;
367: break;
368: }
369: }
370: if (dfmt == 'x' && (value > 9 || value < 0))
371: printf("0x");
372: else if (dfmt == 'o' && (value > 7 || value < 0))
373: printf("0");
374: printf(pd, value);
375: return(1);
376:
377: case 'f':
378: pd[1] = 'g';
379: word.w = value;
380: printf(pd, word.f);
381: return(1);
382:
383: case 'g':
384: dbl.ww.w1 = value;
385: dbl.ww.w2 = (class == (char) N_RSYM) ?
386: *(ADDR *)(((ADDR) &u)+R0+(WORDSIZE)*(addr+1)) :
387: getval(addr+WORDSIZE, 'd', space);
388: printf("%.13g", dbl.d);
389: return(1);
390:
391: case 'p':
392: printf("%s:%d", adrtoprocp(value)->pname,
393: adrtolineno(value));
394: return(1);
395:
396: case 's':
397: addr = getindir(class, addr, type);
398: goto aa;
399:
400: case 'c':
401: if (size <= 1) {
402: oincr = 1;
403: printchar(value);
404: return(1);
405: } else
406: goto aa;
407:
408: case 'a':
409: aa: sflag = size == 0;
410: if (sflag)
411: size = 128; /* maximum length for s and a */
412: else
413: oincr = size;
414: for (;;) {
415: word.w = getval(addr, 'd', space);
416: for (i=0; i<WORDSIZE; i++) {
417: if (sflag && word.c[i] == 0)
418: return(1);
419: if (size-- == 0)
420: return(1);
421: printchar(word.c[i]);
422: }
423: addr += WORDSIZE;
424: }
425: break;
426:
427: case 'i':
428: case 'I':
429: value = chkget(dot, space);
430: if (errflg) {
431: printf("%s", errflg);
432: errflg = 0;
433: return(-1);
434: }
435: printins(dfmt, space, value);
436: break;
437:
438: }
439: return(1);
440: }
441:
442: /* print variable as in prvar */
443: printit(metaflag, prvar, addr, desc, class, type, size, subflag, space)
444: char *desc; short type; ADDR addr; {
445: if (prvar == 0)
446: return;
447: if (metaflag) {
448: if (prvar == 1)
449: printf("/ ");
450: else
451: printf("= ");
452: }
453: if (prvar == 1)
454: dispf(addr, desc, class, type, size,
455: subflag, space);
456: else
457: dispf(addr, desc, 0, -1, 0, 0, DSP);
458: }
459:
460: printchar(c) {
461: if ((c & 0177) < ' ')
462: printf("^%c", c + ('A' - 1));
463: else if ((c & 0177) == 0177)
464: printf("^?");
465: else
466: printf("%c", c);
467: }
468:
469: INT fcor;
470: printmap(s,amap)
471: STRING s; MAP *amap;
472: {
473: int file;
474: file=amap->ufd;
475: printf("%s\t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
476: printf("b1 = 0x%-16x",amap->b1);
477: printf("e1 = 0x%-16x",amap->e1);
478: printf("f1 = 0x%-x",amap->f1);
479: printf("\nb2 = 0x%-16x",amap->b2);
480: printf("e2 = 0x%-16x",amap->e2);
481: printf("f2 = 0x%-x",amap->f2);
482: printf("\n");
483: }
484:
485: #define NUMREGS 24 /* number of hardware registers */
486: REGLIST reglist[];
487:
488: printregs()
489: {
490: REG REGPTR p;
491:
492: for (p=reglist; p < ®list[NUMREGS/2]; p++) {
493: printf("%4.4s/ ", p->rname);
494: prhex12(*(ADDR *)(((ADDR)&u)+p->roffs));
495: printf(" %4.4s/ ",(p+NUMREGS/2)->rname);
496: prhex(*(ADDR *)(((ADDR)&u)+(p+NUMREGS/2)->roffs));
497: printf("\n");
498: }
499: printpc();
500: }
501:
502: printpc()
503: {
504: dot= *(ADDR *)(((ADDR)&u)+PC);
505: prisploc();
506: printins('i',ISP,chkget(dot,ISP));
507: printf("\n");
508: }
509:
510: /* print register */
511: REGLIST reglist[];
512: regout(name, prvar, fmt)
513: char *name, *fmt; {
514: REG REGPTR p;
515: for (p=reglist; p< ®list[24]; p++) {
516: if (eqstr(name, p->rname)) {
517: printit(0, prvar, *(ADDR *)(((ADDR)&u)+p->roffs),
518: fmt[0] ? fmt : "d", N_GSYM, -1, 0, 0, DSP);
519: return(p->roffs);
520: }
521: }
522: error("Unknown register variable");
523: return(-1);
524: }
525: /* Print symbolic location of dot */
526: prisploc() {
527: struct proct *procp;
528: int lineno;
529:
530: printf("0x%x", dot);
531: procp = adrtoprocp(dot);
532: if (procp != badproc) {
533: printf(" (");
534: prlnoff(procp, dot);
535: printf("): \t");
536: } else
537: printf(": \t");
538: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.