|
|
1.1 ! root 1: # ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: ! 8: #include "defs.h" ! 9: SCCSID(@(#)command.c 2.4); ! 10: ! 11: ! 12: MSG BADEQ; ! 13: MSG NOMATCH; ! 14: MSG BADVAR; ! 15: MSG BADCOM; ! 16: ! 17: MAP txtmap; ! 18: MAP datmap; ! 19: INT executing; ! 20: CHAR *lp; ! 21: INT fcor; ! 22: INT fsym; ! 23: INT mkfault; ! 24: STRING errflg; ! 25: ! 26: CHAR lastc; ! 27: CHAR eqformat[128] = "z"; ! 28: CHAR stformat[128] = "X\"= \"^i"; ! 29: struct user u; ! 30: ! 31: L_INT dot; ! 32: L_INT ditto; ! 33: INT dotinc; ! 34: INT lastcom = '='; ! 35: L_INT var[]; ! 36: L_INT locval; ! 37: L_INT locmsk; ! 38: INT pid; ! 39: L_INT expv; ! 40: L_INT adrval; ! 41: INT adrflg; ! 42: L_INT cntval; ! 43: INT cntflg; ! 44: ! 45: ! 46: ! 47: ! 48: /* command decoding */ ! 49: ! 50: command(buf,defcom) ! 51: STRING buf; ! 52: CHAR defcom; ! 53: { ! 54: INT itype, ptype, modifier, regptr; ! 55: BOOL longpr, eqcom; ! 56: CHAR wformat[1]; ! 57: CHAR savc; ! 58: L_INT w, savdot; ! 59: STRING savlp=lp; ! 60: IF buf ! 61: THEN IF *buf==EOR ! 62: THEN return(FALSE); ! 63: ELSE lp=buf; ! 64: FI ! 65: FI ! 66: ! 67: REP ! 68: IF adrflg=expr(0) ! 69: THEN dot=expv; ditto=dot; ! 70: FI ! 71: adrval=dot; ! 72: IF rdc()==',' ANDF expr(0) ! 73: THEN cntflg=TRUE; cntval=expv; ! 74: ELSE cntflg=FALSE; cntval=1; lp--; ! 75: FI ! 76: ! 77: IF !eol(rdc()) ! 78: THEN lastcom=lastc; ! 79: ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI ! 80: lp--; lastcom=defcom; ! 81: FI ! 82: ! 83: switch(lastcom&STRIP) { ! 84: ! 85: case '/': ! 86: itype=DSP; ptype=DSYM; ! 87: goto trystar; ! 88: ! 89: case '=': ! 90: itype=NSP; ptype=0; ! 91: goto trypr; ! 92: ! 93: case '?': ! 94: itype=ISP; ptype=ISYM; ! 95: goto trystar; ! 96: ! 97: trystar: ! 98: IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI ! 99: IF lastcom"E ! 100: THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype; ! 101: FI ! 102: ! 103: trypr: ! 104: longpr=FALSE; eqcom=lastcom=='='; ! 105: switch (rdc()) { ! 106: ! 107: case 'm': ! 108: {/*reset map data*/ ! 109: INT fcount; ! 110: MAP *smap; ! 111: UNION{MAP *m; L_INT *mp;}amap; ! 112: ! 113: IF eqcom THEN error(BADEQ); FI ! 114: smap=(itype&DSP?&datmap:&txtmap); ! 115: amap.m=smap; fcount=3; ! 116: IF itype&STAR ! 117: THEN amap.mp += 3; ! 118: FI ! 119: WHILE fcount-- ANDF expr(0) ! 120: DO *(amap.mp)++ = expv; OD ! 121: IF rdc()=='?' THEN smap->ufd=fsym; ! 122: ELIF lastc == '/' THEN smap->ufd=fcor; ! 123: ELSE lp--; ! 124: FI ! 125: } ! 126: break; ! 127: ! 128: case 'L': ! 129: longpr=TRUE; ! 130: case 'l': ! 131: /*search for exp*/ ! 132: IF eqcom THEN error(BADEQ); FI ! 133: dotinc=(longpr?4:2); savdot=dot; ! 134: expr(1); locval=expv; ! 135: IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI ! 136: IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI ! 137: LOOP w=get(dot,itype); ! 138: IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI ! 139: dot=inkdot(dotinc); ! 140: POOL ! 141: IF errflg ! 142: THEN dot=savdot; errflg=NOMATCH; ! 143: FI ! 144: psymoff(dot,ptype,""); ! 145: break; ! 146: ! 147: case 'W': ! 148: longpr=TRUE; ! 149: case 'w': ! 150: IF eqcom THEN error(BADEQ); FI ! 151: wformat[0]=lastc; expr(1); ! 152: REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype); ! 153: errflg=0; dot=savdot; ! 154: IF longpr ! 155: THEN put(dot,itype,expv); ! 156: ELSE put(dot,itype,itol(get(dot+2,itype),expv)); ! 157: FI ! 158: savdot=dot; ! 159: printf("=%8t"); exform(1,wformat,itype,ptype); ! 160: newline(); ! 161: PER expr(0) ANDF errflg==0 DONE ! 162: dot=savdot; ! 163: chkerr(); ! 164: break; ! 165: ! 166: default: ! 167: lp--; ! 168: getformat(eqcom ? eqformat : stformat); ! 169: IF !eqcom ! 170: THEN psymoff(dot,ptype,":%16t"); ! 171: FI ! 172: scanform(cntval,(eqcom?eqformat:stformat),itype,ptype); ! 173: } ! 174: break; ! 175: ! 176: case '>': ! 177: lastcom=0; savc=rdc(); ! 178: IF regptr=getreg(savc) ! 179: THEN * (ADDR *) (((ADDR)&u)+regptr)=dot; ! 180: ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+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: prints(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.