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