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