xref: /original-bsd/sys/tahoe/stand/vdformat/cmd.c (revision 0999a820)
1 /*	cmd.c	1.2	86/11/04	*/
2 
3 #include	"vdfmt.h"
4 #include	"cmd.h"
5 
6 #define TRUE	1
7 #define FALSE	0
8 
9 #define	HELP	1
10 #define	STATUS	2
11 #define	KILL	3
12 #define	KQUIT	4
13 
14 static cmd_text_element	primary[] = {
15 	{ STATUS,	"!",		"" },
16 	{ HELP,		"HElp",		"" },
17 	{ KILL,		"KILL",		"" },
18 	{ KQUIT,	"QUIT",		"" },
19 	{ STATUS,	"STATus",	"" },
20 	{ HELP,		"?",		"" },
21 	{ 0,		"",		"" }
22 };
23 
24 
25 /*
26 */
27 
28 boolean confirm(token)
29 int	token;
30 {
31 	char	*action;
32 	char	query[50];
33 
34 	if(token == KILL)
35 		action = "kill";
36 	else
37 		action = "quit";
38 	sprintf(query, "Confirm %s operations", action);
39 	return get_yes_no(query);
40 }
41 
42 
43 /*
44 **
45 */
46 
47 get_text_cmd(table, tokens)
48 cmd_text_element	*table;
49 int			*tokens;
50 {
51 	extern boolean	get_yes_no();
52 	int		*t_ptr;
53 	char		line[133];
54 
55 	agets(line);
56 	/* Check for help, status, or kill */
57 	cmd_parse(primary, line, tokens);
58 	t_ptr = tokens;
59 	while(*t_ptr) {
60 		switch (*t_ptr) {
61 			case STATUS :
62 				cmd_status();
63 				break;
64 			case KQUIT :
65 			case KILL :
66 				if(confirm(*t_ptr) == true) {
67 					kill_processes = true;
68 					return 0;
69 				}
70 				break;
71 			default:
72 				help_text(table);
73 				break;
74 		}
75 		t_ptr++;
76 	}
77 	/* Now parse all the operator's commands */
78 	cmd_parse(table, line, tokens);
79 	return strlen(line);
80 }
81 
82 
83 /*
84 **
85 */
86 
87 cmd_intcmp(a, b)
88 int	*a, *b;
89 {
90 	if(*a==*b)
91 		return 0;
92 	if(*a<*b)
93 		return -1;
94 	return 1;
95 }
96 
97 
98 /*
99 **
100 */
101 
102 condition_list(tokens, sentinal)
103 int	*tokens, sentinal;
104 {
105 	register int	*t_ptr = tokens;
106 	register int	num_tok;
107 
108 	for(num_tok=0; *t_ptr++ != sentinal; num_tok++)
109 		;
110 	qsort(tokens, num_tok, sizeof(int), cmd_intcmp);
111 	/* compress out dups */
112 	while(*tokens != sentinal) {
113 		if(*tokens == *(tokens+1)) {
114 			for(t_ptr=tokens+1; *t_ptr != sentinal; t_ptr++) {
115 				*t_ptr = *(t_ptr+1);
116 			}
117 			continue;
118 		}
119 		tokens++;
120 	}
121 }
122 
123 
124 /*
125 **
126 */
127 
128 cmd_parse(table, line, tokens)
129 cmd_text_element	*table;
130 char			*line;
131 int			*tokens;
132 {
133 	char		*seperators = "\t ,.;:-~+/\\";
134 	register char	*tok_start;
135 	register int	*tok = tokens;
136 	char		save_buf[133];
137 
138 	strcpy(save_buf, line);
139 	tok_start = (char *)strtok((char *)save_buf, seperators);
140 	while(tok_start != NULL) {
141 		if(strlen(tok_start)) {
142 			if(*tok = cmd_search(table, tok_start)) {
143 				tok++;
144 			}
145 		}
146 		tok_start = (char *)strtok((char *)NULL, seperators);
147 	}
148 	*tok = 0;
149 	condition_list(tokens, 0);
150 }
151 
152 
153 /*
154 **
155 */
156 
157 cmd_search(table, command)
158 cmd_text_element	*table;
159 char			*command;
160 {
161 	register char	*tbl_ptr;
162 	register char	*cmd_ptr;
163 
164 	while(table->cmd_token != 0) {
165 		cmd_ptr = command;
166 		tbl_ptr = table->cmd_text;
167 		while(ismustmatch(*tbl_ptr)) {
168 			if(toupper(*cmd_ptr) != *tbl_ptr)
169 				break;
170 			cmd_ptr++;
171 			tbl_ptr++;
172 		}
173 		if((*tbl_ptr == 0) || !ismustmatch(*tbl_ptr))
174 			return table->cmd_token;
175 		table++;
176 	}
177 	return 0;
178 }
179 
180 
181 /*
182 **
183 */
184 
185 is_in_digit_table(table, token)
186 int	*table, token;
187 {
188 	while(*table != -1) {
189 		if(token == *table)
190 			return TRUE;
191 		table++;
192 	}
193 	return FALSE;
194 }
195 
196 
197 /*
198 **
199 */
200 
201 int *fill_in(tokens, table, start, end)
202 int	*tokens, *table, start, end;
203 {
204 
205 	if(start > end) {
206 		register int temp = end;
207 
208 		end = start;
209 		start = temp;
210 	}
211 	while((*table != -1) && (*table < start))
212 		table++;
213 	while((*table != -1) && (*table <= end)) {
214 		*tokens++ = *table++;
215 	}
216 	return tokens;
217 }
218 
219 /*
220 **
221 */
222 
223 get_digit_list(tokens, table, help)
224 int	*tokens, *table, (*help)();
225 {
226 	int		*tok_ptr;
227 	char		*ptr, line[133];
228 
229 	condition_list(table, -1);
230 	agets(line);
231 	if(!line[0]) {
232 		*tokens = -1;
233 		return;
234 	}
235 	/* Check for help, status, or kill */
236 	cmd_parse(primary, line, tokens);
237 	tok_ptr = tokens;
238 	while(*tok_ptr) {
239 		switch (*tok_ptr) {
240 			case STATUS :
241 				cmd_status();
242 				break;
243 			case KQUIT :
244 			case KILL :
245 				if(confirm(*tok_ptr)) {
246 					kill_processes = true;
247 					return;
248 				}
249 				break;
250 			default:
251 				(help)();
252 				break;
253 		}
254 		tok_ptr++;
255 	}
256 	tok_ptr = tokens;
257 	ptr = line;
258 	while(*ptr) {
259 		finddigit(ptr);
260 		if(sscanf(ptr, "%d", tok_ptr) > 0) {
261 			skipdigits(ptr);
262 			skip_junk(ptr);
263 			if((*ptr == '~') || (*ptr == '-')) {
264 				register int	start = *tok_ptr;
265 
266 				finddigit(ptr);
267 				if(sscanf(ptr, "%d", tok_ptr) > 0) {
268 					skipdigits(ptr);
269 					tok_ptr = fill_in(tok_ptr,
270 					    table, start, *tok_ptr);
271 					continue;
272 				}
273 				else
274 					*tok_ptr = start;
275 			}
276 			if(is_in_digit_table(table, *tok_ptr))
277 				tok_ptr++;
278 		}
279 	}
280 	*tok_ptr = -1;
281 	condition_list(tokens, -1);
282 }
283 
284 
285 
286 /*
287 **
288 */
289 
290 get_digit_cmd(help)
291 int	(*help)();
292 {
293 	int	tokens[20], *t_ptr;
294 	char	line[80];
295 	int	results;
296 
297 	agets(line);
298 	if(!*line)
299 		return -1;
300 	/* Check for help, status, or kill */
301 	cmd_parse(primary, line, tokens);
302 	t_ptr = tokens;
303 	while(*t_ptr) {
304 		switch (*t_ptr) {
305 			case STATUS :
306 				cmd_status();
307 				break;
308 			case KQUIT :
309 			case KILL :
310 				if(confirm(*t_ptr)) {
311 					kill_processes = true;
312 					return -1;
313 				}
314 				break;
315 			default:
316 				(*help)();
317 				break;
318 		}
319 		t_ptr++;
320 	}
321 	if(sscanf(line, "%d", &results) > 0)
322 		return results;
323 	return -1;
324 }
325 
326 
327 /*
328 **
329 */
330 
331 get_string_cmd(line, help)
332 char	*line;
333 int	(*help)();
334 {
335 	int	tokens[20], *t_ptr;
336 
337 	agets(line);
338 	if(!*line)
339 		return;
340 	/* Check for help, status, or kill */
341 	cmd_parse(primary, line, tokens);
342 	t_ptr = tokens;
343 	while(*t_ptr) {
344 		switch (*t_ptr) {
345 			case STATUS :
346 				cmd_status();
347 				break;
348 			case KQUIT :
349 			case KILL :
350 				if(confirm(*t_ptr)) {
351 					kill_processes = true;
352 					return;
353 				}
354 				break;
355 			default:
356 				(*help)();
357 				break;
358 		}
359 		t_ptr++;
360 	}
361 	while(*line) {
362 		*line = tolower(*line);
363 		line++;
364 	}
365 	return;
366 }
367 
368 
369 /*
370 **
371 */
372 
373 cmd_status()
374 {
375 	indent();
376 	switch (cur.state) {
377 		case cmd :
378 			print("Waiting for operator input.\n\n");
379 			break;
380 		default :
381 			status();
382 			break;
383 	}
384 	exdent(1);
385 }
386 
387 
388 /*
389 ** 	Vdget_yes_no is used to ask simple yes or no questions.  The question
390 ** prompt is supplied by the caller,  The question mark, possible responses,
391 ** and the default response is printed at the end of the prompt.  The routine
392 ** then reads the answer and returns a 1 if a 'y' is typed or no response was
393 ** given, otherwise, a zero is returned.
394 */
395 
396 boolean get_yes_no(str)
397 register char	*str;
398 {
399 	extern int	wait_for_char;
400 	char		answer[80];
401 	boolean		retval;
402 	int		old_wait_status = wait_for_char;
403 
404 	wait_for_char = 1;
405 	for(;;) {
406 		if(*str)
407 			print("%s", str);
408 		printf("? [Yes/No] ");
409 		agets(answer);
410 		if((answer[0] == 'Y') || (answer[0] == 'y')) {
411 			retval = true;
412 			break;
413 		}
414 		if((answer[0] == 'N') || (answer[0] == 'n')) {
415 			retval = false;
416 			break;
417 		}
418 		print("\n");
419 		print("A 'Yes' or 'No' must be entered!\n\n");
420 	}
421 	wait_for_char = old_wait_status;
422 	return retval;
423 }
424 
425 
426 /*
427 **
428 */
429 
430 get_next_digit(ptr)
431 char	*ptr;
432 {
433 	int	results;
434 
435 	finddigit(ptr);
436 	if(sscanf(ptr, "%d", &results) <= 0)
437 		return -1;
438 	return results;
439 }
440