xref: /csrg-svn/sys/deprecated/kdb/kdb_pcs.c (revision 30110)
1*30110Ssam /*	kdb_pcs.c	7.1	86/11/20	*/
2*30110Ssam 
3*30110Ssam #include "../kdb/defs.h"
4*30110Ssam 
5*30110Ssam char	*NOBKPT;
6*30110Ssam char	*SZBKPT;
7*30110Ssam char	*EXBKPT;
8*30110Ssam char	*BADMOD;
9*30110Ssam 
10*30110Ssam /* breakpoints */
11*30110Ssam BKPTR	bkpthead;
12*30110Ssam 
13*30110Ssam char	*lp;
14*30110Ssam char	lastc;
15*30110Ssam 
16*30110Ssam long	loopcnt;
17*30110Ssam 
18*30110Ssam /* sub process control */
19*30110Ssam 
20*30110Ssam subpcs(modif)
21*30110Ssam {
22*30110Ssam 	register check, runmode;
23*30110Ssam 	register BKPTR bkptr;
24*30110Ssam 	register char *comptr;
25*30110Ssam 
26*30110Ssam 	loopcnt=cntval;
27*30110Ssam 	switch (modif) {
28*30110Ssam 
29*30110Ssam 		/* delete breakpoint */
30*30110Ssam 	case 'd': case 'D':
31*30110Ssam 		if (bkptr=scanbkpt(dot)) {
32*30110Ssam 			bkptr->flag=0;
33*30110Ssam 			return;
34*30110Ssam 		}
35*30110Ssam 		error(NOBKPT);
36*30110Ssam 
37*30110Ssam 		/* set breakpoint */
38*30110Ssam 	case 'b': case 'B':
39*30110Ssam 		if (bkptr=scanbkpt(dot))
40*30110Ssam 			bkptr->flag=0;
41*30110Ssam 		for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
42*30110Ssam 			if (bkptr->flag == 0)
43*30110Ssam 				break;
44*30110Ssam 		if (bkptr==0) {
45*30110Ssam 			bkptr=(BKPTR)kdbmalloc(sizeof *bkptr);
46*30110Ssam 			if (bkptr == (BKPTR)-1)
47*30110Ssam 				error(SZBKPT);
48*30110Ssam 			bkptr->nxtbkpt=bkpthead;
49*30110Ssam 			bkpthead=bkptr;
50*30110Ssam 		}
51*30110Ssam 		bkptr->loc = dot;
52*30110Ssam 		bkptr->initcnt = bkptr->count = cntval;
53*30110Ssam 		bkptr->flag = BKPTSET;
54*30110Ssam 		check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
55*30110Ssam 		do
56*30110Ssam 			*comptr++ = readchar();
57*30110Ssam 		while (check-- && lastc!=EOR);
58*30110Ssam 		*comptr=0; lp--;
59*30110Ssam 		if (check)
60*30110Ssam 			return;
61*30110Ssam 		error(EXBKPT);
62*30110Ssam 
63*30110Ssam 		/* single step */
64*30110Ssam 	case 's': case 'S':
65*30110Ssam 		runmode=SINGLE;
66*30110Ssam 		break;
67*30110Ssam 
68*30110Ssam 		/* continue */
69*30110Ssam 	case 'c': case 'C':
70*30110Ssam 		runmode=CONTIN;
71*30110Ssam 		break;
72*30110Ssam 
73*30110Ssam 	default:
74*30110Ssam 		error(BADMOD);
75*30110Ssam 	}
76*30110Ssam 	if (loopcnt>0)
77*30110Ssam 		runpcs(runmode, 0);
78*30110Ssam }
79