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