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