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&QUOTE
  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: }

Defined functions

command defined in line 49; used 2 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 773
Valid CSS Valid XHTML 1.0 Strict