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