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