+
+/*
+ * address to external name
+ * returns difference between addr and address of external
+ * name returned in sl_name
+ */
+adrtoext(addr)
+ADDR addr; {
+ struct nlist stentry;
+ register int i, prevdiff = MAXPOS, diff;
+
+ blseek(&sbuf, extstart, 0);
+ for (;;) {
+ if (bread(&sbuf, &stentry, sizeof stentry)
+ < sizeof stentry)
+ return (prevdiff!=MAXPOS ? prevdiff : -1);
+ if (stentry.n_type == (N_DATA | N_EXT) ||
+ stentry.n_type == (N_BSS | N_EXT)) {
+ diff = addr - stentry.n_value;
+ if (diff >= 0 && diff < prevdiff) {
+#ifndef FLEXNAMES
+ for (i=0; i<7; i++)
+ sl_name[i] = stentry.n_un.n_name[i+1];
+#else
+ sl_name = stentry.n_un.n_name;
+#endif
+ if (diff == 0)
+ return(0);
+ prevdiff = diff;
+ }
+ }
+ }
+}
+
+/*
+ * address to local name in procp
+ * returns difference between addr and address of local
+ * returned in sl_name
+ */
+adrtolocal(addr, procp)
+ADDR addr; struct proct *procp; {
+ struct nlist stentry;
+ register int i, prevdiff = MAXPOS, diff;
+
+ blseek(&sbuf, procp->st_offset + sizeof stentry, 0);
+ for (;;) {
+ if (bread(&sbuf, &stentry, sizeof stentry)
+ < sizeof stentry)
+ return(prevdiff!=MAXPOS ? prevdiff : -1);
+ if (stentry.n_type == N_FUN)
+ return(prevdiff!=MAXPOS ? prevdiff : -1);
+ if (stentry.n_type == N_LSYM) {
+ diff = addr - stentry.n_value;
+ if (diff >= 0 && diff < prevdiff) {
+#ifndef FLEXNAMES
+ for (i=0; i<8; i++)
+ sl_name[i] = stentry.n_un.n_name[i];
+#else
+ sl_name = stentry.n_un.n_name;
+#endif
+ if (diff == 0)
+ return(0);
+ prevdiff = diff;
+ }
+ }
+ }
+}
+
+/*
+ * address to parameter name in procp
+ * returns difference between addr and address of local
+ * returned in sl_name
+ */
+adrtoparam(addr, procp)
+ADDR addr; struct proct *procp; {
+ struct nlist stentry;
+ register int i, prevdiff = MAXPOS, diff;
+
+ blseek(&sbuf, procp->st_offset + sizeof stentry, 0);
+ for (;;) {
+ if (bread(&sbuf, &stentry, sizeof stentry)
+ < sizeof stentry)
+ return(prevdiff!=MAXPOS ? prevdiff : -1);
+ if (stentry.n_type == N_FUN)
+ return(prevdiff!=MAXPOS ? prevdiff : -1);
+ if (stentry.n_type == N_PSYM) {
+ diff = addr - stentry.n_value;
+ if (diff >= 0 && diff < prevdiff) {
+#ifndef FLEXNAMES
+ for (i=0; i<8; i++)
+ sl_name[i] = stentry.n_un.n_name[i];
+#else
+ sl_name = stentry.n_un.n_name;
+#endif
+ if (diff == 0)
+ return(0);
+ prevdiff = diff;
+ }
+ }
+ }
+}
+
+/*
+ * register number to register variable name in procp
+ * returned in sl_name
+ */
+adrtoregvar(regno, procp)
+ADDR regno; struct proct *procp; {
+ struct nlist stentry;
+ register int i;
+
+ blseek(&sbuf, procp->st_offset + sizeof stentry, 0);
+ for (;;) {
+ if (bread(&sbuf, &stentry, sizeof stentry)
+ < sizeof stentry) return(-1);
+ if (stentry.n_type == N_FUN)
+ return(-1);
+ if (stentry.n_type == N_RSYM) {
+ if (stentry.n_value == regno) {
+#ifndef FLEXNAMES
+ for (i=0; i<8; i++)
+ sl_name[i] = stentry.n_un.n_name[i];
+#else
+ sl_name = stentry.n_un.n_name;
+#endif
+ return(0);
+ }
+ }
+ }
+}
+
+/* sets file map for M command */
+setmap(s)
+char *s; {
+ union {
+ MAP *m;
+ L_INT *mp;
+ } amap;
+ int starflag = 0;
+
+ amap.mp = 0;
+ for (; *s; s++) {
+ switch (*s) {
+ case '/':
+ amap.m = &datmap;
+ break;
+ case '?':
+ amap.m = &txtmap;
+ break;
+ case '*':
+ starflag++;
+ break;
+ default:
+ goto sout;
+ }
+ }
+
+sout: if (amap.mp == 0) {
+ error("Map `?' or `/' must be specified");
+ return;
+ }
+ if (starflag)
+ amap.mp += 3;
+ for (; *s; s++) {
+ if (*s >= '0' && *s <= '9')
+ *(amap.mp)++ = readint(&s);
+ }
+}