1: #
   2: /*
   3:  *
   4:  *	UNIX debugger
   5:  *
   6:  */
   7: 
   8: #include "defs.h"
   9: 
  10: 
  11: MSG     BADSYM;
  12: MSG     BADVAR;
  13: MSG     BADKET;
  14: MSG     BADSYN;
  15: MSG     NOCFN;
  16: MSG     NOADR;
  17: MSG     BADLOC;
  18: 
  19: SYMTAB      symbol;
  20: INT     lastframe;
  21: INT     savlastf;
  22: L_INT       savframe;
  23: INT     savpc;
  24: INT     callpc;
  25: 
  26: 
  27: 
  28: CHAR        *lp;
  29: INT     octal;
  30: STRING      errflg;
  31: L_INT       localval;
  32: CHAR        isymbol[8];
  33: 
  34: CHAR        lastc;
  35: POS     *endhdr;
  36: 
  37: L_INT       dot;
  38: L_INT       ditto;
  39: INT     dotinc;
  40: L_INT       var[];
  41: L_INT       expv;
  42: 
  43: 
  44: 
  45: 
  46: expr(a)
  47: {   /* term | term dyadic expr |  */
  48:     INT     rc;
  49:     L_INT       lhs;
  50: 
  51:     rdc(); lp--; rc=term(a);
  52: 
  53:     WHILE rc
  54:     DO  lhs = expv;
  55: 
  56:         switch (readchar()) {
  57: 
  58:             case '+':
  59:             term(a|1); expv += lhs; break;
  60: 
  61:             case '-':
  62:             term(a|1); expv = lhs - expv; break;
  63: 
  64:             case '#':
  65:             term(a|1); expv = round(lhs,expv); break;
  66: 
  67:             case '*':
  68:             term(a|1); expv *= lhs; break;
  69: 
  70:             case '%':
  71:             term(a|1); expv = lhs/expv; break;
  72: 
  73:             case '&':
  74:             term(a|1); expv &= lhs; break;
  75: 
  76:             case '|':
  77:             term(a|1); expv |= lhs; break;
  78: 
  79:             case ')':
  80:             IF (a&2)==0 THEN error(BADKET); FI
  81: 
  82:             default:
  83:             lp--;
  84:             return(rc);
  85:         }
  86:     OD
  87:     return(rc);
  88: }
  89: 
  90: term(a)
  91: {   /* item | monadic item | (expr) | */
  92: 
  93:     switch (readchar()) {
  94: 
  95:             case '*':
  96:             term(a|1); expv=chkget(expv,DSP); return(1);
  97: 
  98:             case '@':
  99:             term(a|1); expv=chkget(expv,ISP); return(1);
 100: 
 101:             case '-':
 102:             term(a|1); expv = -expv; return(1);
 103: 
 104:             case '~':
 105:             term(a|1); expv = ~expv; return(1);
 106: 
 107:             case '(':
 108:             expr(2);
 109:             IF *lp!=')'
 110:             THEN    error(BADSYN);
 111:             ELSE    lp++; return(1);
 112:             FI
 113: 
 114:             default:
 115:             lp--;
 116:             return(item(a));
 117:     }
 118: }
 119: 
 120: item(a)
 121: {   /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
 122:     INT     base, d, frpt, regptr;
 123:     CHAR        savc;
 124:     BOOL        hex;
 125:     L_INT       frame;
 126:     UNION{REAL r; L_INT i;} real;
 127:     SYMPTR      symp;
 128: 
 129:     hex=FALSE;
 130: 
 131:     readchar();
 132:     IF symchar(0)
 133:     THEN    readsym();
 134:         IF lastc=='.'
 135:         THEN    frame=endhdr[r5]&EVEN; lastframe=0; callpc=endhdr[pc];
 136:             WHILE errflg==0
 137:             DO  savpc=callpc;
 138:                 findroutine(frame);
 139:                 IF  eqsym(symbol.symc,isymbol,'~')
 140:                 THEN break;
 141:                 FI
 142:                 lastframe=frame;
 143:                 frame=get(frame,DSP)&EVEN;
 144:                 IF frame==0
 145:                 THEN error(NOCFN);
 146:                 FI
 147:             OD
 148:             savlastf=lastframe; savframe=frame;
 149:             readchar();
 150:             IF symchar(0)
 151:             THEN    chkloc(expv=frame);
 152:             FI
 153:         ELIF (symp=lookupsym(isymbol))==0 THEN error(BADSYM);
 154:         ELSE expv = symp->symv;
 155:         FI
 156:         lp--;
 157: 
 158: 
 159:     ELIF digit(lastc) ORF (hex=TRUE, lastc=='#' ANDF hexdigit(readchar()))
 160:     THEN    expv = 0;
 161:         base = (lastc == '0' ORF octal ? 8 : (hex ? 16 : 10));
 162:         WHILE (hex ? hexdigit(lastc) : digit(lastc))
 163:         DO  expv *= base;
 164:             IF (d=convdig(lastc))>=base THEN error(BADSYN); FI
 165:             expv += d; readchar();
 166:             IF expv==0 ANDF (lastc=='x' ORF lastc=='X')
 167:             THEN hex=TRUE; base=16; readchar();
 168:             FI
 169:         OD
 170:         IF lastc=='.' ANDF (base==10 ORF expv==0) ANDF !hex
 171:         THEN    real.r=expv; frpt=0; base=10;
 172:             WHILE digit(readchar())
 173:             DO  real.r *= base; frpt++;
 174:                 real.r += lastc-'0';
 175:             OD
 176:             WHILE frpt--
 177:             DO  real.r /= base; OD
 178:             expv = real.i;
 179:         FI
 180:         lp--;
 181: 
 182:     ELIF lastc=='.'
 183:     THEN    readchar();
 184:         IF symchar(0)
 185:         THEN    lastframe=savlastf; callpc=savpc; findroutine(savframe);
 186:             chkloc(savframe);
 187:         ELSE    expv=dot;
 188:         FI
 189:         lp--;
 190: 
 191:     ELIF lastc=='"'
 192:     THEN    expv=ditto;
 193: 
 194:     ELIF lastc=='+'
 195:     THEN    expv=inkdot(dotinc);
 196: 
 197:     ELIF lastc=='^'
 198:     THEN    expv=inkdot(-dotinc);
 199: 
 200:     ELIF lastc=='<'
 201:     THEN    savc=rdc();
 202:         IF regptr=getreg(savc)
 203:         THEN    expv=endhdr[regptr];
 204:         ELIF (base=varchk(savc)) != -1
 205:         THEN    expv=var[base];
 206:         ELSE    error(BADVAR);
 207:         FI
 208: 
 209:     ELIF lastc=='\''
 210:     THEN    d=4; expv=0;
 211:         WHILE quotchar()
 212:         DO  IF d--
 213:             THEN IF d==1 THEN expv =<<16; FI
 214:              expv |= ((d&1)?lastc:lastc<<8);
 215:             ELSE error(BADSYN);
 216:             FI
 217:         OD
 218: 
 219:     ELIF a
 220:     THEN    error(NOADR);
 221:     ELSE    lp--; return(0);
 222:     FI
 223:     return(1);
 224: }
 225: 
 226: /* service routines for expression reading */
 227: 
 228: readsym()
 229: {
 230:     REG char    *p;
 231: 
 232:     p = isymbol;
 233:     REP IF p < &isymbol[8]
 234:         THEN *p++ = lastc;
 235:         FI
 236:         readchar();
 237:     PER symchar(1) DONE
 238:     WHILE p < &isymbol[8] DO *p++ = 0; OD
 239: }
 240: 
 241: SYMPTR  lookupsym(symstr)
 242: STRING  symstr;
 243: {
 244:     SYMPTR      symp;
 245:     symset();
 246:     WHILE (symp=symget())
 247:     DO IF (symp->symf&SYMCHK)==symp->symf
 248:        ANDF eqsym(symp->symc, symstr,'_')
 249:         THEN return(symp);
 250:         FI
 251:     OD
 252:     return(0);
 253: }
 254: 
 255: hexdigit(c)
 256: CHAR c;
 257: {   return((c>='0' ANDF c<='9') ORF (c>='a' ANDF c<='f'));
 258: }
 259: 
 260: convdig(c)
 261: CHAR c;
 262: {
 263:     IF digit(c)
 264:     THEN    return(c-'0');
 265:     ELIF hexdigit(c)
 266:     THEN    return(c-'a'+10);
 267:     ELSE    return(17);
 268:     FI
 269: }
 270: 
 271: digit(c) char c;    {return(c>='0' ANDF c<='9');}
 272: 
 273: letter(c) char c;   {return(c>='a' ANDF c<='z' ORF c>='A' ANDF c<='Z');}
 274: 
 275: symchar(dig)
 276: {
 277:     IF lastc=='\\' THEN readchar(); return(TRUE); FI
 278:     return( letter(lastc) ORF lastc=='_' ORF dig ANDF digit(lastc) );
 279: }
 280: 
 281: varchk(name)
 282: {
 283:     IF digit(name) THEN return(name-'0'); FI
 284:     IF letter(name) THEN return((name&037)-1+10); FI
 285:     return(-1);
 286: }
 287: 
 288: chkloc(frame)
 289: L_INT       frame;
 290: {
 291:     readsym();
 292:     REP IF localsym(frame)==0 THEN error(BADLOC); FI
 293:         expv=localval;
 294:     PER !eqsym(symbol.symc,isymbol,'~') DONE
 295: }
 296: 
 297: eqsym(s1, s2, c)
 298: REG STRING  s1, s2;
 299: CHAR        c;
 300: {
 301:     IF eqstr(s1,s2)
 302:     THEN    return(TRUE);
 303:     ELIF *s1==c
 304:     THEN    CHAR        s3[8];
 305:         REG INT     i;
 306: 
 307:         s3[0]=c;
 308:         FOR i=1; i<8; i++
 309:         DO s3[i] = *s2++; OD
 310: 
 311:         return(eqstr(s1,s3));
 312:     FI
 313: }

Defined functions

chkloc defined in line 288; used 2 times
convdig defined in line 260; used 1 times
digit defined in line 271; used 8 times
eqsym defined in line 297; used 3 times
expr defined in line 46; used 9 times
hexdigit defined in line 255; used 3 times
item defined in line 120; used 1 times
letter defined in line 273; used 2 times
lookupsym defined in line 241; used 2 times
readsym defined in line 228; used 2 times
symchar defined in line 275; used 4 times
term defined in line 90; used 12 times
varchk defined in line 281; used 2 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 781
Valid CSS Valid XHTML 1.0 Strict