Annotation of 43BSDReno/sys/tahoestand/vdformat/cmd.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.