1 /* Copyright (c) 1982 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)trcond.c 1.1 01/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 } 126