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