1*7775Srrh static char sccsid[] = "@(#)prvar.c 4.3 08/17/82";
21345Sbill #include "head.h"
31345Sbill #include <a.out.h>
41345Sbill #include <stab.h>
51345Sbill #include "cdefs.h"
61345Sbill struct user u;
71345Sbill BKPTR bkpthead;
81345Sbill STRING errflg;
91345Sbill
101345Sbill /*
111345Sbill * outvar():
121345Sbill * Prints named variable, recursing once for each structure member or
131345Sbill * subscript.
141345Sbill * proc:var: variable name
151345Sbill * fmt: print format
161345Sbill * metaflag: set iff var contains metacharacters * or ?
171345Sbill * addr: partial address of variable, initally 0
181345Sbill * class: type class of variable
191345Sbill * subflag: number of levels of subscript indirection
201345Sbill * prnamep: pointer to end of partially formed print name of variable
211345Sbill * comblk: name of common block containing variable, if any
221345Sbill * prvar: as in findvar
231345Sbill *
241345Sbill * Here and elsewhere we assume that -1 is an invalid address, and
251345Sbill * its is used to indicate error.
261345Sbill */
outvar(proc,var,fmt,metaflag,addr,class,subflag,prnamep,comblk,prvar)271345Sbill outvar(proc, var, fmt, metaflag, addr, class, subflag, prnamep,
281345Sbill comblk, prvar)
29*7775Srrh ADDR addr; char *proc, *var, *fmt, *prnamep, *comblk; u_char class; {
301345Sbill char *p, *q, *r, *oldpr;
311345Sbill register int match;
321345Sbill long soffset, goffset;
331345Sbill register ADDR newaddr = -1, arrowaddr;
341345Sbill register enum {INIT, ARROW, DOT} typeflag;
351345Sbill
361345Sbill switch (var[0]) {
371345Sbill case '\0':
381345Sbill if (prvar == 0) return(addr);
391345Sbill if (metaflag) {
401345Sbill if (comblk[0] && !(eqstr(comblk, "*")))
411345Sbill #ifndef FLEXNAMES
421345Sbill printf("%.8s:%.8s", comblk, prname);
431345Sbill #else
441345Sbill printf("%s:%s", comblk, prname);
451345Sbill #endif
461345Sbill else if (proc[0])
471345Sbill #ifndef FLEXNAMES
481345Sbill printf("%.8s:%.8s", proc, prname);
491345Sbill #else
501345Sbill printf("%s:%s", proc, prname);
511345Sbill #endif
521345Sbill else
531345Sbill printf("%s", prname);
541345Sbill }
551345Sbill printit(metaflag, prvar, addr, fmt, class, sl_type,
561345Sbill sl_size, subflag, DSP);
571345Sbill return(addr);
581345Sbill
591345Sbill case '[':
601345Sbill *prnamep++ = *var++;
611345Sbill p = var;
621345Sbill for (;;) {
631345Sbill *prnamep++ = *var;
641345Sbill if (*var == '\0' || *var == ']') break;
651345Sbill var++;
661345Sbill }
671345Sbill newaddr = getindir(class, addr, sl_type);
681345Sbill newaddr += typetosize(sl_type, sl_size) * readint(&p);
691345Sbill return(outvar(proc, var+1, fmt, metaflag, newaddr, N_GSYM,
701345Sbill subflag+1, prnamep, comblk, prvar));
711345Sbill
721345Sbill case '-':
731345Sbill case '>':
741345Sbill typeflag = ARROW;
751345Sbill while (eqany(*var, "->"))
761345Sbill *prnamep++ = *var++;
771345Sbill subflag++;
781345Sbill arrowaddr = getindir(class, addr, sl_type);
791345Sbill if (errflg) {
801345Sbill printf("%s\n", errflg);
811345Sbill errflg = 0;
821345Sbill return(0);
831345Sbill }
841345Sbill class = N_GSYM;
851345Sbill if (var[0] == '\0') {
861345Sbill p = var;
871345Sbill newaddr = arrowaddr;
881345Sbill goto recurse;
891345Sbill }
901345Sbill break;
911345Sbill
921345Sbill case '.':
931345Sbill typeflag = DOT;
941345Sbill if (class == N_RSYM) {
951345Sbill error("Not with a register variable");
961345Sbill return(0);
971345Sbill }
981345Sbill *prnamep++ = *var++;
991345Sbill subflag = 0;
1001345Sbill break;
1011345Sbill
1021345Sbill default:
1031345Sbill typeflag = INIT;
1041345Sbill break;
1051345Sbill }
1061345Sbill
1071345Sbill if (typeflag == INIT) {
1081345Sbill soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
1091345Sbill goffset = proc[0] ? -1 : findfile(curfile)->stf_offset;
1101345Sbill } else {
1111345Sbill soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
1121345Sbill goffset = findfile(curfile)->stf_offset;
1131345Sbill }
1141345Sbill
1151345Sbill p = var;
1161345Sbill oldpr = prnamep;
1171345Sbill while (!eqany(*p, "->.[") && *p != '\0')
1181345Sbill *prnamep++ = *p++;
1191345Sbill *prnamep = '\0';
1201345Sbill
1211345Sbill match = 0;
1221345Sbill slookinit();
1231345Sbill
1241345Sbill for (;;) {
1251345Sbill if (soffset != -1)
1261345Sbill if ((soffset = slooknext(var, soffset, typeflag!=INIT,
1271345Sbill comblk)) != -1)
1281345Sbill goto found;
1291345Sbill if (goffset != -1)
1301345Sbill if ((goffset = globallookup(var, goffset,
1311345Sbill typeflag!=INIT)) != -1)
1321345Sbill goto found;
1331345Sbill return(newaddr);
1341345Sbill
1351345Sbill found:
1361345Sbill r = sl_name;
1371345Sbill q = oldpr;
1381345Sbill while (*r) *q++ = *r++;
1391345Sbill *q ='\0';
1401345Sbill
1411345Sbill switch(typeflag) {
1421345Sbill case INIT:
1431345Sbill class = sl_class & STABMASK;
1441345Sbill if (!varclass(class) || class == N_SSYM)
1451345Sbill goto l;
1461345Sbill newaddr = (class == N_LSYM) ? -sl_addr : sl_addr;
1471345Sbill newaddr = formaddr(class, newaddr);
1481345Sbill break;
1491345Sbill
1501345Sbill case ARROW:
1511345Sbill class = sl_class & STABMASK;
1521345Sbill if (!varclass(class) || class != N_SSYM)
1531345Sbill goto l;
1541345Sbill newaddr = arrowaddr + sl_addr;
1551345Sbill break;
1561345Sbill
1571345Sbill case DOT:
1581345Sbill class = sl_class & STABMASK;
1591345Sbill if (!varclass(class) || class != N_SSYM)
1601345Sbill goto l;
1611345Sbill newaddr = addr + sl_addr;
1621345Sbill break;
1631345Sbill }
1641345Sbill
1651345Sbill recurse:
1661345Sbill newaddr = outvar(proc, p, fmt, metaflag, newaddr,
1671345Sbill class, subflag, prnamep, comblk, prvar);
1681345Sbill
1691345Sbill if (!metaflag)
1701345Sbill return(newaddr);
1711345Sbill l:; }
1721345Sbill }
1731345Sbill
1741345Sbill /* Output external variables. Arguments as in outvar() */
extoutvar(var,fmt,metaflag,prvar)1751345Sbill extoutvar(var, fmt, metaflag, prvar)
1761345Sbill char *var, *fmt; {
1771345Sbill long offset;
1781345Sbill ADDR addr = -1;
1791345Sbill
1801345Sbill offset = extstart;
1811345Sbill sl_addr = -1;
1821345Sbill
1831345Sbill for (;;) {
1841345Sbill offset = extlookup(var, offset);
1851345Sbill addr = sl_addr;
1861345Sbill if (offset == -1)
1871345Sbill return(addr);
1881345Sbill if (metaflag)
1891345Sbill #ifndef FLEXNAMES
1901345Sbill printf("%.7s", sl_name);
1911345Sbill #else
1921345Sbill printf("%s", sl_name);
1931345Sbill #endif
1941345Sbill printit(metaflag, prvar, addr, fmt[0] ? fmt : "d",
1951345Sbill N_GSYM, 0, 0, 0, DSP);
1961345Sbill if (!metaflag)
1971345Sbill return(addr);
1981345Sbill }
1991345Sbill }
2001345Sbill
prdebug()2011345Sbill prdebug() {
2021345Sbill register struct proct *procp;
2031345Sbill register struct filet *filep;
2041345Sbill
2051345Sbill printf("dot=%d\n", dot);
2061345Sbill printf("extstart = %d\n", extstart);
2071345Sbill printf("firstdata = %d\n", firstdata);
2081345Sbill for(filep=files;filep->sfilename[0];filep++)
2091345Sbill printf("%s offs %d @ %d flag %d addr 0x%x\n", filep->sfilename, filep->stf_offset, filep, filep->lineflag, filep->faddr);
2101345Sbill for(procp=procs;procp->pname[0];procp++) {
2111345Sbill #ifndef FLEXNAMES
2121345Sbill printf("%s addr 0x%x; offs %d; sfptr %d; line %d",
2131345Sbill #else
2141345Sbill printf("%8.8s addr 0x%x; offs %d; sfptr %d; line %d",
2151345Sbill #endif
2161345Sbill procp->pname, procp->paddr, procp->st_offset,
2171345Sbill procp->sfptr, procp->lineno);
2181345Sbill if (procp->entrypt) printf(" entrypoint");
2191345Sbill printf("\n");
2201345Sbill }
2211345Sbill }
2221345Sbill
2231345Sbill /*
2241345Sbill * display addr in data space using format desc or class s
2251345Sbill * type == 1 => use addr for value to print
2261345Sbill */
dispf(addr,desc,class,type,size,subflag,space)2271345Sbill dispf(addr, desc, class, type, size, subflag, space)
228*7775Srrh u_char class;
2291345Sbill char *desc; short type; ADDR addr; {
2301345Sbill dispx(addr, desc, class, type, size, subflag, DSP);
2311345Sbill printf("\n");
2321345Sbill }
2331345Sbill
2341345Sbill /* display addr in instruction space using format desc or class s */
2351345Sbill /* returns -1 if bad address */
dispi(addr,desc,class,type,size,subflag,space)2361345Sbill dispi(addr, desc, class, type, size, subflag, space)
237*7775Srrh u_char class;
2381345Sbill char *desc; short type; ADDR addr; {
2391345Sbill register i;
2401345Sbill i = dispx(addr, desc, class, type, size, subflag, ISP);
2411345Sbill printf("\n");
2421345Sbill return(i);
2431345Sbill }
2441345Sbill
2451345Sbill char pd[3];
dispx(addr,desc,class,type,size,subflag,space)2461345Sbill dispx(addr, desc, class, type, size, subflag, space)
247*7775Srrh u_char class;
2481345Sbill char *desc; short type; ADDR addr; {
2491345Sbill int i, sflag;
2501345Sbill char *p;
2511345Sbill char dlen, dfmt;
2521345Sbill long value;
2531345Sbill union {
2541345Sbill char c[WORDSIZE];
2551345Sbill int w;
2561345Sbill float f;
2571345Sbill } word;
2581345Sbill union {
2591345Sbill struct{
2601345Sbill int w1, w2;
2611345Sbill } ww;
2621345Sbill double d;
2631345Sbill } dbl;
2641345Sbill
2651345Sbill class &= STABMASK;
2661345Sbill if (desc[0] == '\0') desc = typetodesc(type, subflag);
2671345Sbill cpstr(odesc, desc);
2681345Sbill otype = type;
2691345Sbill oclass = class;
2701345Sbill oaddr = addr;
2711345Sbill oincr = 0;
2721345Sbill if (debug) printf("dispx(addr=%d,desc=%s,class=%d,type=%d,size=%d,subflg=%d,space=%d)\n",
2731345Sbill addr, desc, class, type, size, subflag, space);
2741345Sbill pd[0] = '%';
2751345Sbill pd[1] = dfmt = 'd';
2761345Sbill dlen = '\0';
2771345Sbill for (p = desc; *p; p++) {
2781345Sbill if (*p>= '0' && *p<'9') {
2791345Sbill size = readint(&p);
2801345Sbill p--;
2811345Sbill } else switch (*p) {
2821345Sbill case 'l':
2831345Sbill case 'h':
2841345Sbill case 'b':
2851345Sbill dlen = *p;
2861345Sbill break;
2871345Sbill
2881345Sbill case 'a':
2891345Sbill case 'c':
2901345Sbill case 'd':
2911345Sbill case 'f':
2921345Sbill case 'g':
2931345Sbill case 'i':
2941345Sbill case 'I':
2951345Sbill case 'o':
2961345Sbill case 'p':
2971345Sbill case 's':
2981345Sbill case 'u':
2991345Sbill case 'x':
3001345Sbill pd[1] = dfmt = *p;
3011345Sbill break;
3021345Sbill
3031345Sbill default:
3041345Sbill printf("Illegal descriptor: %c\n", *p);
3051345Sbill return(1);
3061345Sbill }
3071345Sbill }
3081345Sbill
3091345Sbill if (type == -1)
3101345Sbill value = addr;
3111345Sbill else if (class == N_RSYM && addr < 16) {
3121345Sbill /* MACHINE DEPENDENT */
3131345Sbill if ((addr > 0 && addr < 6) || addr > 11) {
3141345Sbill printf("Bad register var %d\n", addr);
3151345Sbill return(-1);
3161345Sbill }
3171345Sbill value = *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr);
3181345Sbill }
3191345Sbill else {
3201345Sbill value = getval(addr, dfmt == 'g' ? 'd' : dfmt, space);
3211345Sbill }
3221345Sbill
3231345Sbill if (errflg) {
3241345Sbill printf("%s", errflg);
3251345Sbill errflg = 0;
3261345Sbill return(-1);
3271345Sbill }
3281345Sbill
3291345Sbill switch (dfmt) {
3301345Sbill default:
3311345Sbill switch (dfmt) {
3321345Sbill case 'u':
3331345Sbill case 'x':
3341345Sbill case 'o':
3351345Sbill switch (dlen) {
3361345Sbill case 'h':
3371345Sbill value = (unsigned short) value;
3381345Sbill oincr = 2;
3391345Sbill break;
3401345Sbill case 'b':
3411345Sbill value = (unsigned char) value;
3421345Sbill oincr = 1;
3431345Sbill break;
3441345Sbill case 'l':
3451345Sbill value = (unsigned long) value;
3461345Sbill oincr = 4;
3471345Sbill break;
3481345Sbill default:
3491345Sbill oincr = WORDSIZE;
3501345Sbill break;
3511345Sbill }
3521345Sbill break;
3531345Sbill
3541345Sbill default:
3551345Sbill switch (dlen) {
3561345Sbill case 'h':
3571345Sbill value = (short) value;
3581345Sbill oincr = 2;
3591345Sbill break;
3601345Sbill case 'b':
3611345Sbill value = (char) value;
3621345Sbill oincr = 1;
3631345Sbill break;
3641345Sbill case 'l':
3651345Sbill value = (long) value;
3661345Sbill oincr = 4;
3671345Sbill break;
3681345Sbill default:
3691345Sbill oincr = WORDSIZE;
3701345Sbill break;
3711345Sbill }
3721345Sbill }
3731345Sbill if (dfmt == 'x' && (value > 9 || value < 0))
3741345Sbill printf("0x");
3751345Sbill else if (dfmt == 'o' && (value > 7 || value < 0))
3761345Sbill printf("0");
3771345Sbill printf(pd, value);
3781345Sbill return(1);
3791345Sbill
3801345Sbill case 'f':
3811345Sbill pd[1] = 'g';
3821345Sbill word.w = value;
3831345Sbill printf(pd, word.f);
3841345Sbill return(1);
3851345Sbill
3861345Sbill case 'g':
3871345Sbill dbl.ww.w1 = value;
388*7775Srrh dbl.ww.w2 = (class == N_RSYM) ?
3891345Sbill *(ADDR *)(((ADDR) &u)+R0+(WORDSIZE)*(addr+1)) :
3901345Sbill getval(addr+WORDSIZE, 'd', space);
3911345Sbill printf("%.13g", dbl.d);
3921345Sbill return(1);
3931345Sbill
3941345Sbill case 'p':
3951345Sbill printf("%s:%d", adrtoprocp(value)->pname,
3961345Sbill adrtolineno(value));
3971345Sbill return(1);
3981345Sbill
3991345Sbill case 's':
4001345Sbill addr = getindir(class, addr, type);
4011345Sbill goto aa;
4021345Sbill
4031345Sbill case 'c':
4041345Sbill if (size <= 1) {
4051345Sbill oincr = 1;
4061345Sbill printchar(value);
4071345Sbill return(1);
4081345Sbill } else
4091345Sbill goto aa;
4101345Sbill
4111345Sbill case 'a':
4121345Sbill aa: sflag = size == 0;
4131345Sbill if (sflag)
4141345Sbill size = 128; /* maximum length for s and a */
4151345Sbill else
4161345Sbill oincr = size;
4171345Sbill for (;;) {
4181345Sbill word.w = getval(addr, 'd', space);
4191345Sbill for (i=0; i<WORDSIZE; i++) {
4201345Sbill if (sflag && word.c[i] == 0)
4211345Sbill return(1);
4221345Sbill if (size-- == 0)
4231345Sbill return(1);
4241345Sbill printchar(word.c[i]);
4251345Sbill }
4261345Sbill addr += WORDSIZE;
4271345Sbill }
4281345Sbill break;
4291345Sbill
4301345Sbill case 'i':
4311345Sbill case 'I':
4321345Sbill value = chkget(dot, space);
4331345Sbill if (errflg) {
4341345Sbill printf("%s", errflg);
4351345Sbill errflg = 0;
4361345Sbill return(-1);
4371345Sbill }
4381345Sbill printins(dfmt, space, value);
4391345Sbill break;
4401345Sbill
4411345Sbill }
4421345Sbill return(1);
4431345Sbill }
4441345Sbill
4451345Sbill /* print variable as in prvar */
printit(metaflag,prvar,addr,desc,class,type,size,subflag,space)4461345Sbill printit(metaflag, prvar, addr, desc, class, type, size, subflag, space)
447*7775Srrh u_char class;
4481345Sbill char *desc; short type; ADDR addr; {
4491345Sbill if (prvar == 0)
4501345Sbill return;
4511345Sbill if (metaflag) {
4521345Sbill if (prvar == 1)
4531345Sbill printf("/ ");
4541345Sbill else
4551345Sbill printf("= ");
4561345Sbill }
4571345Sbill if (prvar == 1)
4581345Sbill dispf(addr, desc, class, type, size,
4591345Sbill subflag, space);
4601345Sbill else
4611345Sbill dispf(addr, desc, 0, -1, 0, 0, DSP);
4621345Sbill }
4631345Sbill
printchar(c)4641345Sbill printchar(c) {
4651345Sbill if ((c & 0177) < ' ')
4661345Sbill printf("^%c", c + ('A' - 1));
4671345Sbill else if ((c & 0177) == 0177)
4681345Sbill printf("^?");
4691345Sbill else
4701345Sbill printf("%c", c);
4711345Sbill }
4721345Sbill
4731345Sbill INT fcor;
printmap(s,amap)4741345Sbill printmap(s,amap)
4751345Sbill STRING s; MAP *amap;
4761345Sbill {
4771345Sbill int file;
4781345Sbill file=amap->ufd;
4791345Sbill printf("%s\t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
4801345Sbill printf("b1 = 0x%-16x",amap->b1);
4811345Sbill printf("e1 = 0x%-16x",amap->e1);
4821345Sbill printf("f1 = 0x%-x",amap->f1);
4831345Sbill printf("\nb2 = 0x%-16x",amap->b2);
4841345Sbill printf("e2 = 0x%-16x",amap->e2);
4851345Sbill printf("f2 = 0x%-x",amap->f2);
4861345Sbill printf("\n");
4871345Sbill }
4881345Sbill
4891345Sbill #define NUMREGS 24 /* number of hardware registers */
4901345Sbill REGLIST reglist[];
4911345Sbill
printregs()4921345Sbill printregs()
4931345Sbill {
4941345Sbill REG REGPTR p;
4951345Sbill
4961345Sbill for (p=reglist; p < ®list[NUMREGS/2]; p++) {
4971345Sbill printf("%4.4s/ ", p->rname);
4981345Sbill prhex12(*(ADDR *)(((ADDR)&u)+p->roffs));
4991345Sbill printf(" %4.4s/ ",(p+NUMREGS/2)->rname);
5001345Sbill prhex(*(ADDR *)(((ADDR)&u)+(p+NUMREGS/2)->roffs));
5011345Sbill printf("\n");
5021345Sbill }
5031345Sbill printpc();
5041345Sbill }
5051345Sbill
printpc()5061345Sbill printpc()
5071345Sbill {
5081345Sbill dot= *(ADDR *)(((ADDR)&u)+PC);
5091345Sbill prisploc();
5101345Sbill printins('i',ISP,chkget(dot,ISP));
5111345Sbill printf("\n");
5121345Sbill }
5131345Sbill
5141345Sbill /* print register */
5151345Sbill REGLIST reglist[];
regout(name,prvar,fmt)5161345Sbill regout(name, prvar, fmt)
5171345Sbill char *name, *fmt; {
5181345Sbill REG REGPTR p;
5191345Sbill for (p=reglist; p< ®list[24]; p++) {
5201345Sbill if (eqstr(name, p->rname)) {
5211345Sbill printit(0, prvar, *(ADDR *)(((ADDR)&u)+p->roffs),
5221345Sbill fmt[0] ? fmt : "d", N_GSYM, -1, 0, 0, DSP);
5231345Sbill return(p->roffs);
5241345Sbill }
5251345Sbill }
5261345Sbill error("Unknown register variable");
5271345Sbill return(-1);
5281345Sbill }
5291345Sbill /* Print symbolic location of dot */
prisploc()5301345Sbill prisploc() {
5311345Sbill struct proct *procp;
5321345Sbill int lineno;
5331345Sbill
5341345Sbill printf("0x%x", dot);
5351345Sbill procp = adrtoprocp(dot);
5361345Sbill if (procp != badproc) {
5371345Sbill printf(" (");
5381345Sbill prlnoff(procp, dot);
5391345Sbill printf("): \t");
5401345Sbill } else
5411345Sbill printf(": \t");
5421345Sbill }
543