| 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,2*(512+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 | |