148103Sbostic /*-
2*62122Sbostic  * Copyright (c) 1980, 1993
3*62122Sbostic  *	The Regents of the University of California.  All rights reserved.
448103Sbostic  *
548103Sbostic  * %sccs.include.redist.c%
622277Sdist  */
75465Slinton 
822277Sdist #ifndef lint
9*62122Sbostic static char sccsid[] = "@(#)fixbps.c	8.1 (Berkeley) 06/06/93";
1048103Sbostic #endif /* not lint */
1148103Sbostic 
125465Slinton /*
135465Slinton  * fix up breakpoint information before continuing execution
145465Slinton  *
155465Slinton  * It's necessary to destroy breakpoints that were created temporarily
165465Slinton  * and still exist because the program terminated abnormally.
175465Slinton  */
185465Slinton 
195465Slinton #include "defs.h"
205465Slinton #include "breakpoint.h"
215465Slinton #include "bp.rep"
225465Slinton 
fixbps()235465Slinton fixbps()
245465Slinton {
255465Slinton 	register BPINFO *p, *last, *next;
265465Slinton 
275465Slinton 	last = NIL;
285465Slinton 	p = bphead;
295465Slinton 	while (p != NIL) {
305465Slinton 		next = p->bpnext;
315465Slinton 		switch(p->bptype) {
325465Slinton 			case ALL_OFF:
335465Slinton 				if (p->bpline >= 0) {
345465Slinton 					--tracing;
355465Slinton 				} else {
365465Slinton 					--inst_tracing;
375465Slinton 				}
385465Slinton 				if (p->bpcond != NIL) {
395465Slinton 					delcond(TRPRINT, p->bpcond);
405465Slinton 				}
415465Slinton 				goto delete;
425465Slinton 
435465Slinton 			case STOP_OFF:
445465Slinton 				var_tracing--;
455465Slinton 				delcond(TRSTOP, p->bpcond);
465465Slinton 				goto delete;
475465Slinton 
485465Slinton 			case TERM_OFF:
495465Slinton 				--var_tracing;
505465Slinton 				delvar(TRPRINT, p->bpnode, p->bpcond);
515465Slinton 				goto delete;
525465Slinton 
535465Slinton 			case CALL:
545465Slinton 			case RETURN:
555465Slinton 			case BLOCK_OFF:
565465Slinton 			case CALLPROC:
575465Slinton 			case END_BP:
585465Slinton 
595465Slinton 			delete:
605465Slinton 				if (last == NIL) {
615465Slinton 					bphead = next;
625465Slinton 				} else {
635465Slinton 					last->bpnext = next;
645465Slinton 				}
655465Slinton 				dispose(p);
665465Slinton 				break;
675465Slinton 
685465Slinton 			default:
695465Slinton 				last = p;
705465Slinton 				break;
715465Slinton 		}
725465Slinton 		p = next;
735465Slinton 	}
745465Slinton 	tracing = 0;
755465Slinton 	var_tracing = 0;
765465Slinton 	inst_tracing = 0;
775465Slinton 	trfree();
785465Slinton 	condfree();
795465Slinton }
80