148103Sbostic /*-
2*62122Sbostic * Copyright (c) 1980, 1993
3*62122Sbostic * The Regents of the University of California. All rights reserved.
448103Sbostic *
548103Sbostic * %sccs.include.redist.c%
622280Sdist */
75468Slinton
822280Sdist #ifndef lint
9*62122Sbostic static char sccsid[] = "@(#)status.c 8.1 (Berkeley) 06/06/93";
1048103Sbostic #endif /* not lint */
1148103Sbostic
125468Slinton /*
135468Slinton * Print out what's currently being traced by looking at
145468Slinton * the currently active breakpoints.
155468Slinton *
165468Slinton * The list is in LIFO order, we print it FIFO by going recursive.
175468Slinton */
185468Slinton
195468Slinton #include "defs.h"
205468Slinton #include "breakpoint.h"
215468Slinton #include "tree.h"
225468Slinton #include "sym.h"
235468Slinton #include "source.h"
245468Slinton #include "object.h"
255468Slinton #include "mappings.h"
265468Slinton #include "bp.rep"
275468Slinton
285468Slinton #define printnum(id) if (!isredirected()) printf("(%d) ", id)
295468Slinton
status()305468Slinton status()
315468Slinton {
325468Slinton if (bphead == NIL) {
335468Slinton if (!isredirected()) {
345468Slinton printf("no trace's or stop's active\n");
355468Slinton }
365468Slinton } else {
375468Slinton bpstatus(bphead);
385468Slinton }
395468Slinton }
405468Slinton
bpstatus(bp)415468Slinton LOCAL bpstatus(bp)
425468Slinton BPINFO *bp;
435468Slinton {
445468Slinton register BPINFO *p;
455468Slinton LINENO n;
465468Slinton SYM *s;
475468Slinton NODE *t;
485468Slinton char *trname, *stname;
495468Slinton
505468Slinton p = bp;
515468Slinton if (p->bpnext != NIL) {
525468Slinton bpstatus(p->bpnext);
535468Slinton }
545468Slinton t = p->bpnode;
555468Slinton if (p->bpline >= 0) {
565468Slinton n = linelookup(p->bpaddr);
575468Slinton trname = "trace";
585468Slinton stname = "stop";
595468Slinton } else {
605468Slinton n = p->bpaddr;
615468Slinton trname = "tracei";
625468Slinton stname = "stopi";
635468Slinton }
645468Slinton switch(p->bptype) {
655468Slinton case INST:
665468Slinton printnum(p->bpid);
675468Slinton printf("%s %d", trname, n);
685468Slinton break;
695468Slinton
705468Slinton case ALL_ON:
715468Slinton printnum(p->bpid);
725468Slinton printf("%s", trname);
735468Slinton s = p->bpblock;
745468Slinton if (s != program) {
755468Slinton printf(" in ");
765468Slinton printname(s);
775468Slinton }
785468Slinton break;
795468Slinton
805468Slinton case STOP_ON:
815468Slinton printnum(p->bpid);
825468Slinton printf("%s", stname);
835468Slinton if (t != NIL) {
845468Slinton printf(" ");
855468Slinton prtree(t);
865468Slinton }
875468Slinton s = p->bpblock;
885468Slinton if (s != program) {
895468Slinton printf(" in ");
905468Slinton printname(s);
915468Slinton }
925468Slinton break;
935468Slinton
945468Slinton case BLOCK_ON:
955468Slinton case TERM_ON:
965468Slinton s = p->bpblock;
975468Slinton printnum(p->bpid);
985468Slinton printf("%s ", trname);
995468Slinton prtree(t);
1005468Slinton if (s != program) {
1015468Slinton printf(" in ");
1025468Slinton printname(s);
1035468Slinton }
1045468Slinton break;
1055468Slinton
1065468Slinton case AT_BP:
1075468Slinton printnum(p->bpid);
1085468Slinton printf("%s ", trname);
1095468Slinton prtree(t);
1105468Slinton printf(" at %d", p->bpline);
1115468Slinton break;
1125468Slinton
1135468Slinton case STOP_BP:
1145468Slinton printnum(p->bpid);
1155468Slinton printf("%s", stname);
1165468Slinton if (t != NIL) {
1175468Slinton printf(" ");
1185468Slinton prtree(t);
1195468Slinton } else if ((s = p->bpblock) != NIL) {
1205468Slinton printf(" in ");
1215468Slinton printname(s);
1225468Slinton } else if (p->bpline > 0) {
1235468Slinton printf(" at %d", p->bpline);
1245468Slinton } else {
1255468Slinton printf(" at %d", p->bpaddr);
1265468Slinton }
1275468Slinton break;
1285468Slinton
1295468Slinton /*
1305468Slinton * Temporary breakpoints;
1315468Slinton * return rather than break to avoid printing newline.
1325468Slinton */
1335468Slinton case ALL_OFF:
1345468Slinton case CALL:
1355468Slinton case RETURN:
1365468Slinton case CALLPROC:
1375468Slinton case STOP_OFF:
1385468Slinton case BLOCK_OFF:
1395468Slinton case TERM_OFF:
1405468Slinton case END_BP:
1415468Slinton return;
1425468Slinton
1435468Slinton default:
1445468Slinton panic("bptype %d in bplist", p->bptype);
1455468Slinton }
1465468Slinton if (p->bpcond != NIL) {
1475468Slinton printf(" if ");
1485468Slinton prtree(p->bpcond);
1495468Slinton }
1505468Slinton printf("\n");
1515468Slinton }
1525468Slinton
1535468Slinton /*
1545468Slinton * Print the name of a symbol unambigously.
1555468Slinton */
1565468Slinton
printname(s)1575468Slinton LOCAL printname(s)
1585468Slinton SYM *s;
1595468Slinton {
1605468Slinton if (isambiguous(s)) {
1615468Slinton printwhich(s);
1625468Slinton } else {
1635468Slinton printf("%s", name(s));
1645468Slinton }
1655468Slinton }
166