1 /* kdb_command.c 7.2 86/11/20 */ 2 3 #include "../kdb/defs.h" 4 5 char *BADEQ; 6 char *NOMATCH; 7 char *BADVAR; 8 char *BADCOM; 9 10 int executing; 11 char *lp; 12 13 char lastc; 14 char eqformat[512] = "z"; 15 char stformat[512] = "X\"= \"^i"; 16 17 long ditto; 18 int lastcom = '='; 19 long locval; 20 long locmsk; 21 long expv; 22 23 /* command decoding */ 24 25 command(buf, defcom) 26 char *buf, defcom; 27 { 28 register itype, ptype, modifier, regptr; 29 int longpr, eqcom; 30 char wformat[1], savc; 31 register long w, savdot; 32 char *savlp=lp; 33 34 if (buf) { 35 if (*buf==EOR) 36 return (0); 37 lp=buf; 38 } 39 40 do { 41 if (adrflg=expr(0)) { 42 dot=expv; 43 ditto=dot; 44 } 45 adrval=dot; 46 cntflg = (rdc() == ',' && expr(0)); 47 if (cntflg) 48 cntval=expv; 49 else 50 cntval=1, lp--; 51 if (eol(rdc())) { 52 if (!adrflg) 53 dot=inkdot(dotinc); 54 lp--; lastcom=defcom; 55 } else 56 lastcom=lastc; 57 switch (lastcom&STRIP) { 58 59 case '/': 60 itype=DSP; ptype=DSYM; 61 goto trystar; 62 63 case '=': 64 itype=NSP; ptype=0; 65 goto trypr; 66 67 case '?': 68 itype=ISP; ptype=ISYM; 69 goto trystar; 70 71 trystar: 72 if (rdc()=='*') 73 lastcom |= QUOTE; 74 else 75 lp--; 76 if (lastcom"E) { 77 itype |= STAR; 78 ptype = (DSYM+ISYM)-ptype; 79 } 80 81 trypr: 82 longpr=0; eqcom=lastcom=='='; 83 switch (rdc()) { 84 85 case 'L': 86 longpr=1; 87 case 'l': 88 /*search for exp*/ 89 if (eqcom) 90 error(BADEQ); 91 dotinc=(longpr?4:2); savdot=dot; 92 expr(1); locval=expv; 93 if (expr(0)) 94 locmsk=expv; 95 else 96 locmsk = -1L; 97 if (!longpr) { 98 locmsk &= 0xFFFF; 99 locval &= 0xFFFF; 100 } 101 for (;;) { 102 w=get(dot,itype); 103 if (errflg || mkfault || 104 (w&locmsk)==locval) 105 break; 106 dot=inkdot(dotinc); 107 } 108 if (errflg) { 109 dot=savdot; 110 errflg=NOMATCH; 111 } 112 psymoff(dot,ptype,""); 113 break; 114 115 case 'W': 116 longpr=1; 117 case 'w': 118 if (eqcom) 119 error(BADEQ); 120 wformat[0]=lastc; expr(1); 121 do { 122 savdot=dot; 123 psymoff(dot,ptype,":%16t"); 124 exform(1,wformat,itype,ptype); 125 errflg=0; dot=savdot; 126 if (longpr) 127 put(dot,itype,expv); 128 else 129 put(dot,itype, 130 itol(expv,get(dot,itype))); 131 savdot=dot; 132 printf("=%8t"); 133 exform(1,wformat,itype,ptype); 134 printc(EOR); 135 } while (expr(0) && errflg==0); 136 dot=savdot; 137 chkerr(); 138 break; 139 140 default: 141 lp--; 142 getformat(eqcom ? eqformat : stformat); 143 if (!eqcom) 144 psymoff(dot,ptype,":%16t"); 145 scanform(cntval, 146 (eqcom?eqformat:stformat),itype,ptype); 147 } 148 break; 149 150 case '>': 151 lastcom=0; savc=rdc(); 152 if ((regptr=getreg(savc)) != -1) 153 *(int *)regptr = dot; 154 else if ((modifier=varchk(savc)) != -1) 155 var[modifier]=dot; 156 else 157 error(BADVAR); 158 break; 159 160 case '$': 161 lastcom=0; 162 printtrace(nextchar()); 163 break; 164 165 case ':': 166 if (executing) 167 break; 168 executing=1; subpcs(nextchar()); executing=0; 169 lastcom=0; 170 break; 171 172 case '\0': 173 break; 174 175 default: 176 error(BADCOM); 177 } 178 flushbuf(); 179 } while (rdc()==';'); 180 if (buf) 181 lp=savlp; 182 else 183 lp--; 184 return (adrflg && dot!=0); 185 } 186