--- libaitcli/src/aitcli.c 2013/10/08 09:18:45 1.8.2.2 +++ libaitcli/src/aitcli.c 2013/10/08 12:01:59 1.8.2.8 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.8.2.2 2013/10/08 09:18:45 misho Exp $ +* $Id: aitcli.c,v 1.8.2.8 2013/10/08 12:01:59 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -93,8 +93,6 @@ clrscrEOL(linebuffer_t * __restrict buf) for (i = 0; i < buf->line_len; i++) write(buf->line_out, K_SPACE, 1); - - buf->line_level ^= buf->line_level; } } @@ -105,7 +103,6 @@ printfEOL(linebuffer_t * __restrict buf, int len, int if (prompt && buf->line_prompt) { write(buf->line_out, K_CR, 1); write(buf->line_out, buf->line_prompt, buf->line_bol); - buf->line_level ^= buf->line_level; } write(buf->line_out, buf->line_buf, len == -1 ? @@ -128,11 +125,9 @@ printfNL(linebuffer_t * __restrict buf, int prompt) if (buf) { write(buf->line_out, K_ENTER, 1); - if (prompt) { + if (prompt) if (prompt && buf->line_prompt) write(buf->line_out, buf->line_prompt, buf->line_bol); - buf->line_level ^= buf->line_level; - } } } @@ -431,7 +426,7 @@ bufComp(int idx, void * __restrict cli_buffer) if (i) { SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) { - if (cmd->cmd_level == buf->line_level && + if (cmd->cmd_level & (1 << buf->line_level) && !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) { if (strncmp(cmd->cmd_name, CLI_CMD_SEP, @@ -440,7 +435,6 @@ bufComp(int idx, void * __restrict cli_buffer) c = cmd; strlcat(szLine, " ", STRSIZ); strlcat(szLine, cmd->cmd_name, STRSIZ); - buf->line_level++; } } } @@ -458,13 +452,12 @@ bufComp(int idx, void * __restrict cli_buffer) } else { /* we on 0 position of prompt, show commands for this level */ SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) { - if (cmd->cmd_level == buf->line_level) + if (cmd->cmd_level & (1 << buf->line_level)) if (strncmp(cmd->cmd_name, CLI_CMD_SEP, strlen(CLI_CMD_SEP))) { j++; c = cmd; strlcat(szLine, " ", STRSIZ); strlcat(szLine, cmd->cmd_name, STRSIZ); - buf->line_level++; } } } @@ -506,14 +499,31 @@ bufHelp(int idx, void * __restrict cli_buffer) if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; - cli_Cmd_Help(buf, -1, NULL); + cli_Cmd_Help(buf, buf->line_level, NULL); printfEOL(buf, buf->line_len - 1, 1); printfEOL(buf, -1, 1); return RETCODE_OK; } +static int +bufEndNode(int idx, void * __restrict cli_buffer) +{ + linebuffer_t *buf = cli_buffer; + if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) + return RETCODE_ERR; + + if (buf->line_level > 0) { + printfNL(cli_buffer, 0); + buf->line_level--; + cli_Printf(buf, "Enter to config level %d\n", buf->line_level); + } + + return bufCLR(idx, cli_buffer); +} + + /* * cli_Printf() - Send message to CLI session * @@ -593,7 +603,7 @@ cli_BindKey(bindkey_t * __restrict key, linebuffer_t * * * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * @funcCmd = Callback function when user call command * @csInfo = Inline information for command * @csHelp = Help line when call help @@ -634,7 +644,7 @@ cli_addCommand(linebuffer_t * __restrict cli_buffer, c * * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * return: RETCODE_ERR error, RETCODE_OK ok */ int @@ -664,7 +674,7 @@ cli_delCommand(linebuffer_t * __restrict cli_buffer, c * * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * @funcCmd = Callback function when user call command * @csInfo = Inline information for command * @csHelp = Help line when call help @@ -683,10 +693,11 @@ cli_updCommand(linebuffer_t * __restrict cli_buffer, c return RETCODE_ERR; } - SLIST_FOREACH(cmd, &cli_buffer->line_cmds, cmd_next) - if (cmd->cmd_level == cliLevel && !strcmp(cmd->cmd_name, csCmd)) { - ret = 1; - + SLIST_FOREACH(cmd, &cli_buffer->line_cmds, cmd_next) + if ((!cmd->cmd_level || cmd->cmd_level == cliLevel) && + !strcmp(cmd->cmd_name, csCmd)) { + if (!cmd->cmd_level) + cmd->cmd_level = cliLevel; if (funcCmd) cmd->cmd_func = funcCmd; if (csInfo) @@ -1016,9 +1027,16 @@ cliInit(int fin, int fout, const char *prompt) memset(keys, 0, sizeof(bindkey_t) * (MAX_BINDKEY + 1)); /* add helper functions */ - cli_addCommand(cli_buffer, "exit", 0, cli_Cmd_Exit, "exit ", "Exit from console"); - cli_addCommand(cli_buffer, "help", 0, cli_Cmd_Help, "help [command] ", "Help screen"); - cli_addCommand(cli_buffer, "-------", 0, NULL, "-------------------------", NULL); + cli_addCommand(cli_buffer, "exit", 1, cli_Cmd_Exit, "exit ", "Exit from console"); + cli_addCommand(cli_buffer, "help", -1, cli_Cmd_Help, "help [command] ", "Help screen"); + cli_addCommand(cli_buffer, "-------", -1, NULL, "-------------------------", NULL); + cli_addCommand(cli_buffer, "where", -1, cli_Cmd_WhereAmI, "where ", + "Query current level of console"); + cli_addCommand(cli_buffer, "top", -1, cli_Cmd_Top, "top ", "Top level of console"); + cli_addCommand(cli_buffer, "end", -1, cli_Cmd_End, "end ", "End level of console"); + cli_addCommand(cli_buffer, "config", -1, cli_Cmd_Config, "config ", + "Config next level of console"); + cli_addCommand(cli_buffer, "-------", -1, NULL, "-------------------------", NULL); /* fill key bindings */ /* ascii chars & ctrl+chars */ @@ -1040,6 +1058,8 @@ cliInit(int fin, int fout, const char *prompt) keys[i].key_func = bufEND; if (cli_buffer->line_prompt && i == *K_TAB) keys[i].key_func = bufComp; + if (cli_buffer->line_prompt && i == *K_CTRL_Z) + keys[i].key_func = bufEndNode; if (i >= *K_SPACE && i < *K_BACKSPACE) keys[i].key_func = bufCHAR; if (i > *K_BACKSPACE && i < 0xff) @@ -1476,6 +1496,8 @@ cliLoop(linebuffer_t * __restrict cli_buffer, const ch // exec_cmd ... i = 0; SLIST_FOREACH(cmd, &cli_buffer->line_cmds, cmd_next) { + if (!(cmd->cmd_level & (1 << cli_buffer->line_level))) + continue; if (*items[0] && !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) break; else @@ -1488,7 +1510,8 @@ cliLoop(linebuffer_t * __restrict cli_buffer, const ch } else if (cmd->cmd_func) { cli_Printf(cli_buffer, "\n"); - ret = cmd->cmd_func(cli_buffer, i, items); + ret = cmd->cmd_func(cli_buffer, + cli_buffer->line_level, items); } else { clrscrEOL(cli_buffer); printfCR(cli_buffer, 1);