Annotation of libaitio/src/cli.c, revision 1.1.2.1

1.1.2.1 ! misho       1: /*************************************************************************
        !             2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: url.c,v 1.2 2010/03/09 09:26:27 misho Exp $
        !             7: *
        !             8: *************************************************************************/
        !             9: #include "global.h"
        !            10: 
        !            11: 
        !            12: static int cmd_exit(void *cmds, FILE *out, char ** __restrict args)
        !            13: {
        !            14:        return 1;
        !            15: }
        !            16: 
        !            17: static int cmd_help(void *cmds, FILE *out, char ** __restrict args)
        !            18: {
        !            19:        register int i;
        !            20:        ioCommands_t *commands = cmds;
        !            21: 
        !            22:        if (!cmds)
        !            23:                return -1;
        !            24: 
        !            25:        if (!args) {
        !            26:                fprintf(out, "\n");
        !            27:                for (i = 0; commands[i].cmd_name; i++)
        !            28:                        fprintf(out, "%s\t\t%s\n", commands[i].cmd_name, commands[i].cmd_doc);
        !            29:        } else {
        !            30:                if (!args[1])
        !            31:                        fprintf(out, "Help screen::\n");
        !            32:                else
        !            33:                        if (!strncmp(args[1], "---", 3))
        !            34:                                return 0;
        !            35: 
        !            36:                for (i = 0; commands[i].cmd_name; i++) {
        !            37:                        if (args[1] && strcmp(args[1], commands[i].cmd_name))
        !            38:                                continue;
        !            39: 
        !            40:                        fprintf(out, "%s%s\t\t%s\n", args[1] ? "Syntax::\n\t" : "", commands[i].cmd_name, 
        !            41:                                        args[1] ? commands[i].cmd_help : commands[i].cmd_doc);
        !            42:                }
        !            43:        }
        !            44: 
        !            45:        return 0;
        !            46: }
        !            47: 
        !            48: static int cmd_unsupported(void *cmds, FILE *out, char ** __restrict args)
        !            49: {
        !            50:        fprintf(out, "Command %s not supported in this version ...\n", args[0]);
        !            51:        return 0;
        !            52: }
        !            53: 
        !            54: // ------------------------------------------------------------
        !            55: 
        !            56: #pragma GCC visibility push(hidden)
        !            57: 
        !            58: ioCommands_t io_stdCmds[] = {
        !            59:        { "test", cmd_unsupported, "Test - Don`t use default command structure!", "test <cr>", NULL }, 
        !            60:        { "-------", NULL, "---------------------", NULL, NULL }, 
        !            61:        { "help", cmd_help, "Help screen", "help [command] <cr>", NULL }, 
        !            62:        { "exit", cmd_exit, "Exit from console", "exit <cr>", NULL }, 
        !            63:        { NULL, NULL, NULL, NULL }
        !            64: };
        !            65: 
        !            66: #pragma GCC visibility pop
        !            67: 
        !            68: // ------------------------------------------------------------
        !            69: 
        !            70: /*
        !            71:  * ioCLIInit() Initialize CLI features
        !            72:  * @cmdList = Commands list
        !            73:  * @out = Output handle
        !            74:  * @cmdComplete = Completion function
        !            75:  * @cmdEntry = Compentry function
        !            76:  * return: none
        !            77: */
        !            78: void ioCLIInit(ioCommands_t *cmdList, FILE *out, io_Completion_t *cmdComplete, io_CompEntry_t *cmdEntry)
        !            79: {
        !            80:        ioCommands_t *cmds = cmdList ? cmdList : io_stdCmds;
        !            81: 
        !            82:        inline int inline_help()
        !            83:        {
        !            84:                cmd_help(cmds, out, NULL);
        !            85:                rl_on_new_line();
        !            86:                return 0;
        !            87:        }
        !            88: 
        !            89:        rl_bind_key('?', inline_help);
        !            90:        // command completon
        !            91:        rl_attempted_completion_function = cmdComplete;
        !            92:        rl_completion_entry_function = cmdEntry;
        !            93: }
        !            94: 
        !            95: /*
        !            96:  * ioCLIExec() Execute CLI main loop
        !            97:  * @cmdList = Commands list
        !            98:  * @out = Output handle
        !            99:  * @csPrompt = Prompt text
        !           100:  * return: -1 error, 0 = exit w/^+D, 1 done.
        !           101: */
        !           102: int ioCLIExec(ioCommands_t *cmdList, FILE *out, const char *csPrompt)
        !           103: {
        !           104:        char *line, *s, *t, **app, *items[20];
        !           105:        int ret = 0;
        !           106:        register int i;
        !           107:        ioCommands_t *cmd = NULL;
        !           108: 
        !           109:        if (!cmdList)
        !           110:                return -1;
        !           111: 
        !           112:        do {
        !           113:                line = readline(csPrompt);
        !           114:                if (!line) {    // ^+d
        !           115:                        fprintf(out, "\n");
        !           116:                        fflush(out);
        !           117:                        break;
        !           118:                }
        !           119:                // clear whitespaces
        !           120:                for (s = line; isspace(*s); s++);
        !           121:                if (*s) {
        !           122:                        for (t = s + strlen(s) - 1; t > s && isspace(*t); t--);
        !           123:                        *++t = 0;
        !           124:                }
        !           125: 
        !           126:                if (*s) {
        !           127:                        add_history(s);
        !           128: 
        !           129:                        memset(items, 0, sizeof(char*) * 20);
        !           130:                        for (app = items; app < items + 19 && (*app = strsep(&s, " \t")); *app ? app++ : app);
        !           131: 
        !           132:                        /*
        !           133:                        for (i = 0; i < 20; i++)
        !           134:                                printf("i=%d %s\n", i, items[i]);
        !           135:                                */
        !           136: 
        !           137:                        // exec_cmd ...
        !           138:                        for (cmd = NULL, i = 0; cmdList[i].cmd_name; i++)
        !           139:                                if (*items[0] && !strncmp(cmdList[i].cmd_name, items[0], strlen(items[0]))) {
        !           140:                                        cmd = &cmdList[i];
        !           141:                                        break;
        !           142:                                }
        !           143:                        if (!cmd) {
        !           144:                                fprintf(out, "Command '%s' not found!\n", items[0]);
        !           145:                                ret = -1;
        !           146:                        } else
        !           147:                                ret = cmd->cmd_func(cmdList, out, items);
        !           148:                }
        !           149: 
        !           150:                free(line);
        !           151:        } while (ret < 1);
        !           152: 
        !           153:        return ret;
        !           154: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>