xref: /csrg-svn/old/sdb/pcs.c (revision 7775)
1*7775Srrh static	char sccsid[] = "@(#)pcs.c 4.2 08/17/82";
21344Sbill #
31344Sbill /*
41344Sbill  *
51344Sbill  *	UNIX debugger
61344Sbill  *
71344Sbill  */
81344Sbill 
91344Sbill #include "defs.h"
101344Sbill 
111344Sbill 
121344Sbill MSG		NOBKPT;
131344Sbill MSG		SZBKPT;
141344Sbill MSG		EXBKPT;
151344Sbill MSG		NOPCS;
161344Sbill MSG		BADMOD;
171344Sbill 
181344Sbill /* breakpoints */
191344Sbill BKPTR		bkpthead;
201344Sbill 
211344Sbill CHAR		lastc;
221344Sbill struct user u;
231344Sbill 
241344Sbill INT		signo;
251344Sbill L_INT		dot;
261344Sbill INT		pid;
271344Sbill L_INT		cntval;
281344Sbill L_INT		loopcnt;
291344Sbill 
301344Sbill 
311344Sbill 
321344Sbill /* sub process control */
331344Sbill 
subpcs(modif)341344Sbill subpcs(modif)
351344Sbill {
361344Sbill 	REG INT		check;
371344Sbill 	INT		execsig,runmode;
381344Sbill 	REG BKPTR	bkptr;
391344Sbill 	STRING		comptr;
401344Sbill 	execsig=0; loopcnt=cntval;
411344Sbill 
421344Sbill 	switch (modif) {
431344Sbill 
441344Sbill 	    /* delete breakpoint */
451344Sbill 	    case 'd': case 'D':
461344Sbill 		IF (bkptr=scanbkpt(dot))
471344Sbill 		THEN bkptr->flag=0; return;
481344Sbill 		ELSE error(NOBKPT);
491344Sbill 		FI
501344Sbill 
511344Sbill 	    /* set breakpoint */
521344Sbill 	    case 'b': case 'B':
531344Sbill 		IF (bkptr=scanbkpt(dot))
541344Sbill 		THEN bkptr->flag=0;
551344Sbill 		FI
561344Sbill 		FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
571344Sbill 		DO IF bkptr->flag == 0
581344Sbill 		   THEN break;
591344Sbill 		   FI
601344Sbill 		OD
611344Sbill 		IF bkptr==0
621344Sbill 		THEN IF (bkptr=(BKPTR) sbrk(sizeof *bkptr)) == (BKPTR) -1
631344Sbill 		     THEN error(SZBKPT);
641344Sbill 		     ELSE bkptr->nxtbkpt=bkpthead;
651344Sbill 			  bkpthead=bkptr;
661344Sbill 		     FI
671344Sbill 		FI
681344Sbill 		bkptr->loc = dot;
691344Sbill 		bkptr->initcnt = bkptr->count = cntval;
701344Sbill 		bkptr->flag = BKPTSET;
711344Sbill 		check=MAXCOM-1; comptr=bkptr->comm; /* rdc(); */
721344Sbill 		REP *comptr++ = readchar();
731344Sbill 		PER check-- ANDF lastc!=EOR DONE
741344Sbill 		*comptr=0;
751344Sbill 		IF check
761344Sbill 		THEN return;
771344Sbill 		ELSE error(EXBKPT);
781344Sbill 		FI
791344Sbill 
801344Sbill 	    /* exit */
811344Sbill 	    case 'k' :case 'K':
821344Sbill 		IF pid
831344Sbill 		THEN printf("%d: killed", pid); endpcs(); return;
841344Sbill 		FI
851344Sbill 		error(NOPCS);
861344Sbill 
871344Sbill 	    /* run program */
881344Sbill 	    case 'r': case 'R':
891344Sbill 		endpcs();
901344Sbill 		setup(); runmode=CONTIN;
911344Sbill 		break;
921344Sbill 
931344Sbill 	    /* single step */
941344Sbill 	    case 's': case 'S':
951344Sbill 		IF pid
961344Sbill 		THEN
971344Sbill 			runmode=SINGLE; execsig=getsig(signo);
981344Sbill 		ELSE setup(); loopcnt--;
991344Sbill 		FI
1001344Sbill 		break;
1011344Sbill 
1021344Sbill 	    /* continue with optional signal */
1031344Sbill 	    case 'c': case 'C': case 0:
1041344Sbill 		IF pid==0 THEN error(NOPCS); FI
1051344Sbill 		runmode=CONTIN; execsig=getsig(signo);
1061344Sbill 		break;
1071344Sbill 
1081344Sbill 	    default: error(BADMOD);
1091344Sbill 	}
1101344Sbill 
1111344Sbill 	runpcs(runmode,execsig);
1121344Sbill 	delbp();
1131344Sbill }
1141344Sbill 
115