Annotation of cci/sys/stand/vdfmt/cmd.c, revision 1.1

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

unix.superglobalmegacorp.com

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