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