1*5469Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5469Slinton 
3*5469Slinton static char sccsid[] = "@(#)trcond.c 1.1 01/18/82";
4*5469Slinton 
5*5469Slinton /*
6*5469Slinton  * trace condition list -- a list of conditions that are to be
7*5469Slinton  * checked before printing out the current source line or stopping.
8*5469Slinton  */
9*5469Slinton 
10*5469Slinton #include "defs.h"
11*5469Slinton #include "breakpoint.h"
12*5469Slinton 
13*5469Slinton typedef struct tr_cond_list {
14*5469Slinton 	TRTYPE trtype;
15*5469Slinton 	NODE *trace_condition;
16*5469Slinton 	struct tr_cond_list *next_condition;
17*5469Slinton } TR_COND_LIST;
18*5469Slinton 
19*5469Slinton LOCAL TR_COND_LIST *cond_list;
20*5469Slinton 
21*5469Slinton /*
22*5469Slinton  * add a condition to be checked before giving single stepping information
23*5469Slinton  */
24*5469Slinton 
25*5469Slinton addcond(trtype, p)
26*5469Slinton TRTYPE trtype;
27*5469Slinton NODE *p;
28*5469Slinton {
29*5469Slinton 	register TR_COND_LIST *c;
30*5469Slinton 
31*5469Slinton 	if (p == NIL) {
32*5469Slinton 		return;
33*5469Slinton 	}
34*5469Slinton 	c = alloc(1, TR_COND_LIST);
35*5469Slinton 	c->trtype = trtype;
36*5469Slinton 	c->trace_condition = p;
37*5469Slinton 	c->next_condition = cond_list;
38*5469Slinton 	cond_list = c;
39*5469Slinton }
40*5469Slinton 
41*5469Slinton /*
42*5469Slinton  * delete a condition from the list
43*5469Slinton  */
44*5469Slinton 
45*5469Slinton delcond(trtype, p)
46*5469Slinton TRTYPE trtype;
47*5469Slinton NODE *p;
48*5469Slinton {
49*5469Slinton 	register TR_COND_LIST *c, *last;
50*5469Slinton 
51*5469Slinton 	if (p == NIL) {
52*5469Slinton 		return;
53*5469Slinton 	}
54*5469Slinton 	last = NIL;
55*5469Slinton 	for (c = cond_list; c != NIL; c = c->next_condition) {
56*5469Slinton 		if (c->trtype == trtype && c->trace_condition == p) {
57*5469Slinton 			break;
58*5469Slinton 		}
59*5469Slinton 	}
60*5469Slinton 	if (c == NIL) {
61*5469Slinton 		panic("tried to delete non-existent condition");
62*5469Slinton 	}
63*5469Slinton 	if (last == NIL) {
64*5469Slinton 		cond_list = c->next_condition;
65*5469Slinton 	} else {
66*5469Slinton 		last->next_condition = c->next_condition;
67*5469Slinton 	}
68*5469Slinton 	free(c);
69*5469Slinton }
70*5469Slinton 
71*5469Slinton /*
72*5469Slinton  * Determine if any trace condition on the list is true.
73*5469Slinton  * If the list is empty, return TRUE.
74*5469Slinton  */
75*5469Slinton 
76*5469Slinton BOOLEAN trcond()
77*5469Slinton {
78*5469Slinton 	register TR_COND_LIST *c;
79*5469Slinton 	BOOLEAN foundcond;
80*5469Slinton 
81*5469Slinton 	foundcond = FALSE;
82*5469Slinton 	for (c = cond_list; c != NIL; c = c->next_condition) {
83*5469Slinton 		if (c->trtype == TRPRINT) {
84*5469Slinton 			if (cond(c->trace_condition)) {
85*5469Slinton 				return(TRUE);
86*5469Slinton 			} else {
87*5469Slinton 				foundcond = TRUE;
88*5469Slinton 			}
89*5469Slinton 		}
90*5469Slinton 	}
91*5469Slinton 	return !foundcond;
92*5469Slinton }
93*5469Slinton 
94*5469Slinton /*
95*5469Slinton  * Determine if any stop condition on the list is true.
96*5469Slinton  * If the list is empty, return FALSE.
97*5469Slinton  */
98*5469Slinton 
99*5469Slinton BOOLEAN stopcond()
100*5469Slinton {
101*5469Slinton 	register TR_COND_LIST *c;
102*5469Slinton 
103*5469Slinton 	for (c = cond_list; c != NIL; c = c->next_condition) {
104*5469Slinton 		if (c->trtype == TRSTOP && cond(c->trace_condition)) {
105*5469Slinton 			return(TRUE);
106*5469Slinton 		}
107*5469Slinton 	}
108*5469Slinton 	return FALSE;
109*5469Slinton }
110*5469Slinton 
111*5469Slinton /*
112*5469Slinton  * Free all existing breakpoints.
113*5469Slinton  * Trace conditions have been freed elsewhere.
114*5469Slinton  */
115*5469Slinton 
116*5469Slinton condfree()
117*5469Slinton {
118*5469Slinton 	TR_COND_LIST *c, *next;
119*5469Slinton 
120*5469Slinton 	for (c = cond_list; c != NIL; c = next) {
121*5469Slinton 		next = c->next_condition;
122*5469Slinton 		dispose(c);
123*5469Slinton 	}
124*5469Slinton 	cond_list = NIL;
125*5469Slinton }
126