1*5468Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5468Slinton 
3*5468Slinton static char sccsid[] = "@(#)status.c 1.1 01/18/82";
4*5468Slinton 
5*5468Slinton /*
6*5468Slinton  * Print out what's currently being traced by looking at
7*5468Slinton  * the currently active breakpoints.
8*5468Slinton  *
9*5468Slinton  * The list is in LIFO order, we print it FIFO by going recursive.
10*5468Slinton  */
11*5468Slinton 
12*5468Slinton #include "defs.h"
13*5468Slinton #include "breakpoint.h"
14*5468Slinton #include "tree.h"
15*5468Slinton #include "sym.h"
16*5468Slinton #include "source.h"
17*5468Slinton #include "object.h"
18*5468Slinton #include "mappings.h"
19*5468Slinton #include "bp.rep"
20*5468Slinton 
21*5468Slinton #define printnum(id)	if (!isredirected()) printf("(%d) ", id)
22*5468Slinton 
23*5468Slinton status()
24*5468Slinton {
25*5468Slinton 	if (bphead == NIL) {
26*5468Slinton 		if (!isredirected()) {
27*5468Slinton 			printf("no trace's or stop's active\n");
28*5468Slinton 		}
29*5468Slinton 	} else {
30*5468Slinton 		bpstatus(bphead);
31*5468Slinton 	}
32*5468Slinton }
33*5468Slinton 
34*5468Slinton LOCAL bpstatus(bp)
35*5468Slinton BPINFO *bp;
36*5468Slinton {
37*5468Slinton 	register BPINFO *p;
38*5468Slinton 	LINENO n;
39*5468Slinton 	SYM *s;
40*5468Slinton 	NODE *t;
41*5468Slinton 	char *trname, *stname;
42*5468Slinton 
43*5468Slinton 	p = bp;
44*5468Slinton 	if (p->bpnext != NIL) {
45*5468Slinton 		bpstatus(p->bpnext);
46*5468Slinton 	}
47*5468Slinton 	t = p->bpnode;
48*5468Slinton 	if (p->bpline >= 0) {
49*5468Slinton 		n = linelookup(p->bpaddr);
50*5468Slinton 		trname = "trace";
51*5468Slinton 		stname = "stop";
52*5468Slinton 	} else {
53*5468Slinton 		n = p->bpaddr;
54*5468Slinton 		trname = "tracei";
55*5468Slinton 		stname = "stopi";
56*5468Slinton 	}
57*5468Slinton 	switch(p->bptype) {
58*5468Slinton 		case INST:
59*5468Slinton 			printnum(p->bpid);
60*5468Slinton 			printf("%s %d", trname, n);
61*5468Slinton 			break;
62*5468Slinton 
63*5468Slinton 		case ALL_ON:
64*5468Slinton 			printnum(p->bpid);
65*5468Slinton 			printf("%s", trname);
66*5468Slinton 			s = p->bpblock;
67*5468Slinton 			if (s != program) {
68*5468Slinton 				printf(" in ");
69*5468Slinton 				printname(s);
70*5468Slinton 			}
71*5468Slinton 			break;
72*5468Slinton 
73*5468Slinton 		case STOP_ON:
74*5468Slinton 			printnum(p->bpid);
75*5468Slinton 			printf("%s", stname);
76*5468Slinton 			if (t != NIL) {
77*5468Slinton 				printf(" ");
78*5468Slinton 				prtree(t);
79*5468Slinton 			}
80*5468Slinton 			s = p->bpblock;
81*5468Slinton 			if (s != program) {
82*5468Slinton 				printf(" in ");
83*5468Slinton 				printname(s);
84*5468Slinton 			}
85*5468Slinton 			break;
86*5468Slinton 
87*5468Slinton 		case BLOCK_ON:
88*5468Slinton 		case TERM_ON:
89*5468Slinton 			s = p->bpblock;
90*5468Slinton 			printnum(p->bpid);
91*5468Slinton 			printf("%s ", trname);
92*5468Slinton 			prtree(t);
93*5468Slinton 			if (s != program) {
94*5468Slinton 				printf(" in ");
95*5468Slinton 				printname(s);
96*5468Slinton 			}
97*5468Slinton 			break;
98*5468Slinton 
99*5468Slinton 		case AT_BP:
100*5468Slinton 			printnum(p->bpid);
101*5468Slinton 			printf("%s ", trname);
102*5468Slinton 			prtree(t);
103*5468Slinton 			printf(" at %d", p->bpline);
104*5468Slinton 			break;
105*5468Slinton 
106*5468Slinton 		case STOP_BP:
107*5468Slinton 			printnum(p->bpid);
108*5468Slinton 			printf("%s", stname);
109*5468Slinton 			if (t != NIL) {
110*5468Slinton 				printf(" ");
111*5468Slinton 				prtree(t);
112*5468Slinton 			} else if ((s = p->bpblock) != NIL) {
113*5468Slinton 				printf(" in ");
114*5468Slinton 				printname(s);
115*5468Slinton 			} else if (p->bpline > 0) {
116*5468Slinton 				printf(" at %d", p->bpline);
117*5468Slinton 			} else {
118*5468Slinton 				printf(" at %d", p->bpaddr);
119*5468Slinton 			}
120*5468Slinton 			break;
121*5468Slinton 
122*5468Slinton 		/*
123*5468Slinton 		 * Temporary breakpoints;
124*5468Slinton 		 * return rather than break to avoid printing newline.
125*5468Slinton 		 */
126*5468Slinton 		case ALL_OFF:
127*5468Slinton 		case CALL:
128*5468Slinton 		case RETURN:
129*5468Slinton 		case CALLPROC:
130*5468Slinton 		case STOP_OFF:
131*5468Slinton 		case BLOCK_OFF:
132*5468Slinton 		case TERM_OFF:
133*5468Slinton 		case END_BP:
134*5468Slinton 			return;
135*5468Slinton 
136*5468Slinton 		default:
137*5468Slinton 			panic("bptype %d in bplist", p->bptype);
138*5468Slinton 	}
139*5468Slinton 	if (p->bpcond != NIL) {
140*5468Slinton 		printf(" if ");
141*5468Slinton 		prtree(p->bpcond);
142*5468Slinton 	}
143*5468Slinton 	printf("\n");
144*5468Slinton }
145*5468Slinton 
146*5468Slinton /*
147*5468Slinton  * Print the name of a symbol unambigously.
148*5468Slinton  */
149*5468Slinton 
150*5468Slinton LOCAL printname(s)
151*5468Slinton SYM *s;
152*5468Slinton {
153*5468Slinton 	if (isambiguous(s)) {
154*5468Slinton 		printwhich(s);
155*5468Slinton 	} else {
156*5468Slinton 		printf("%s", name(s));
157*5468Slinton 	}
158*5468Slinton }
159