|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)command.c 4.6 10/13/84"; ! 3: #endif ! 4: /* ! 5: * ! 6: * UNIX debugger ! 7: * ! 8: */ ! 9: ! 10: #include "defs.h" ! 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[512] = "z"; ! 28: CHAR stformat[512] = "X\"= \"^i"; ! 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=0; ! 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=(longpr?4:2); savdot=dot; ! 133: expr(1); locval=expv; ! 134: IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI ! 135: IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI ! 136: LOOP w=get(dot,itype); ! 137: IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI ! 138: dot=inkdot(dotinc); ! 139: POOL ! 140: IF errflg ! 141: THEN dot=savdot; errflg=NOMATCH; ! 142: FI ! 143: psymoff(dot,ptype,""); ! 144: break; ! 145: ! 146: case 'W': ! 147: longpr=TRUE; ! 148: case 'w': ! 149: IF eqcom THEN error(BADEQ); FI ! 150: wformat[0]=lastc; expr(1); ! 151: REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype); ! 152: errflg=0; dot=savdot; ! 153: IF longpr ! 154: THEN put(dot,itype,expv); ! 155: ELSE put(dot,itype,itol(get(dot+2,itype),expv)); ! 156: FI ! 157: savdot=dot; ! 158: printf("=%8t"); exform(1,wformat,itype,ptype); ! 159: newline(); ! 160: PER expr(0) ANDF errflg==0 DONE ! 161: dot=savdot; ! 162: chkerr(); ! 163: break; ! 164: ! 165: default: ! 166: lp--; ! 167: getformat(eqcom ? eqformat : stformat); ! 168: IF !eqcom ! 169: THEN psymoff(dot,ptype,":%16t"); ! 170: FI ! 171: scanform(cntval,(eqcom?eqformat:stformat),itype,ptype); ! 172: } ! 173: break; ! 174: ! 175: case '>': ! 176: lastcom=0; savc=rdc(); ! 177: IF regptr=getreg(savc) ! 178: THEN IF kcore THEN ! 179: *(int *)regptr = dot; ! 180: ELSE ! 181: *(ADDR *)(((ADDR)&u)+regptr) = dot; ! 182: ptrace(PT_WRITE_U, pid, regptr, ! 183: *(ADDR *)(((ADDR)&u)+regptr)); ! 184: FI ! 185: ELIF (modifier=varchk(savc)) != -1 ! 186: THEN var[modifier]=dot; ! 187: ELSE error(BADVAR); ! 188: FI ! 189: break; ! 190: ! 191: case '!': ! 192: lastcom=0; ! 193: shell(); break; ! 194: ! 195: case '$': ! 196: lastcom=0; ! 197: printtrace(nextchar()); break; ! 198: ! 199: case ':': ! 200: IF !executing ! 201: THEN executing=TRUE; ! 202: subpcs(nextchar()); ! 203: executing=FALSE; ! 204: lastcom=0; ! 205: FI ! 206: break; ! 207: ! 208: case 0: ! 209: prints(DBNAME); ! 210: break; ! 211: ! 212: default: error(BADCOM); ! 213: } ! 214: ! 215: flushbuf(); ! 216: PER rdc()==';' DONE ! 217: IF buf THEN lp=savlp; ELSE lp--; FI ! 218: return(adrflg ANDF dot!=0); ! 219: } ! 220:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.