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