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