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