static char sccsid[] = "@(#)pcs.c 4.2 8/17/82"; # /* * * UNIX debugger * */ #include "defs.h" MSG NOBKPT; MSG SZBKPT; MSG EXBKPT; MSG NOPCS; MSG BADMOD; /* breakpoints */ BKPTR bkpthead; CHAR lastc; struct user u; INT signo; L_INT dot; INT pid; L_INT cntval; L_INT loopcnt; /* sub process control */ subpcs(modif) { REG INT check; INT execsig,runmode; REG BKPTR bkptr; STRING comptr; execsig=0; loopcnt=cntval; switch (modif) { /* delete breakpoint */ case 'd': case 'D': IF (bkptr=scanbkpt(dot)) THEN bkptr->flag=0; return; ELSE error(NOBKPT); FI /* set breakpoint */ case 'b': case 'B': IF (bkptr=scanbkpt(dot)) THEN bkptr->flag=0; FI FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt DO IF bkptr->flag == 0 THEN break; FI OD IF bkptr==0 THEN IF (bkptr=(BKPTR) sbrk(sizeof *bkptr)) == (BKPTR) -1 THEN error(SZBKPT); ELSE bkptr->nxtbkpt=bkpthead; bkpthead=bkptr; FI FI bkptr->loc = dot; bkptr->initcnt = bkptr->count = cntval; bkptr->flag = BKPTSET; check=MAXCOM-1; comptr=bkptr->comm; /* rdc(); */ REP *comptr++ = readchar(); PER check-- ANDF lastc!=EOR DONE *comptr=0; IF check THEN 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(); runmode=CONTIN; break; /* single step */ case 's': case 'S': IF pid THEN runmode=SINGLE; 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=CONTIN; execsig=getsig(signo); break; default: error(BADMOD); } runpcs(runmode,execsig); delbp(); }