1*48103Sbostic /*- 2*48103Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48103Sbostic * All rights reserved. 4*48103Sbostic * 5*48103Sbostic * %sccs.include.redist.c% 622281Sdist */ 75469Slinton 822281Sdist #ifndef lint 9*48103Sbostic static char sccsid[] = "@(#)trcond.c 5.2 (Berkeley) 04/16/91"; 10*48103Sbostic #endif /* not lint */ 115469Slinton 125469Slinton /* 135469Slinton * trace condition list -- a list of conditions that are to be 145469Slinton * checked before printing out the current source line or stopping. 155469Slinton */ 165469Slinton 175469Slinton #include "defs.h" 185469Slinton #include "breakpoint.h" 195469Slinton 205469Slinton typedef struct tr_cond_list { 215469Slinton TRTYPE trtype; 225469Slinton NODE *trace_condition; 235469Slinton struct tr_cond_list *next_condition; 245469Slinton } TR_COND_LIST; 255469Slinton 265469Slinton LOCAL TR_COND_LIST *cond_list; 275469Slinton 285469Slinton /* 295469Slinton * add a condition to be checked before giving single stepping information 305469Slinton */ 315469Slinton 325469Slinton addcond(trtype, p) 335469Slinton TRTYPE trtype; 345469Slinton NODE *p; 355469Slinton { 365469Slinton register TR_COND_LIST *c; 375469Slinton 385469Slinton if (p == NIL) { 395469Slinton return; 405469Slinton } 415469Slinton c = alloc(1, TR_COND_LIST); 425469Slinton c->trtype = trtype; 435469Slinton c->trace_condition = p; 445469Slinton c->next_condition = cond_list; 455469Slinton cond_list = c; 465469Slinton } 475469Slinton 485469Slinton /* 495469Slinton * delete a condition from the list 505469Slinton */ 515469Slinton 525469Slinton delcond(trtype, p) 535469Slinton TRTYPE trtype; 545469Slinton NODE *p; 555469Slinton { 565469Slinton register TR_COND_LIST *c, *last; 575469Slinton 585469Slinton if (p == NIL) { 595469Slinton return; 605469Slinton } 615469Slinton last = NIL; 625469Slinton for (c = cond_list; c != NIL; c = c->next_condition) { 635469Slinton if (c->trtype == trtype && c->trace_condition == p) { 645469Slinton break; 655469Slinton } 665469Slinton } 675469Slinton if (c == NIL) { 685469Slinton panic("tried to delete non-existent condition"); 695469Slinton } 705469Slinton if (last == NIL) { 715469Slinton cond_list = c->next_condition; 725469Slinton } else { 735469Slinton last->next_condition = c->next_condition; 745469Slinton } 755469Slinton free(c); 765469Slinton } 775469Slinton 785469Slinton /* 795469Slinton * Determine if any trace condition on the list is true. 805469Slinton * If the list is empty, return TRUE. 815469Slinton */ 825469Slinton 835469Slinton BOOLEAN trcond() 845469Slinton { 855469Slinton register TR_COND_LIST *c; 865469Slinton BOOLEAN foundcond; 875469Slinton 885469Slinton foundcond = FALSE; 895469Slinton for (c = cond_list; c != NIL; c = c->next_condition) { 905469Slinton if (c->trtype == TRPRINT) { 915469Slinton if (cond(c->trace_condition)) { 925469Slinton return(TRUE); 935469Slinton } else { 945469Slinton foundcond = TRUE; 955469Slinton } 965469Slinton } 975469Slinton } 985469Slinton return !foundcond; 995469Slinton } 1005469Slinton 1015469Slinton /* 1025469Slinton * Determine if any stop condition on the list is true. 1035469Slinton * If the list is empty, return FALSE. 1045469Slinton */ 1055469Slinton 1065469Slinton BOOLEAN stopcond() 1075469Slinton { 1085469Slinton register TR_COND_LIST *c; 1095469Slinton 1105469Slinton for (c = cond_list; c != NIL; c = c->next_condition) { 1115469Slinton if (c->trtype == TRSTOP && cond(c->trace_condition)) { 1125469Slinton return(TRUE); 1135469Slinton } 1145469Slinton } 1155469Slinton return FALSE; 1165469Slinton } 1175469Slinton 1185469Slinton /* 1195469Slinton * Free all existing breakpoints. 1205469Slinton * Trace conditions have been freed elsewhere. 1215469Slinton */ 1225469Slinton 1235469Slinton condfree() 1245469Slinton { 1255469Slinton TR_COND_LIST *c, *next; 1265469Slinton 1275469Slinton for (c = cond_list; c != NIL; c = next) { 1285469Slinton next = c->next_condition; 1295469Slinton dispose(c); 1305469Slinton } 1315469Slinton cond_list = NIL; 1325469Slinton } 133