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