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%
622280Sdist  */
75468Slinton 
822280Sdist #ifndef lint
9*62122Sbostic static char sccsid[] = "@(#)status.c	8.1 (Berkeley) 06/06/93";
1048103Sbostic #endif /* not lint */
1148103Sbostic 
125468Slinton /*
135468Slinton  * Print out what's currently being traced by looking at
145468Slinton  * the currently active breakpoints.
155468Slinton  *
165468Slinton  * The list is in LIFO order, we print it FIFO by going recursive.
175468Slinton  */
185468Slinton 
195468Slinton #include "defs.h"
205468Slinton #include "breakpoint.h"
215468Slinton #include "tree.h"
225468Slinton #include "sym.h"
235468Slinton #include "source.h"
245468Slinton #include "object.h"
255468Slinton #include "mappings.h"
265468Slinton #include "bp.rep"
275468Slinton 
285468Slinton #define printnum(id)	if (!isredirected()) printf("(%d) ", id)
295468Slinton 
status()305468Slinton status()
315468Slinton {
325468Slinton 	if (bphead == NIL) {
335468Slinton 		if (!isredirected()) {
345468Slinton 			printf("no trace's or stop's active\n");
355468Slinton 		}
365468Slinton 	} else {
375468Slinton 		bpstatus(bphead);
385468Slinton 	}
395468Slinton }
405468Slinton 
bpstatus(bp)415468Slinton LOCAL bpstatus(bp)
425468Slinton BPINFO *bp;
435468Slinton {
445468Slinton 	register BPINFO *p;
455468Slinton 	LINENO n;
465468Slinton 	SYM *s;
475468Slinton 	NODE *t;
485468Slinton 	char *trname, *stname;
495468Slinton 
505468Slinton 	p = bp;
515468Slinton 	if (p->bpnext != NIL) {
525468Slinton 		bpstatus(p->bpnext);
535468Slinton 	}
545468Slinton 	t = p->bpnode;
555468Slinton 	if (p->bpline >= 0) {
565468Slinton 		n = linelookup(p->bpaddr);
575468Slinton 		trname = "trace";
585468Slinton 		stname = "stop";
595468Slinton 	} else {
605468Slinton 		n = p->bpaddr;
615468Slinton 		trname = "tracei";
625468Slinton 		stname = "stopi";
635468Slinton 	}
645468Slinton 	switch(p->bptype) {
655468Slinton 		case INST:
665468Slinton 			printnum(p->bpid);
675468Slinton 			printf("%s %d", trname, n);
685468Slinton 			break;
695468Slinton 
705468Slinton 		case ALL_ON:
715468Slinton 			printnum(p->bpid);
725468Slinton 			printf("%s", trname);
735468Slinton 			s = p->bpblock;
745468Slinton 			if (s != program) {
755468Slinton 				printf(" in ");
765468Slinton 				printname(s);
775468Slinton 			}
785468Slinton 			break;
795468Slinton 
805468Slinton 		case STOP_ON:
815468Slinton 			printnum(p->bpid);
825468Slinton 			printf("%s", stname);
835468Slinton 			if (t != NIL) {
845468Slinton 				printf(" ");
855468Slinton 				prtree(t);
865468Slinton 			}
875468Slinton 			s = p->bpblock;
885468Slinton 			if (s != program) {
895468Slinton 				printf(" in ");
905468Slinton 				printname(s);
915468Slinton 			}
925468Slinton 			break;
935468Slinton 
945468Slinton 		case BLOCK_ON:
955468Slinton 		case TERM_ON:
965468Slinton 			s = p->bpblock;
975468Slinton 			printnum(p->bpid);
985468Slinton 			printf("%s ", trname);
995468Slinton 			prtree(t);
1005468Slinton 			if (s != program) {
1015468Slinton 				printf(" in ");
1025468Slinton 				printname(s);
1035468Slinton 			}
1045468Slinton 			break;
1055468Slinton 
1065468Slinton 		case AT_BP:
1075468Slinton 			printnum(p->bpid);
1085468Slinton 			printf("%s ", trname);
1095468Slinton 			prtree(t);
1105468Slinton 			printf(" at %d", p->bpline);
1115468Slinton 			break;
1125468Slinton 
1135468Slinton 		case STOP_BP:
1145468Slinton 			printnum(p->bpid);
1155468Slinton 			printf("%s", stname);
1165468Slinton 			if (t != NIL) {
1175468Slinton 				printf(" ");
1185468Slinton 				prtree(t);
1195468Slinton 			} else if ((s = p->bpblock) != NIL) {
1205468Slinton 				printf(" in ");
1215468Slinton 				printname(s);
1225468Slinton 			} else if (p->bpline > 0) {
1235468Slinton 				printf(" at %d", p->bpline);
1245468Slinton 			} else {
1255468Slinton 				printf(" at %d", p->bpaddr);
1265468Slinton 			}
1275468Slinton 			break;
1285468Slinton 
1295468Slinton 		/*
1305468Slinton 		 * Temporary breakpoints;
1315468Slinton 		 * return rather than break to avoid printing newline.
1325468Slinton 		 */
1335468Slinton 		case ALL_OFF:
1345468Slinton 		case CALL:
1355468Slinton 		case RETURN:
1365468Slinton 		case CALLPROC:
1375468Slinton 		case STOP_OFF:
1385468Slinton 		case BLOCK_OFF:
1395468Slinton 		case TERM_OFF:
1405468Slinton 		case END_BP:
1415468Slinton 			return;
1425468Slinton 
1435468Slinton 		default:
1445468Slinton 			panic("bptype %d in bplist", p->bptype);
1455468Slinton 	}
1465468Slinton 	if (p->bpcond != NIL) {
1475468Slinton 		printf(" if ");
1485468Slinton 		prtree(p->bpcond);
1495468Slinton 	}
1505468Slinton 	printf("\n");
1515468Slinton }
1525468Slinton 
1535468Slinton /*
1545468Slinton  * Print the name of a symbol unambigously.
1555468Slinton  */
1565468Slinton 
printname(s)1575468Slinton LOCAL printname(s)
1585468Slinton SYM *s;
1595468Slinton {
1605468Slinton 	if (isambiguous(s)) {
1615468Slinton 		printwhich(s);
1625468Slinton 	} else {
1635468Slinton 		printf("%s", name(s));
1645468Slinton 	}
1655468Slinton }
166