|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)command.c 4.5 8/11/83"; ! 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 *(int *)regptr = dot; ELSE ! 179: * (ADDR *) (((ADDR)&u)+regptr)=dot; ! 180: ptrace(WUREGS,pid,regptr,* (ADDR *) (((ADDR)&u)+regptr)); ! 181: FI ! 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: shell(); 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: } ! 217:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.