+
+
+/* print breakpoints */
+prbkpt() {
+ register BKPTR bkptr;
+ register int cnt;
+ char *cmdp;
+
+ cnt = 0;
+
+ for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
+ if (bkptr->flag) {
+ cnt++;
+ printbkpt("", adrtoprocp(bkptr->loc)->pname,
+ adrtolineno(bkptr->loc));
+ cmdp = bkptr->comm;
+ if (*cmdp != '\n') {
+ printf(" <");
+ while (*cmdp != '\n')
+ printf("%c", *cmdp++);
+ printf(">\n");
+ }
+ else
+ printf("\n");
+ }
+ if (cnt == 0)
+ printf("No breakpoints set\n");
+}
+
+/* interactively delete breakpoints */
+
+idbkpt() {
+ register BKPTR bkptr;
+ register int yesflg, cnt;
+ register char c;
+
+ cnt = 0;
+
+ for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
+ if (bkptr->flag) {
+ printbkpt(" ? ", adrtoprocp(bkptr->loc)->pname,
+ adrtolineno(bkptr->loc));
+ yesflg = 0;
+ cnt++;
+ do {
+ c = getchar();
+ if (c == 'y' || c == 'd') yesflg++;
+ } while (c != '\n');
+ if (yesflg)
+ bkptr->flag = 0;
+ }
+ if (cnt == 0)
+ printf("No breakpoints set\n");
+}
+
+/* delete all breakpoints */
+
+dabkpt() {
+ register BKPTR bkptr;
+
+ for (bkptr = bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
+ bkptr->flag = 0;
+}
+printbkpt(s, name, lineno)
+char *s, *name; {
+ if (name[0] == '_')
+ printf("%.7s:", name+1);
+ else
+ printf("%.8s:", name);
+
+ if (lineno != -1)
+ printf("%d%s", lineno, s);
+ else
+ printf("%s", s);
+}
+
+/* print call frame */
+prframe() {
+ prfrx(0);
+}
+
+/* set top to print just the top procedure */
+prfrx(top) {
+ int narg;
+ long offset;
+ register char class;
+ register int endflg;
+ char *p;
+ struct proct *procp;
+ struct nlist stentry;
+
+ if ((procp = initframe()) == badproc) return;
+ do {
+ if (get(frame+12, DSP) == 0) return;
+ p = procp->pname;
+ if (eqstr("__dbsubc", p)) return;
+ if (p[0] == '_') {
+ endflg = 1;
+ printf("%.7s(", p+1);
+ }
+ else {
+ printf("%.8s(", p);
+ endflg = 0;
+ }
+ if (endflg == 0) {
+ offset = procp->st_offset;
+ blseek(&sbuf, offset, 0);
+ do {
+ if (bread(&sbuf, &stentry, sizeof stentry) <
+ sizeof stentry) {
+ endflg++;
+ break;
+ }
+ class = stentry.n_type & STABMASK;
+ } while (class == N_FUN);
+ while (class != N_PSYM) {
+ if (bread(&sbuf, &stentry, sizeof stentry) <
+ sizeof stentry) {
+ endflg++;
+ break;
+ }
+ class = stentry.n_type & STABMASK;
+ if (class == N_FUN) {
+ endflg++;
+ break;
+ }
+ }
+ }
+
+ narg = get(argp, DSP);
+ if (narg & ~0xff) narg = 0;
+ argp += WORDSIZE;
+ while (narg) {
+ if (endflg) {
+ printf("%d", get(argp, DSP));
+ argp += 4;
+ } else {
+ int length;
+ printf("%.8s=", stentry.n_name);
+ dispx(argp, "", N_GSYM, stentry.n_desc, 0, 0);
+ length = typetosize(stentry.n_desc, 0);
+ if (length > WORDSIZE)
+ argp += length;
+ else
+ argp += WORDSIZE;
+ }
+ do {
+ if (endflg) break;
+ if (bread(&sbuf, &stentry, sizeof stentry) <
+ sizeof stentry) {
+ endflg++;
+ break;
+ }
+ class = stentry.n_type & STABMASK;
+ if (class == N_FUN) {
+ endflg++;
+ break;
+ }
+ } while (class != N_PSYM);
+ l1: if (--narg != 0) printf(",");
+ }
+ printf(")");
+ if (debug) printf(" @ 0x%x ", callpc);
+ if (procp->sfptr != badfile)
+ printf(" [%s:%d]", adrtofilep(callpc-1)->sfilename,
+ adrtolineno(callpc-1));
+ printf("\n");
+ } while (((procp = nextframe()) != badproc) && !top);
+}
+
+STRING signals[] = {
+ "",
+ "hangup",
+ "interrupt",
+ "quit",
+ "illegal instruction",
+ "trace/BPT",
+ "IOT",
+ "EMT",
+ "floating exception",
+ "killed",
+ "bus error",
+ "memory fault",
+ "bad system call",
+ "broken pipe",
+ "alarm call",
+ "terminated",
+};
+INT signo;
+
+sigprint() {
+ printf("%s", signals[signo]);
+}
+