home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / pcs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.9 KB  |  123 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        NOBKPT;
  12. MSG        SZBKPT;
  13. MSG        EXBKPT;
  14. MSG        NOPCS;
  15. MSG        BADMOD;
  16.  
  17. /* breakpoints */
  18. BKPTR        bkpthead;
  19.  
  20. CHAR        *lp;
  21. CHAR        lastc;
  22. POS        corhdr[512];
  23. POS        *endhdr;
  24.  
  25. INT        signo;
  26. L_INT        dot;
  27. INT        pid;
  28. L_INT        cntval;
  29. L_INT        loopcnt;
  30.  
  31.  
  32.  
  33. /* sub process control */
  34.  
  35. subpcs(modif)
  36. {
  37.     REG INT        check;
  38.     INT        execsig;
  39.     INT        runmode;
  40.     REG BKPTR    bkptr;
  41.     STRING        comptr;
  42.     execsig=0; loopcnt=cntval;
  43.  
  44.     switch(modif) {
  45.  
  46.         /* delete breakpoint */
  47.         case 'd': case 'D':
  48.         IF (bkptr=scanbkpt(shorten(dot)))
  49.         THEN bkptr->flag=0; return;
  50.         ELSE error(NOBKPT);
  51.         FI
  52.  
  53.         /* set breakpoint */
  54.         case 'b': case 'B':
  55.         IF (bkptr=scanbkpt(shorten(dot)))
  56.         THEN bkptr->flag=0;
  57.         FI
  58.         FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
  59.         DO IF bkptr->flag == 0
  60.            THEN break;
  61.            FI
  62.         OD
  63.         IF bkptr==0
  64.         THEN IF (bkptr=sbrk(sizeof *bkptr)) == -1
  65.              THEN error(SZBKPT);
  66.              ELSE bkptr->nxtbkpt=bkpthead;
  67.               bkpthead=bkptr;
  68.              FI
  69.         FI
  70.         bkptr->loc = dot;
  71.         bkptr->initcnt = bkptr->count = cntval;
  72.         bkptr->flag = BKPTSET;
  73.         check=MAXCOM-1; comptr=bkptr->comm; rdc(); lp--;
  74.         REP *comptr++ = readchar();
  75.         PER check-- ANDF lastc!=EOR DONE
  76.         *comptr=0; lp--;
  77.         IF check
  78.         THEN return;
  79.         ELSE error(EXBKPT);
  80.         FI
  81.  
  82.         /* exit */
  83.         case 'k' :case 'K':
  84.         IF pid
  85.         THEN printf("%d: killed", pid); endpcs(); return;
  86.         FI
  87.         error(NOPCS);
  88.  
  89.         /* run program */
  90.         case 'r': case 'R':
  91.         endpcs();
  92.         setup();
  93.         runmode=CONTIN;
  94.         break;
  95.  
  96.         /* single step */
  97.         case 's': case 'S':
  98.         runmode=SINGLE;
  99.         IF pid
  100.         THEN execsig=getsig(signo);
  101.         ELSE setup(); loopcnt--;
  102.         FI
  103.         break;
  104.  
  105.         /* continue with optional signal */
  106.         case 'c': case 'C': case 0:
  107.         IF pid==0 THEN error(NOPCS); FI
  108.         runmode=CONTIN;
  109.         execsig=getsig(signo);
  110.         break;
  111.  
  112.         default: error(BADMOD);
  113.     }
  114.  
  115.     IF loopcnt>0 ANDF runpcs(runmode, execsig)
  116.     THEN printf("breakpoint%16t");
  117.     ELSE printf("stopped at%16t");
  118.     FI
  119.     delbp();
  120.     printpc();
  121. }
  122.  
  123.