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