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