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