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

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        BADEQ;
  12. MSG        NOMATCH;
  13. MSG        BADVAR;
  14. MSG        BADCOM;
  15.  
  16. MAP        txtmap;
  17. MAP        datmap;
  18. INT        executing;
  19. CHAR        *lp;
  20. INT        fcor;
  21. INT        fsym;
  22. INT        mkfault;
  23. STRING        errflg;
  24.  
  25. CHAR        lastc;
  26. CHAR        eqformat[128] "o";
  27. CHAR        stformat[128] "o\"= \"^i";
  28. POS        *endhdr;
  29.  
  30. L_INT        dot;
  31. L_INT        ditto;
  32. INT        dotinc;
  33. INT        lastcom '=';
  34. L_INT        var[];
  35. L_INT        locval;
  36. L_INT        locmsk;
  37. INT        pid;
  38. L_INT        expv;
  39. L_INT        adrval;
  40. INT        adrflg;
  41. L_INT        cntval;
  42. INT        cntflg;
  43.  
  44.  
  45.  
  46.  
  47. /* command decoding */
  48.  
  49. command(buf,defcom)
  50. STRING        buf;
  51. CHAR        defcom;
  52. {
  53.     INT        itype, ptype, modifier, regptr;
  54.     BOOL        longpr, eqcom;
  55.     CHAR        wformat[1];
  56.     CHAR        savc;
  57.     L_INT        w, savdot;
  58.     STRING        savlp=lp;
  59.     IF buf
  60.     THEN IF *buf==EOR
  61.          THEN return(FALSE);
  62.          ELSE lp=buf;
  63.          FI
  64.     FI
  65.  
  66.     REP
  67.     IF adrflg=expr(0)
  68.     THEN dot=expv; ditto=dot;
  69.     FI
  70.     adrval=dot;
  71.     IF rdc()==',' ANDF expr(0)
  72.     THEN cntflg=TRUE; cntval=expv;
  73.     ELSE cntflg=FALSE; cntval=1; lp--;
  74.     FI
  75.  
  76.     IF !eol(rdc())
  77.     THEN lastcom=lastc;
  78.     ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
  79.          lp--; lastcom=defcom;
  80.     FI
  81.  
  82.     switch(lastcom&STRIP) {
  83.  
  84.         case '/':
  85.         itype=DSP; ptype=DSYM;
  86.         goto trystar;
  87.  
  88.         case '=':
  89.         itype=NSP; ptype=ASYM;
  90.         goto trypr;
  91.  
  92.         case '?':
  93.         itype=ISP; ptype=ISYM;
  94.         goto trystar;
  95.  
  96.         trystar:
  97.         IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
  98.         IF lastcom"E
  99.         THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
  100.         FI
  101.  
  102.         trypr:
  103.         longpr=FALSE; eqcom=lastcom=='=';
  104.         switch (rdc()) {
  105.  
  106.             case 'm':
  107.                 {/*reset map data*/
  108.                 INT        fcount;
  109.                 MAP        *smap;
  110.                 UNION{MAP *m; L_INT *mp;}amap;
  111.  
  112.                 IF eqcom THEN error(BADEQ); FI
  113.                 smap=(itype&DSP?&datmap:&txtmap);
  114.                 amap.m=smap; fcount=3;
  115.                 IF itype&STAR
  116.                 THEN amap.mp += 3;
  117.                 FI
  118.                 WHILE fcount-- ANDF expr(0)
  119.                 DO *(amap.mp)++ = expv; OD
  120.                 IF rdc()=='?' THEN smap->ufd=fsym;
  121.                 ELIF lastc == '/' THEN smap->ufd=fcor;
  122.                 ELSE lp--;
  123.                 FI
  124.                 }
  125.                 break;
  126.  
  127.             case 'L':
  128.                 longpr=TRUE;
  129.             case 'l':
  130.                 /*search for exp*/
  131.                 IF eqcom THEN error(BADEQ); FI
  132.                 dotinc=2; savdot=dot;
  133.                 expr(1); locval=expv;
  134.                 IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
  135.                 LOOP w=leng(get(dot,itype));
  136.                  IF longpr
  137.                  THEN w=itol(w,get(inkdot(2),itype));
  138.                  FI
  139.                  IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
  140.                  dot=inkdot(dotinc);
  141.                 POOL
  142.                 IF errflg
  143.                 THEN dot=savdot; errflg=NOMATCH;
  144.                 FI
  145.                 psymoff(dot,ptype,"");
  146.                 break;
  147.  
  148.             case 'W':
  149.                 longpr=TRUE;
  150.             case 'w':
  151.                 IF eqcom THEN error(BADEQ); FI
  152.                 wformat[0]=lastc; expr(1);
  153.                 REP  savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
  154.                  errflg=0; dot=savdot;
  155.                  IF longpr
  156.                  THEN put(dot,itype,expv);
  157.                  FI
  158.                  put((longpr?inkdot(2):dot),itype,shorten(expv));
  159.                  savdot=dot;
  160.                  printf("=%8t"); exform(1,wformat,itype,ptype);
  161.                  newline();
  162.                 PER  expr(0) ANDF errflg==0 DONE
  163.                 dot=savdot;
  164.                 chkerr();
  165.                 break;
  166.  
  167.             default:
  168.                 lp--;
  169.                 getformat(eqcom ? eqformat : stformat);
  170.                 IF !eqcom
  171.                 THEN psymoff(dot,ptype,":%16t");
  172.                 FI
  173.                 scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
  174.         }
  175.         break;
  176.  
  177.         case '>':
  178.         lastcom=0; savc=rdc();
  179.         IF regptr=getreg(savc)
  180.         THEN endhdr[regptr]=shorten(dot);
  181.              ptrace(WUREGS,pid,2*(512+regptr),endhdr[regptr]);
  182.         ELIF (modifier=varchk(savc)) != -1
  183.         THEN    var[modifier]=dot;
  184.         ELSE    error(BADVAR);
  185.         FI
  186.         break;
  187.  
  188.         case '!':
  189.         lastcom=0;
  190.         unox(); break;
  191.  
  192.         case '$':
  193.         lastcom=0;
  194.         printtrace(nextchar()); break;
  195.  
  196.         case ':':
  197.         IF !executing
  198.         THEN executing=TRUE;
  199.              subpcs(nextchar());
  200.              executing=FALSE;
  201.              lastcom=0;
  202.         FI
  203.         break;
  204.  
  205.         case 0:
  206.         prints(DBNAME);
  207.         break;
  208.  
  209.         default: error(BADCOM);
  210.     }
  211.  
  212.     flushbuf();
  213.     PER rdc()==';' DONE
  214.     IF buf THEN lp=savlp; ELSE lp--; FI
  215.     return(adrflg ANDF dot!=0);
  216. }
  217.  
  218.