|
|
1.1 ! root 1: #include "head.h" ! 2: #include <a.out.h> ! 3: #include "cdefs.h" ! 4: struct user u; ! 5: BKPTR bkpthead; ! 6: STRING errflg; ! 7: ! 8: /* ! 9: * outvar(): ! 10: * Prints named variable, recursing once for each structure member or ! 11: * subscript. ! 12: * proc:var: variable name ! 13: * fmt: print format ! 14: * metaflag: set iff var contains metacharacters * or ? ! 15: * addr: partial address of variable, initally 0 ! 16: * class: type class of variable ! 17: * subflag: number of levels of subscript indirection ! 18: * prnamep: pointer to end of partially formed print name of variable ! 19: * comblk: name of common block containing variable, if any ! 20: * prflag: as in findvar ! 21: * ! 22: * Here and elsewhere we assume that -1 is an invalid address, and ! 23: * its is used to indicate error. ! 24: */ ! 25: outvar(proc, var, fmt, metaflag, addr, class, subflag, prnamep, comblk, prflag) ! 26: ADDR addr; char *proc, *var, *fmt, class, *prnamep, *comblk; { ! 27: char *p, *q, *r, *oldpr; ! 28: register int match; ! 29: long soffset, goffset; ! 30: register ADDR newaddr = -1, arrowaddr; ! 31: register enum {INIT, ARROW, DOT} typeflag; ! 32: ! 33: switch (var[0]) { ! 34: case '\0': ! 35: if (prflag == 0) return(addr); ! 36: if (metaflag) { ! 37: if (comblk[0] && !(eqstr(comblk, "*"))) ! 38: printf("%.8s:%.8s", comblk, prname); ! 39: else if (proc[0]) ! 40: printf("%.8s:%.8s", proc, prname); ! 41: else ! 42: printf("%s", prname); ! 43: if (prflag == 1) ! 44: printf("/ "); ! 45: else ! 46: printf("= "); ! 47: } ! 48: if (prflag == 1) ! 49: dispf(addr, fmt, class, sl_type, sl_size, subflag); ! 50: else ! 51: dispf(addr, fmt, 0, -1, 0, 0); ! 52: return(addr); ! 53: ! 54: case '[': ! 55: *prnamep++ = *var++; ! 56: p = var; ! 57: for (;;) { ! 58: *prnamep++ = *var; ! 59: if (*var == '\0' || *var == ']') break; ! 60: var++; ! 61: } ! 62: newaddr = getindir(class, addr, sl_type); ! 63: newaddr += typetosize(sl_type, sl_size) * readint(&p); ! 64: return(outvar(proc, var+1, fmt, metaflag, newaddr, N_GSYM, ! 65: subflag+1, prnamep, comblk, prflag)); ! 66: ! 67: case '-': ! 68: case '>': ! 69: typeflag = ARROW; ! 70: while (eqany(*var, "->")) ! 71: *prnamep++ = *var++; ! 72: subflag++; ! 73: arrowaddr = getindir(class, addr, sl_type); ! 74: if (errflg) { ! 75: printf("%s\n", errflg); ! 76: errflg = 0; ! 77: return(0); ! 78: } ! 79: class = N_GSYM; ! 80: if (var[0] == '\0') { ! 81: p = var; ! 82: goto recurse; ! 83: } ! 84: break; ! 85: ! 86: case '.': ! 87: typeflag = DOT; ! 88: if (class == N_RSYM) { ! 89: error("Not with a register variable"); ! 90: return(0); ! 91: } ! 92: *prnamep++ = *var++; ! 93: subflag = 0; ! 94: break; ! 95: ! 96: default: ! 97: typeflag = INIT; ! 98: break; ! 99: } ! 100: ! 101: if (typeflag == INIT) { ! 102: soffset = proc[0] ? adrtostoffset(callpc-1) : -1; ! 103: goffset = proc[0] ? -1 : findfile(curfile)->stf_offset; ! 104: } else { ! 105: soffset = proc[0] ? adrtostoffset(callpc-1) : -1; ! 106: goffset = findfile(curfile)->stf_offset; ! 107: } ! 108: ! 109: p = var; ! 110: oldpr = prnamep; ! 111: while (!eqany(*p, "->.[") && *p != '\0') ! 112: *prnamep++ = *p++; ! 113: *prnamep = '\0'; ! 114: ! 115: match = 0; ! 116: slookinit(); ! 117: ! 118: for (;;) { ! 119: if (soffset != -1) ! 120: if ((soffset = slooknext(var, soffset, typeflag!=INIT, ! 121: comblk)) != -1) ! 122: goto found; ! 123: if (goffset != -1) ! 124: if ((goffset = globallookup(var, goffset, ! 125: typeflag!=INIT)) != -1) ! 126: goto found; ! 127: return(newaddr); ! 128: ! 129: found: ! 130: r = sl_name; ! 131: q = oldpr; ! 132: while (*r) *q++ = *r++; ! 133: *q ='\0'; ! 134: ! 135: switch(typeflag) { ! 136: case INIT: ! 137: class = sl_class & STABMASK; ! 138: if (!varclass(class) || class == N_SSYM) ! 139: goto l; ! 140: newaddr = (class == N_LSYM) ? -sl_addr : sl_addr; ! 141: newaddr = formaddr(class, newaddr); ! 142: break; ! 143: ! 144: case ARROW: ! 145: class = sl_class & STABMASK; ! 146: if (!varclass(class) || class != N_SSYM) ! 147: goto l; ! 148: newaddr = arrowaddr + sl_addr; ! 149: break; ! 150: ! 151: case DOT: ! 152: class = sl_class & STABMASK; ! 153: if (!varclass(class) || class != N_SSYM) ! 154: goto l; ! 155: newaddr = addr + sl_addr; ! 156: break; ! 157: } ! 158: ! 159: recurse: ! 160: newaddr = outvar(proc, p, fmt, metaflag, newaddr, ! 161: class, subflag, prnamep, comblk, prflag); ! 162: ! 163: if (!metaflag) ! 164: return(newaddr); ! 165: l:; } ! 166: } ! 167: ! 168: prdebug() { ! 169: register struct proct *procp; ! 170: register struct filet *filep; ! 171: ! 172: printf("dot=%d\n", dot); ! 173: printf("extstart = %d\n", extstart); ! 174: for(filep=files;filep->sfilename[0];filep++) ! 175: printf("%s offs %d @ %d flag %d addr 0x%x\n", filep->sfilename, filep->stf_offset, filep, filep->lineflag, filep->faddr); ! 176: for(procp=procs;procp->pname[0];procp++) { ! 177: printf("%8.8s addr 0x%x; offs %d; sfptr %d; line %d", ! 178: procp->pname, procp->paddr, procp->st_offset, ! 179: procp->sfptr, procp->lineno); ! 180: if (procp->entrypt) printf(" entrypoint"); ! 181: printf("\n"); ! 182: } ! 183: } ! 184: ! 185: /* display addr using format desc or class s */ ! 186: dispf(addr, desc, class, type, size, subflag) ! 187: char *desc; short type; ADDR addr; { ! 188: dispx(addr, desc, class, type, size, subflag); ! 189: printf("\n"); ! 190: } ! 191: ! 192: char pd[] = "%x"; ! 193: dispx(addr, desc, class, type, size, subflag) ! 194: char *desc; short type; ADDR addr; { ! 195: int i, sflag; ! 196: char *p; ! 197: char dlen, dfmt; ! 198: long value; ! 199: union { ! 200: struct { ! 201: char c[WORDSIZE]; ! 202: }; ! 203: struct { ! 204: int w; ! 205: }; ! 206: struct { ! 207: float f; ! 208: } ! 209: } word; ! 210: union { ! 211: struct{ ! 212: int w1, w2; ! 213: }; ! 214: struct { ! 215: double d; ! 216: }; ! 217: } dbl; ! 218: ! 219: class &= STABMASK; ! 220: if (desc[0] == '\0') desc = typetodesc(type, subflag); ! 221: cpstr(odesc, desc); ! 222: otype = type; ! 223: oclass = class; ! 224: oaddr = addr; ! 225: oincr = 0; ! 226: if (debug) printf("dispf(%d,%s,0%o,0%o)\n", addr,desc,class,type); ! 227: pd[1] = dfmt = 'd'; ! 228: dlen = '\0'; ! 229: for (p = desc; *p; p++) { ! 230: if (*p>= '0' && *p<'9') { ! 231: size = readint(&p); ! 232: p--; ! 233: } else switch (*p) { ! 234: case 'l': ! 235: case 'h': ! 236: case 'b': ! 237: dlen = *p; ! 238: break; ! 239: ! 240: case 'a': ! 241: case 'c': ! 242: case 'd': ! 243: case 'f': ! 244: case 'g': ! 245: case 'o': ! 246: case 'p': ! 247: case 's': ! 248: case 'u': ! 249: case 'x': ! 250: pd[1] = dfmt = *p; ! 251: break; ! 252: ! 253: default: ! 254: printf("Illegal descriptor: %c\n", *p); ! 255: return; ! 256: } ! 257: } ! 258: ! 259: if (type == -1) ! 260: value = addr; ! 261: else if (class == N_RSYM && addr < 16) { ! 262: /* MACHINE DEPENDENT */ ! 263: if ((addr > 0 && addr < 6) || addr > 11) { ! 264: printf("Bad register var %d\n", addr); ! 265: return; ! 266: } ! 267: value = *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr); ! 268: } ! 269: else { ! 270: value = getval(addr, dfmt == 'g' ? 'd' : dfmt); ! 271: } ! 272: ! 273: if (errflg) { ! 274: printf("%s", errflg); ! 275: errflg = 0; ! 276: return; ! 277: } ! 278: ! 279: switch (dfmt) { ! 280: default: ! 281: switch (dfmt) { ! 282: case 'u': ! 283: case 'x': ! 284: case 'o': ! 285: switch (dlen) { ! 286: case 'h': ! 287: value = (unsigned short) value; ! 288: oincr = 2; ! 289: break; ! 290: case 'b': ! 291: value = (unsigned char) value; ! 292: oincr = 1; ! 293: break; ! 294: case 'l': ! 295: value = (unsigned long) value; ! 296: oincr = 4; ! 297: break; ! 298: } ! 299: break; ! 300: ! 301: default: ! 302: switch (dlen) { ! 303: case 'h': ! 304: value = (short) value; ! 305: oincr = 2; ! 306: break; ! 307: case 'b': ! 308: value = (char) value; ! 309: oincr = 1; ! 310: break; ! 311: case 'l': ! 312: value = (long) value; ! 313: oincr = 4; ! 314: break; ! 315: } ! 316: } ! 317: if (value > 0) { ! 318: if (value > 9 && dfmt == 'x') ! 319: printf("0x"); ! 320: else if (value > 7 && dfmt == 'o') ! 321: printf("0"); ! 322: } ! 323: printf(pd, value); ! 324: return; ! 325: ! 326: case 'f': ! 327: pd[1] = 'g'; ! 328: word.w = value; ! 329: printf(pd, word.f); ! 330: return; ! 331: ! 332: case 'g': ! 333: dbl.w1 = value; ! 334: dbl.w2 = (class == (char) N_RSYM) ? ! 335: *(ADDR *)(((ADDR) &u)+R0+(WORDSIZE)*(addr+1)) : ! 336: getval(addr+WORDSIZE, 'd'); ! 337: printf("%.13g", dbl.d); ! 338: return; ! 339: ! 340: case 'p': ! 341: printf("%s:%d", adrtoprocp(value)->pname, ! 342: adrtolineno(value)); ! 343: return; ! 344: ! 345: case 's': ! 346: addr = getindir(class, addr, type); ! 347: goto aa; ! 348: ! 349: case 'c': ! 350: if (size <= 1) { ! 351: oincr = 1; ! 352: printchar(value); ! 353: return; ! 354: } else ! 355: goto aa; ! 356: ! 357: case 'a': ! 358: aa: sflag = size == 0; ! 359: if (sflag) ! 360: size = 128; /* maximum length for s and a */ ! 361: else ! 362: oincr = size; ! 363: for (;;) { ! 364: word.w = getval(addr, 'd'); ! 365: for (i=0; i<WORDSIZE; i++) { ! 366: if (sflag && word.c[i] == 0) ! 367: return; ! 368: if (size-- == 0) ! 369: return; ! 370: printchar(word.c[i]); ! 371: } ! 372: addr += WORDSIZE; ! 373: } ! 374: ! 375: } ! 376: } ! 377: ! 378: printchar(c) { ! 379: if ((c & 0177) < ' ') ! 380: printf("^%c", c + ('A' - 1)); ! 381: else if ((c & 0177) == 0177) ! 382: printf("^?"); ! 383: else ! 384: printf("%c", c); ! 385: } ! 386:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.