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&QUOTE) {
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