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