|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.