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)341344Sbillsubpcs(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