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 221