2.11BSD/src/bin/adb/pcs.c
#include "defs.h"
MSG NOBKPT;
MSG SZBKPT;
MSG EXBKPT;
MSG NOPCS;
MSG BADMOD;
/* breakpoints */
BKPTR bkpthead;
char *lp;
char lastc;
u_int corhdr[ctob(USIZE)/sizeof(u_int)];
MAP txtmap;
int signo;
long dot;
int pid;
long cntval;
long loopcnt;
int overlay;
char curov, symov;
/* sub process control */
subpcs(modif)
{
register int check;
int execsig, runmode;
register BKPTR bkptr;
char *comptr;
execsig=0; loopcnt=cntval;
switch(modif) {
/* delete breakpoint */
case 'd': case 'D':
if (symov && symov!=curov)
setovmap(symov);
IF (bkptr=scanbkpt(shorten(dot)))
THEN bkptr->flag=0;
if (pid) del1bp(bkptr);
return;
ELSE error(NOBKPT);
FI
/* set breakpoint */
case 'b': case 'B':
if (symov && symov!=curov)
setovmap(symov);
IF (bkptr=scanbkpt(shorten(dot)))
THEN bkptr->flag=0;
if (pid) del1bp(bkptr);
FI
FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
DO IF bkptr->flag == 0
THEN break;
FI
OD
IF bkptr==0
THEN IF (bkptr=(BKPTR)malloc(sizeof *bkptr)) == (BKPTR)NULL
THEN error(SZBKPT);
ELSE bkptr->nxtbkpt=bkpthead;
bkpthead=bkptr;
FI
FI
bkptr->loc = dot;
bkptr->initcnt = bkptr->count = cntval;
bkptr->flag = BKPTSET;
if (overlay && dot>txtmap.bo)
bkptr->ovly = symov ? symov : curov;
else bkptr->ovly = 0; /* base seg */
check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
REP *comptr++ = readchar();
PER check-- ANDF lastc!=EOR DONE
*comptr=0; lp--;
IF check
THEN if (pid) set1bp(bkptr);
return;
ELSE error(EXBKPT);
FI
/* exit */
case 'k' :case 'K':
IF pid
THEN printf("%d: killed", pid); endpcs(); return;
FI
error(NOPCS);
/* run program */
case 'r': case 'R':
endpcs();
setup();
setbp();
runmode=PT_CONTINUE;
break;
/* single step */
case 's': case 'S':
runmode=PT_STEP;
IF pid
THEN execsig=getsig(signo);
ELSE setup(); loopcnt--;
FI
break;
/* continue with optional signal */
case 'c': case 'C': case 0:
IF pid==0 THEN error(NOPCS); FI
runmode=PT_CONTINUE;
execsig=getsig(signo);
break;
default: error(BADMOD);
}
IF loopcnt>0 ANDF runpcs(runmode, execsig)
THEN printf("breakpoint%16t");
ELSE printf("stopped at%16t");
FI
printpc();
}