|
|
1.1 ! root 1: /* ! 2: * ! 3: * UNIX debugger ! 4: * ! 5: */ ! 6: ! 7: #include "defs.h" ! 8: #include "regs.h" ! 9: #include "sym.h" ! 10: #include "space.h" ! 11: ! 12: WORD var[NVARS]; ! 13: ! 14: extern int radix; ! 15: ! 16: extern char lastc, peekc; ! 17: ! 18: extern ADDR ditto; ! 19: extern int ditsp; ! 20: extern int dotsp; ! 21: WORD expv; ! 22: int expsp; ! 23: ! 24: WORD ! 25: defval(w) ! 26: WORD w; ! 27: { ! 28: if (expr(0)) ! 29: return (expv); ! 30: else ! 31: return (w); ! 32: } ! 33: ! 34: expr(a) ! 35: register int a; ! 36: { /* term | term dyadic expr | */ ! 37: register int rc; ! 38: register WORD lhs; ! 39: ! 40: rdc(); ! 41: reread(); ! 42: expsp = NOSP; ! 43: rc=term(a); ! 44: while (rc) { ! 45: lhs = expv; ! 46: switch ((int)readchar()) { ! 47: ! 48: case '+': ! 49: term(a|1); ! 50: expv += lhs; ! 51: break; ! 52: ! 53: case '-': ! 54: term(a|1); ! 55: expv = lhs - expv; ! 56: break; ! 57: ! 58: case '#': ! 59: term(a|1); ! 60: expv = round(lhs,expv); ! 61: break; ! 62: ! 63: case '*': ! 64: term(a|1); ! 65: expv *= lhs; ! 66: break; ! 67: ! 68: case '%': ! 69: term(a|1); ! 70: expv = lhs/expv; ! 71: break; ! 72: ! 73: case '&': ! 74: term(a|1); ! 75: expv &= lhs; ! 76: break; ! 77: ! 78: case '|': ! 79: term(a|1); ! 80: expv |= lhs; ! 81: break; ! 82: ! 83: case ')': ! 84: if ((a&2)==0) ! 85: error("unexpected `)'"); ! 86: ! 87: default: ! 88: reread(); ! 89: return(rc); ! 90: } ! 91: } ! 92: return(rc); ! 93: } ! 94: ! 95: term(a) ! 96: register int a; ! 97: { /* item | monadic item | (expr) | */ ! 98: ! 99: switch ((int)readchar()) { ! 100: ! 101: case '*': ! 102: term(a|1); ! 103: expv=atow(aget((ADDR)expv, CORF|DATASP)); ! 104: expsp = NOSP; ! 105: chkerr(); ! 106: return(1); ! 107: ! 108: case '@': ! 109: term(a|1); ! 110: expv=atow(aget((ADDR)expv, SYMF|INSTSP)); ! 111: expsp = NOSP; ! 112: return(1); ! 113: ! 114: case '-': ! 115: term(a|1); ! 116: expv = -expv; ! 117: return(1); ! 118: ! 119: case '~': ! 120: term(a|1); ! 121: expv = ~expv; ! 122: return(1); ! 123: ! 124: case '(': ! 125: expr(2); ! 126: if (readchar()!=')') ! 127: error("syntax error: `)' expected"); ! 128: return(1); ! 129: ! 130: case '%': ! 131: term(a|1); ! 132: expsp = REGSP; ! 133: return(1); ! 134: ! 135: default: ! 136: reread(); ! 137: return(item(a)); ! 138: } ! 139: } ! 140: ! 141: item(a) ! 142: register int a; ! 143: { /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */ ! 144: int base; ! 145: char savc; ! 146: register struct sym *symp; ! 147: char gsym[MAXSYM], lsym[MAXSYM]; ! 148: WORD ascval(); ! 149: ! 150: readchar(); ! 151: if (symchar(0)) { ! 152: readsym(gsym); ! 153: if (lastc=='.') { ! 154: readchar(); /* ugh */ ! 155: if (!symchar(0)) ! 156: localaddr(gsym, (char *)NULL); ! 157: else { ! 158: readsym(lsym); ! 159: localaddr(gsym, lsym); ! 160: } ! 161: } ! 162: else { ! 163: if ((symp = lookup(gsym)) == NULL) ! 164: error("symbol not found"); ! 165: expv = symp->y_value; ! 166: } ! 167: reread(); ! 168: } else if (getnum(readchar)) { ! 169: ; ! 170: } else if (lastc=='.') { ! 171: readchar(); ! 172: if (!symchar(0)) { ! 173: expv = dot; ! 174: expsp = dotsp; ! 175: } else { ! 176: readsym(lsym); ! 177: localaddr((char *)NULL, lsym); ! 178: } ! 179: reread(); ! 180: } else if (lastc=='"') { ! 181: expv=ditto; ! 182: expsp = ditsp; ! 183: } else if (lastc=='+') { ! 184: expv=inkdot(dotinc); ! 185: expsp = ditsp; ! 186: } else if (lastc=='^') { ! 187: expv=inkdot(-dotinc); ! 188: expsp = ditsp; ! 189: } else if (lastc=='<') { ! 190: savc=rdc(); ! 191: base = getreg(savc); ! 192: if (base != BADREG) ! 193: expv = rtow(rget(base)); ! 194: else if ((base = varchk(savc)) != -1) ! 195: expv = var[base]; ! 196: else ! 197: error("bad variable"); ! 198: } ! 199: else if (lastc=='\'') ! 200: expv = ascval(); ! 201: else if (a) ! 202: error("address expected"); ! 203: else { ! 204: reread(); ! 205: return(0); ! 206: } ! 207: return(1); ! 208: } ! 209: ! 210: #define MAXBASE 16 ! 211: ! 212: /* service routines for expression reading */ ! 213: getnum(rdf) ! 214: int (*rdf)(); ! 215: { ! 216: register char *cp; ! 217: register int base, d; ! 218: BOOL fpnum; ! 219: char num[MAXLIN]; ! 220: WORD fpin(); ! 221: ! 222: base = radix; ! 223: fpnum = FALSE; ! 224: if (lastc == '#') { ! 225: base = 16; ! 226: (*rdf)(); ! 227: } ! 228: if (convdig(lastc) >= MAXBASE) ! 229: return (0); ! 230: if (lastc == '0') ! 231: switch ((*rdf)()) { ! 232: case 'x': ! 233: case 'X': ! 234: base = 16; ! 235: (*rdf)(); ! 236: break; ! 237: ! 238: case 't': ! 239: case 'T': ! 240: base = 10; ! 241: (*rdf)(); ! 242: break; ! 243: ! 244: case 'o': ! 245: case 'O': ! 246: base = 8; ! 247: (*rdf)(); ! 248: break; ! 249: default: ! 250: if (base == 0) ! 251: base = 8; ! 252: break; ! 253: } ! 254: if (base == 0) ! 255: base = 10; ! 256: expv = 0; ! 257: for (cp = num, *cp++ = lastc; ;(*rdf)()) { ! 258: if ((d = convdig(lastc)) < base) { ! 259: expv *= base; ! 260: expv += d; ! 261: *cp++ = lastc; ! 262: } ! 263: else if (lastc == '.') { ! 264: fpnum = TRUE; ! 265: *cp++ = lastc; ! 266: } ! 267: else { ! 268: reread(); ! 269: break; ! 270: } ! 271: } ! 272: if (fpnum) ! 273: expv = fpin(num); ! 274: return (1); ! 275: } ! 276: ! 277: readsym(isymbol) ! 278: register char *isymbol; ! 279: { ! 280: register char *p; ! 281: ! 282: p = isymbol; ! 283: do { ! 284: if (p < &isymbol[MAXSYM-1]) ! 285: *p++ = lastc; ! 286: readchar(); ! 287: } while (symchar(1)); ! 288: *p = 0; ! 289: } ! 290: ! 291: convdig(c) ! 292: register char c; ! 293: { ! 294: if (isdigit(c)) ! 295: return(c-'0'); ! 296: else if (!isxdigit(c)) ! 297: return(MAXBASE); ! 298: else if (isupper(c)) ! 299: return(c-'A'+10); ! 300: else ! 301: return(c-'a'+10); ! 302: } ! 303: ! 304: symchar(dig) ! 305: { ! 306: if (lastc=='\\') { ! 307: readchar(); ! 308: return(TRUE); ! 309: } ! 310: return(isalpha(lastc) || lastc=='_' || dig && isdigit(lastc)); ! 311: } ! 312: ! 313: varchk(name) ! 314: { ! 315: if (isdigit(name)) ! 316: return(name-'0'); ! 317: if (isalpha(name)) ! 318: return((name&037)-1+10); ! 319: return(-1); ! 320: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.