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