modifications for centralizing the printing of a source line
[unix-history] / usr / src / usr.bin / pascal / pdx / breakpoint / trinfo.c
CommitLineData
d7c044cc
ML
1/* Copyright (c) 1982 Regents of the University of California */
2
e0ce5d75 3static char sccsid[] = "@(#)trinfo.c 1.2 %G%";
d7c044cc
ML
4
5/*
6 * Trace information management.
7 *
8 * The trace information is a list of variables that are being
9 * traced or whose value changing should cause a stop.
10 */
11
12#include "defs.h"
13#include "breakpoint.h"
14#include "process.h"
15#include "machine.h"
16#include "sym.h"
17#include "tree.h"
18#include "source.h"
19#include "object.h"
20#include "tree/tree.rep"
21
22/*
23 * When tracing variables we keep a copy of their most recent value
24 * and compare it to the current one each time a breakpoint occurs.
25 * MAXTRSIZE is the maximum size variable we allow.
26 */
27
28#define MAXTRSIZE 512
29
30/*
31 * The tracing structure is a list of information about all the
32 * variables that are being traced.
33 */
34
35typedef struct trinfo {
e0ce5d75
ML
36 TRTYPE trtype;
37 ADDRESS traddr;
38 SYM *trblock;
39 NODE *trvar;
40 NODE *trcond;
41 char *trvalue;
42 struct trinfo *trnext;
d7c044cc
ML
43} TRINFO;
44
45LOCAL TRINFO *trhead;
46
47/*
48 * add a variable to be traced
49 */
50
51addvar(trtype, node, cond)
52TRTYPE trtype;
53NODE *node;
54NODE *cond;
55{
e0ce5d75
ML
56 register TRINFO *tp;
57
58 tp = alloc(1, TRINFO);
59 tp->trtype = trtype;
60 tp->traddr = (ADDRESS) -1;
61 tp->trblock = curfunc;
62 tp->trvar = node;
63 tp->trcond = cond;
64 tp->trvalue = NIL;
65 tp->trnext = trhead;
66 trhead = tp;
d7c044cc
ML
67}
68
69/*
70 * remove a variable from the trace list
71 */
72
73delvar(trtype, node, cond)
74TRTYPE trtype;
75NODE *node;
76NODE *cond;
77{
e0ce5d75
ML
78 register TRINFO *tp, *last;
79
80 last = NIL;
81 for (tp = trhead; tp != NIL; tp = tp->trnext) {
82 if (tp->trtype == trtype &&
83 tr_equal(tp->trvar, node) &&
84 tr_equal(tp->trcond, cond)) {
85 break;
d7c044cc 86 }
e0ce5d75
ML
87 }
88 if (tp == NIL) {
89 trerror("can't delete term %t", node);
90 }
91 if (last == NIL) {
92 trhead = tp->trnext;
93 } else {
94 last->trnext = tp->trnext;
95 }
96 if (tp->trvalue != NIL) {
97 free(tp->trvalue);
98 }
99 free(tp);
d7c044cc
ML
100}
101
102/*
103 * Print out any news about variables in the list whose
104 * values have changed.
105 */
106
107prvarnews()
108{
e0ce5d75
ML
109 register TRINFO *tp;
110 register NODE *p;
111 register int n;
112 SYM *s;
113 char buff[MAXTRSIZE];
114 static LINENO prevline;
115
116 for (tp = trhead; tp != NIL; tp = tp->trnext) {
117 if (tp->trcond != NIL && !cond(tp->trcond)) {
118 continue;
119 }
120 s = curfunc;
121 while (s != NIL && s != tp->trblock) {
122 s = container(s);
d7c044cc 123 }
e0ce5d75
ML
124 if (s == NIL) {
125 continue;
126 }
127 p = tp->trvar;
128 if (tp->traddr == (ADDRESS) -1) {
129 tp->traddr = lval(p->left);
130 }
131 n = size(p->nodetype);
132 dread(buff, tp->traddr, n);
133 if (tp->trvalue == NIL) {
134 tp->trvalue = alloc(n, char);
135 mov(buff, tp->trvalue, n);
136 mov(buff, sp, n);
137 sp += n;
138 if (tp->trtype == TRPRINT) {
139 printf("initially (at ");
140 printwhere(curline, srcfilename(pc));
141 printf("):\t");
142 prtree(p);
143 printf(" = ");
144 printval(p->nodetype);
145 putchar('\n');
146 }
147 } else if (cmp(tp->trvalue, buff, n) != 0) {
148 mov(buff, tp->trvalue, n);
149 mov(buff, sp, n);
150 sp += n;
151 printf("after ");
152 printwhere(prevline, srcfilename(pc));
153 printf(":\t");
154 prtree(p);
155 printf(" = ");
156 printval(p->nodetype);
157 putchar('\n');
158 if (tp->trtype == TRSTOP) {
159 isstopped = TRUE;
160 curline = srcline(pc);
161 printstatus();
162 }
163 }
164 }
165 prevline = curline;
d7c044cc
ML
166}
167
168/*
169 * Free the table. Note that trvar and trcond fields are not freed,
170 * this is because they are the same as in the breakpoint table and
171 * are freed by the bpfree routine.
172 */
173
174trfree()
175{
e0ce5d75
ML
176 register TRINFO *tp, *next;
177
178 for (tp = trhead; tp != NIL; tp = next) {
179 next = tp->trnext;
180 if (tp->trvalue != NIL) {
181 free(tp->trvalue);
d7c044cc 182 }
e0ce5d75
ML
183 free(tp);
184 }
185 trhead = NIL;
d7c044cc 186}