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