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