|
|
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.