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