Ultrix-3.1/src/cmd/adb/pcs.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/
#
static char *sccsid = "@(#)pcs.c 3.0 4/21/86";
/*
 *
 *	UNIX debugger
 *
 */

#include "defs.h"

MSG		NOBKPT;
MSG		SZBKPT;
MSG		EXBKPT;
MSG		NOPCS;
MSG		BADMOD;

/* breakpoints */
struct bkpt *bkpthead;

char 	*lp;
char 	lastc;
unsigned 	corhdr[ctob(USIZE)];
unsigned 	*endhdr;
struct symtab *lastsym;
int magic;

int 	signo;
long 	dot;
int 	pid;
long 	cntval;
long 	loopcnt;


/* sub process control */

subpcs(modif)
{
	register int 	check;
	int 	execsig;
	int 	runmode;
	register struct bkpt *bkptr;
	char *comptr;
	execsig=0; 
	loopcnt=cntval;

	switch(modif){

		/* delete breakpoint */
	case 'd': 
	case 'D':
		if((bkptr=scanbkpt(shorten(dot))))
		{
			bkptr->flag=0; 
			return;
		}
		else{
			error(NOBKPT);
		}

		/* set breakpoint */
	case 'b': 
	case 'B':
		if((bkptr=scanbkpt(shorten(dot))))
		{
			bkptr->flag=0;
		}
		for(bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt){
			if(bkptr->flag == 0)
			{
				break;
			}
		}
		if(bkptr==0)
		{
			if((bkptr=sbrk(sizeof *bkptr)) == -1)
			{
				error(SZBKPT);
			}
			else{
				bkptr->nxtbkpt=bkpthead;
				bkpthead=bkptr;
			}
		}
		bkptr->loc = dot;
		bkptr->ovly = (magic >= 0430?lastsym->symo:0) << 8;
		bkptr->initcnt = bkptr->count = cntval;
		bkptr->flag = BKPTSET;
		check=MAXCOM-1; 
		comptr=bkptr->comm; 
		rdc(); 
		lp--;
		do{
			*comptr++ = readchar();
		}
		while(check-- && lastc!='\n');

		*comptr=0; 
		lp--;
		if(check)
		{
			return;
		}
		else{
			error(EXBKPT);
		}
		/* exit */
	case 'k' :
	case 'K':
		if(pid)
		{
			printf("%d: killed", pid); 
			endpcs(); 
			return;
		}
		error(NOPCS);

		/* run program */
	case 'r': 
	case 'R':
		endpcs();
		setup();
		runmode=CONTIN;
		break;

		/* single step */
	case 's': 
	case 'S':
		runmode=SINGL;	/* was SINGLE, conflict with opset.c */
		if(pid)
		{
			execsig=getsig(signo);
		}
		else{
			setup(); 
			loopcnt--;
		}
		break;

		/* continue with optional signal */
	case 'c': 
	case 'C': 
	case 0:
		if(pid==0)
		{
			error(NOPCS);
		}
		runmode=CONTIN;
		execsig=getsig(signo);
		break;

	default: 
		error(BADMOD);
	}

	if(loopcnt>0 && runpcs(runmode, execsig))
	{
		printf("breakpoint%16t");
	}
	else{
		printf("stopped at%16t");
	}
	delbp();
	printpc();
}