xref: /csrg-svn/old/adb/adb.tahoe/pcs.c (revision 26422)
1*26422Ssam #ifndef lint
2*26422Ssam static	char sccsid[] = "@(#)pcs.c	1.1 (Berkeley) 02/25/86";
3*26422Ssam #endif
4*26422Ssam 
5*26422Ssam /*
6*26422Ssam  *
7*26422Ssam  *	UNIX debugger
8*26422Ssam  *
9*26422Ssam  */
10*26422Ssam 
11*26422Ssam #include "defs.h"
12*26422Ssam 
13*26422Ssam 
14*26422Ssam MSG		NOBKPT;
15*26422Ssam MSG		SZBKPT;
16*26422Ssam MSG		EXBKPT;
17*26422Ssam MSG		NOPCS;
18*26422Ssam MSG		BADMOD;
19*26422Ssam 
20*26422Ssam /* breakpoints */
21*26422Ssam BKPTR		bkpthead;
22*26422Ssam 
23*26422Ssam CHAR		*lp;
24*26422Ssam CHAR		lastc;
25*26422Ssam 
26*26422Ssam INT		signo;
27*26422Ssam L_INT		dot;
28*26422Ssam L_INT		pid;
29*26422Ssam L_INT		cntval;
30*26422Ssam L_INT		loopcnt;
31*26422Ssam 
32*26422Ssam L_INT		entrypt;
33*26422Ssam INT		adrflg;
34*26422Ssam 
35*26422Ssam 
36*26422Ssam 
37*26422Ssam /* sub process control */
38*26422Ssam 
subpcs(modif)39*26422Ssam subpcs(modif)
40*26422Ssam {
41*26422Ssam 	REG		check;
42*26422Ssam 	REG		execsig,runmode;
43*26422Ssam 	REG BKPTR	bkptr;
44*26422Ssam 	REG	STRING	comptr;
45*26422Ssam 	execsig=0; loopcnt=cntval;
46*26422Ssam 
47*26422Ssam 	switch (modif) {
48*26422Ssam 
49*26422Ssam 	    /* delete breakpoint */
50*26422Ssam 	    case 'd': case 'D':
51*26422Ssam 		IF (bkptr=scanbkpt(dot))
52*26422Ssam 		THEN bkptr->flag=0; return;
53*26422Ssam 		ELSE error(NOBKPT);
54*26422Ssam 		FI
55*26422Ssam 
56*26422Ssam 	    /* set breakpoint */
57*26422Ssam 	    case 'b': case 'B':
58*26422Ssam 		IF (bkptr=scanbkpt(dot))
59*26422Ssam 		THEN bkptr->flag=0;
60*26422Ssam 		FI
61*26422Ssam 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
62*26422Ssam 		DO IF bkptr->flag == 0
63*26422Ssam 		   THEN break;
64*26422Ssam 		   FI
65*26422Ssam 		OD
66*26422Ssam 		IF bkptr==0
67*26422Ssam 		THEN IF (bkptr=(BKPTR)sbrk(sizeof *bkptr)) == (BKPTR)-1
68*26422Ssam 		     THEN error(SZBKPT);
69*26422Ssam 		     ELSE bkptr->nxtbkpt=bkpthead;
70*26422Ssam 			  bkpthead=bkptr;
71*26422Ssam 		     FI
72*26422Ssam 		FI
73*26422Ssam 		bkptr->loc = dot;
74*26422Ssam 		bkptr->initcnt = bkptr->count = cntval;
75*26422Ssam 		bkptr->flag = BKPTSET;
76*26422Ssam 		check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
77*26422Ssam 		REP *comptr++ = readchar();
78*26422Ssam 		PER check-- ANDF lastc!=EOR DONE
79*26422Ssam 		*comptr=0; lp--;
80*26422Ssam 		IF check
81*26422Ssam 		THEN return;
82*26422Ssam 		ELSE error(EXBKPT);
83*26422Ssam 		FI
84*26422Ssam 
85*26422Ssam 	    /* exit */
86*26422Ssam 	    case 'k' :case 'K':
87*26422Ssam 		IF pid
88*26422Ssam 		THEN printf("%d: killed", pid); endpcs(); return;
89*26422Ssam 		FI
90*26422Ssam 		error(NOPCS);
91*26422Ssam 
92*26422Ssam 	    /* run program */
93*26422Ssam 	    case 'r': case 'R':
94*26422Ssam 		endpcs();
95*26422Ssam 		setup(); runmode=CONTIN;
96*26422Ssam /*
97*26422Ssam 		IF adrflg
98*26422Ssam 		THEN IF !scanbkpt(dot) THEN loopcnt++; FI
99*26422Ssam 		ELSE IF !scanbkpt(entrypt+2) THEN loopcnt++; FI
100*26422Ssam 		FI
101*26422Ssam */
102*26422Ssam 		break;
103*26422Ssam 
104*26422Ssam 	    /* single step */
105*26422Ssam 	    case 's': case 'S':
106*26422Ssam 		IF pid
107*26422Ssam 		THEN
108*26422Ssam 			runmode=SINGLE; execsig=getsig(signo);
109*26422Ssam 		ELSE setup(); loopcnt--;
110*26422Ssam 		FI
111*26422Ssam 		break;
112*26422Ssam 
113*26422Ssam 	    /* continue with optional signal */
114*26422Ssam 	    case 'c': case 'C': case 0:
115*26422Ssam 		IF pid==0 THEN error(NOPCS); FI
116*26422Ssam 		runmode=CONTIN; execsig=getsig(signo);
117*26422Ssam 		break;
118*26422Ssam 
119*26422Ssam 	    default: error(BADMOD);
120*26422Ssam 	}
121*26422Ssam 
122*26422Ssam 	IF loopcnt>0 ANDF runpcs(runmode,execsig)
123*26422Ssam 	THEN printf("breakpoint%16t");
124*26422Ssam 	ELSE printf("stopped at%16t");
125*26422Ssam 	FI
126*26422Ssam 	delbp();
127*26422Ssam 	printpc();
128*26422Ssam }
129*26422Ssam 
130