1*30117Ssam /* kdb_command.c 7.2 86/11/20 */ 230106Ssam 330106Ssam #include "../kdb/defs.h" 430106Ssam 530106Ssam char *BADEQ; 630106Ssam char *NOMATCH; 730106Ssam char *BADVAR; 830106Ssam char *BADCOM; 930106Ssam 1030106Ssam int executing; 1130106Ssam char *lp; 1230106Ssam 1330106Ssam char lastc; 1430106Ssam char eqformat[512] = "z"; 1530106Ssam char stformat[512] = "X\"= \"^i"; 1630106Ssam 1730106Ssam long ditto; 1830106Ssam int lastcom = '='; 1930106Ssam long locval; 2030106Ssam long locmsk; 2130106Ssam long expv; 2230106Ssam 2330106Ssam /* command decoding */ 2430106Ssam 2530106Ssam command(buf, defcom) 2630106Ssam char *buf, defcom; 2730106Ssam { 2830106Ssam register itype, ptype, modifier, regptr; 2930106Ssam int longpr, eqcom; 3030106Ssam char wformat[1], savc; 3130106Ssam register long w, savdot; 3230106Ssam char *savlp=lp; 3330106Ssam 3430106Ssam if (buf) { 3530106Ssam if (*buf==EOR) 36*30117Ssam return (0); 3730106Ssam lp=buf; 3830106Ssam } 3930106Ssam 4030106Ssam do { 4130106Ssam if (adrflg=expr(0)) { 4230106Ssam dot=expv; 4330106Ssam ditto=dot; 4430106Ssam } 4530106Ssam adrval=dot; 46*30117Ssam cntflg = (rdc() == ',' && expr(0)); 47*30117Ssam if (cntflg) 48*30117Ssam cntval=expv; 4930106Ssam else 50*30117Ssam cntval=1, lp--; 5130106Ssam if (eol(rdc())) { 5230106Ssam if (!adrflg) 5330106Ssam dot=inkdot(dotinc); 5430106Ssam lp--; lastcom=defcom; 5530106Ssam } else 5630106Ssam lastcom=lastc; 5730106Ssam switch (lastcom&STRIP) { 5830106Ssam 5930106Ssam case '/': 6030106Ssam itype=DSP; ptype=DSYM; 6130106Ssam goto trystar; 6230106Ssam 6330106Ssam case '=': 6430106Ssam itype=NSP; ptype=0; 6530106Ssam goto trypr; 6630106Ssam 6730106Ssam case '?': 6830106Ssam itype=ISP; ptype=ISYM; 6930106Ssam goto trystar; 7030106Ssam 7130106Ssam trystar: 7230106Ssam if (rdc()=='*') 7330106Ssam lastcom |= QUOTE; 7430106Ssam else 7530106Ssam lp--; 7630106Ssam if (lastcom"E) { 7730106Ssam itype |= STAR; 7830106Ssam ptype = (DSYM+ISYM)-ptype; 7930106Ssam } 8030106Ssam 8130106Ssam trypr: 82*30117Ssam longpr=0; eqcom=lastcom=='='; 8330106Ssam switch (rdc()) { 8430106Ssam 8530106Ssam case 'L': 86*30117Ssam longpr=1; 8730106Ssam case 'l': 8830106Ssam /*search for exp*/ 8930106Ssam if (eqcom) 9030106Ssam error(BADEQ); 9130106Ssam dotinc=(longpr?4:2); savdot=dot; 9230106Ssam expr(1); locval=expv; 9330106Ssam if (expr(0)) 9430106Ssam locmsk=expv; 9530106Ssam else 9630106Ssam locmsk = -1L; 9730106Ssam if (!longpr) { 9830106Ssam locmsk &= 0xFFFF; 9930106Ssam locval &= 0xFFFF; 10030106Ssam } 10130106Ssam for (;;) { 10230106Ssam w=get(dot,itype); 10330106Ssam if (errflg || mkfault || 10430106Ssam (w&locmsk)==locval) 10530106Ssam break; 10630106Ssam dot=inkdot(dotinc); 10730106Ssam } 10830106Ssam if (errflg) { 10930106Ssam dot=savdot; 11030106Ssam errflg=NOMATCH; 11130106Ssam } 11230106Ssam psymoff(dot,ptype,""); 11330106Ssam break; 11430106Ssam 11530106Ssam case 'W': 116*30117Ssam longpr=1; 11730106Ssam case 'w': 11830106Ssam if (eqcom) 11930106Ssam error(BADEQ); 12030106Ssam wformat[0]=lastc; expr(1); 12130106Ssam do { 12230106Ssam savdot=dot; 12330106Ssam psymoff(dot,ptype,":%16t"); 12430106Ssam exform(1,wformat,itype,ptype); 12530106Ssam errflg=0; dot=savdot; 12630106Ssam if (longpr) 12730106Ssam put(dot,itype,expv); 12830106Ssam else 12930106Ssam put(dot,itype, 13030106Ssam itol(expv,get(dot,itype))); 13130106Ssam savdot=dot; 13230106Ssam printf("=%8t"); 13330106Ssam exform(1,wformat,itype,ptype); 13430106Ssam printc(EOR); 13530106Ssam } while (expr(0) && errflg==0); 13630106Ssam dot=savdot; 13730106Ssam chkerr(); 13830106Ssam break; 13930106Ssam 14030106Ssam default: 14130106Ssam lp--; 14230106Ssam getformat(eqcom ? eqformat : stformat); 14330106Ssam if (!eqcom) 14430106Ssam psymoff(dot,ptype,":%16t"); 14530106Ssam scanform(cntval, 14630106Ssam (eqcom?eqformat:stformat),itype,ptype); 14730106Ssam } 14830106Ssam break; 14930106Ssam 15030106Ssam case '>': 15130106Ssam lastcom=0; savc=rdc(); 15230106Ssam if ((regptr=getreg(savc)) != -1) 15330106Ssam *(int *)regptr = dot; 15430106Ssam else if ((modifier=varchk(savc)) != -1) 15530106Ssam var[modifier]=dot; 15630106Ssam else 15730106Ssam error(BADVAR); 15830106Ssam break; 15930106Ssam 16030106Ssam case '$': 16130106Ssam lastcom=0; 16230106Ssam printtrace(nextchar()); 16330106Ssam break; 16430106Ssam 16530106Ssam case ':': 166*30117Ssam if (executing) 167*30117Ssam break; 168*30117Ssam executing=1; subpcs(nextchar()); executing=0; 169*30117Ssam lastcom=0; 17030106Ssam break; 17130106Ssam 172*30117Ssam case '\0': 17330106Ssam break; 17430106Ssam 17530106Ssam default: 17630106Ssam error(BADCOM); 17730106Ssam } 17830106Ssam flushbuf(); 17930106Ssam } while (rdc()==';'); 18030106Ssam if (buf) 18130106Ssam lp=savlp; 18230106Ssam else 18330106Ssam lp--; 18430106Ssam return (adrflg && dot!=0); 18530106Ssam } 186