|
|
1.1 root 1: static char sccsid[] = "@(#)prvar.c 4.3 8/17/82";
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, *prnamep, *comblk; u_char class; {
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: u_char class;
229: char *desc; short type; ADDR addr; {
230: dispx(addr, desc, class, type, size, subflag, DSP);
231: printf("\n");
232: }
233:
234: /* display addr in instruction space using format desc or class s */
235: /* returns -1 if bad address */
236: dispi(addr, desc, class, type, size, subflag, space)
237: u_char class;
238: char *desc; short type; ADDR addr; {
239: register i;
240: i = dispx(addr, desc, class, type, size, subflag, ISP);
241: printf("\n");
242: return(i);
243: }
244:
245: char pd[3];
246: dispx(addr, desc, class, type, size, subflag, space)
247: u_char class;
248: char *desc; short type; ADDR addr; {
249: int i, sflag;
250: char *p;
251: char dlen, dfmt;
252: long value;
253: union {
254: char c[WORDSIZE];
255: int w;
256: float f;
257: } word;
258: union {
259: struct{
260: int w1, w2;
261: } ww;
262: double d;
263: } dbl;
264:
265: class &= STABMASK;
266: if (desc[0] == '\0') desc = typetodesc(type, subflag);
267: cpstr(odesc, desc);
268: otype = type;
269: oclass = class;
270: oaddr = addr;
271: oincr = 0;
272: if (debug) printf("dispx(addr=%d,desc=%s,class=%d,type=%d,size=%d,subflg=%d,space=%d)\n",
273: addr, desc, class, type, size, subflag, space);
274: pd[0] = '%';
275: pd[1] = dfmt = 'd';
276: dlen = '\0';
277: for (p = desc; *p; p++) {
278: if (*p>= '0' && *p<'9') {
279: size = readint(&p);
280: p--;
281: } else switch (*p) {
282: case 'l':
283: case 'h':
284: case 'b':
285: dlen = *p;
286: break;
287:
288: case 'a':
289: case 'c':
290: case 'd':
291: case 'f':
292: case 'g':
293: case 'i':
294: case 'I':
295: case 'o':
296: case 'p':
297: case 's':
298: case 'u':
299: case 'x':
300: pd[1] = dfmt = *p;
301: break;
302:
303: default:
304: printf("Illegal descriptor: %c\n", *p);
305: return(1);
306: }
307: }
308:
309: if (type == -1)
310: value = addr;
311: else if (class == N_RSYM && addr < 16) {
312: /* MACHINE DEPENDENT */
313: if ((addr > 0 && addr < 6) || addr > 11) {
314: printf("Bad register var %d\n", addr);
315: return(-1);
316: }
317: value = *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr);
318: }
319: else {
320: value = getval(addr, dfmt == 'g' ? 'd' : dfmt, space);
321: }
322:
323: if (errflg) {
324: printf("%s", errflg);
325: errflg = 0;
326: return(-1);
327: }
328:
329: switch (dfmt) {
330: default:
331: switch (dfmt) {
332: case 'u':
333: case 'x':
334: case 'o':
335: switch (dlen) {
336: case 'h':
337: value = (unsigned short) value;
338: oincr = 2;
339: break;
340: case 'b':
341: value = (unsigned char) value;
342: oincr = 1;
343: break;
344: case 'l':
345: value = (unsigned long) value;
346: oincr = 4;
347: break;
348: default:
349: oincr = WORDSIZE;
350: break;
351: }
352: break;
353:
354: default:
355: switch (dlen) {
356: case 'h':
357: value = (short) value;
358: oincr = 2;
359: break;
360: case 'b':
361: value = (char) value;
362: oincr = 1;
363: break;
364: case 'l':
365: value = (long) value;
366: oincr = 4;
367: break;
368: default:
369: oincr = WORDSIZE;
370: break;
371: }
372: }
373: if (dfmt == 'x' && (value > 9 || value < 0))
374: printf("0x");
375: else if (dfmt == 'o' && (value > 7 || value < 0))
376: printf("0");
377: printf(pd, value);
378: return(1);
379:
380: case 'f':
381: pd[1] = 'g';
382: word.w = value;
383: printf(pd, word.f);
384: return(1);
385:
386: case 'g':
387: dbl.ww.w1 = value;
388: dbl.ww.w2 = (class == N_RSYM) ?
389: *(ADDR *)(((ADDR) &u)+R0+(WORDSIZE)*(addr+1)) :
390: getval(addr+WORDSIZE, 'd', space);
391: printf("%.13g", dbl.d);
392: return(1);
393:
394: case 'p':
395: printf("%s:%d", adrtoprocp(value)->pname,
396: adrtolineno(value));
397: return(1);
398:
399: case 's':
400: addr = getindir(class, addr, type);
401: goto aa;
402:
403: case 'c':
404: if (size <= 1) {
405: oincr = 1;
406: printchar(value);
407: return(1);
408: } else
409: goto aa;
410:
411: case 'a':
412: aa: sflag = size == 0;
413: if (sflag)
414: size = 128; /* maximum length for s and a */
415: else
416: oincr = size;
417: for (;;) {
418: word.w = getval(addr, 'd', space);
419: for (i=0; i<WORDSIZE; i++) {
420: if (sflag && word.c[i] == 0)
421: return(1);
422: if (size-- == 0)
423: return(1);
424: printchar(word.c[i]);
425: }
426: addr += WORDSIZE;
427: }
428: break;
429:
430: case 'i':
431: case 'I':
432: value = chkget(dot, space);
433: if (errflg) {
434: printf("%s", errflg);
435: errflg = 0;
436: return(-1);
437: }
438: printins(dfmt, space, value);
439: break;
440:
441: }
442: return(1);
443: }
444:
445: /* print variable as in prvar */
446: printit(metaflag, prvar, addr, desc, class, type, size, subflag, space)
447: u_char class;
448: char *desc; short type; ADDR addr; {
449: if (prvar == 0)
450: return;
451: if (metaflag) {
452: if (prvar == 1)
453: printf("/ ");
454: else
455: printf("= ");
456: }
457: if (prvar == 1)
458: dispf(addr, desc, class, type, size,
459: subflag, space);
460: else
461: dispf(addr, desc, 0, -1, 0, 0, DSP);
462: }
463:
464: printchar(c) {
465: if ((c & 0177) < ' ')
466: printf("^%c", c + ('A' - 1));
467: else if ((c & 0177) == 0177)
468: printf("^?");
469: else
470: printf("%c", c);
471: }
472:
473: INT fcor;
474: printmap(s,amap)
475: STRING s; MAP *amap;
476: {
477: int file;
478: file=amap->ufd;
479: printf("%s\t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
480: printf("b1 = 0x%-16x",amap->b1);
481: printf("e1 = 0x%-16x",amap->e1);
482: printf("f1 = 0x%-x",amap->f1);
483: printf("\nb2 = 0x%-16x",amap->b2);
484: printf("e2 = 0x%-16x",amap->e2);
485: printf("f2 = 0x%-x",amap->f2);
486: printf("\n");
487: }
488:
489: #define NUMREGS 24 /* number of hardware registers */
490: REGLIST reglist[];
491:
492: printregs()
493: {
494: REG REGPTR p;
495:
496: for (p=reglist; p < ®list[NUMREGS/2]; p++) {
497: printf("%4.4s/ ", p->rname);
498: prhex12(*(ADDR *)(((ADDR)&u)+p->roffs));
499: printf(" %4.4s/ ",(p+NUMREGS/2)->rname);
500: prhex(*(ADDR *)(((ADDR)&u)+(p+NUMREGS/2)->roffs));
501: printf("\n");
502: }
503: printpc();
504: }
505:
506: printpc()
507: {
508: dot= *(ADDR *)(((ADDR)&u)+PC);
509: prisploc();
510: printins('i',ISP,chkget(dot,ISP));
511: printf("\n");
512: }
513:
514: /* print register */
515: REGLIST reglist[];
516: regout(name, prvar, fmt)
517: char *name, *fmt; {
518: REG REGPTR p;
519: for (p=reglist; p< ®list[24]; p++) {
520: if (eqstr(name, p->rname)) {
521: printit(0, prvar, *(ADDR *)(((ADDR)&u)+p->roffs),
522: fmt[0] ? fmt : "d", N_GSYM, -1, 0, 0, DSP);
523: return(p->roffs);
524: }
525: }
526: error("Unknown register variable");
527: return(-1);
528: }
529: /* Print symbolic location of dot */
530: prisploc() {
531: struct proct *procp;
532: int lineno;
533:
534: printf("0x%x", dot);
535: procp = adrtoprocp(dot);
536: if (procp != badproc) {
537: printf(" (");
538: prlnoff(procp, dot);
539: printf("): \t");
540: } else
541: printf(": \t");
542: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.