|
|
| version 1.2.2.12, 2010/06/07 16:16:12 | version 1.2.2.15, 2010/06/08 08:43:47 |
|---|---|
| Line 391 bufComp(int idx, void * __restrict buffer) | Line 391 bufComp(int idx, void * __restrict buffer) |
| *app ? i++ : i, *app ? app++ : app); | *app ? i++ : i, *app ? app++ : app); |
| if (i) { | if (i) { |
| SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) | SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) { |
| if (cmd->cmd_level == buf->line_level && | if (cmd->cmd_level == buf->line_level && |
| !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) { | !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) { |
| j++; | if (strncmp(cmd->cmd_name, CLI_CMD_SEP, strlen(CLI_CMD_SEP))) { |
| c = cmd; | j++; |
| strlcat(szLine, " ", STRSIZ); | c = cmd; |
| strlcat(szLine, cmd->cmd_name, STRSIZ); | strlcat(szLine, " ", STRSIZ); |
| strlcat(szLine, cmd->cmd_name, STRSIZ); | |
| } | |
| } | } |
| } | |
| printf("i=%d j=%d c=%p name=%s comp=%p\n", i, j, c, c->cmd_name, c->cmd_comp); | if (i > 1 && c) { |
| if (i > 1 && j == 1 && c && c->cmd_comp) { | /* we are on argument of command and has complition info */ |
| /* we are on argument of command and has complition callback */ | j++; // always must be j > 1 ;) for arguments |
| printf("ima comp!\n"); | strlcpy(szLine, c->cmd_info, STRSIZ); |
| goto endcomp; | |
| } | } |
| } else { | } else { |
| /* we have valid char but i == 0, this case is illegal */ | /* we have valid char but i == 0, this case is illegal */ |
| Line 415 bufComp(int idx, void * __restrict buffer) | Line 417 bufComp(int idx, void * __restrict buffer) |
| /* we on 0 position of prompt, show commands for this level */ | /* we on 0 position of prompt, show commands for this level */ |
| SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) { | SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) { |
| if (cmd->cmd_level == buf->line_level) | if (cmd->cmd_level == buf->line_level) |
| j++; | if (strncmp(cmd->cmd_name, CLI_CMD_SEP, strlen(CLI_CMD_SEP))) { |
| c = cmd; | j++; |
| strlcat(szLine, " ", STRSIZ); | c = cmd; |
| strlcat(szLine, cmd->cmd_name, STRSIZ); | strlcat(szLine, " ", STRSIZ); |
| strlcat(szLine, cmd->cmd_name, STRSIZ); | |
| } | |
| } | } |
| } | } |
| Line 427 bufComp(int idx, void * __restrict buffer) | Line 431 bufComp(int idx, void * __restrict buffer) |
| printfNL(buf, 0); | printfNL(buf, 0); |
| write(buf->line_out, szLine, strlen(szLine)); | write(buf->line_out, szLine, strlen(szLine)); |
| printfNL(buf, 1); | printfNL(buf, 1); |
| printfEOL(buf, buf->line_len - 1, 1); | |
| printfEOL(buf, -1, 1); | |
| } | } |
| if (j == 1 && c) { | if (j == 1 && c) { |
| clrscrEOL(buf); | clrscrEOL(buf); |
| Line 458 bufHelp(int idx, void * __restrict buffer) | Line 464 bufHelp(int idx, void * __restrict buffer) |
| return RETCODE_ERR; | return RETCODE_ERR; |
| cli_Cmd_Help(buf, -1, NULL); | cli_Cmd_Help(buf, -1, NULL); |
| printfCR(buf, 1); | |
| printfEOL(buf, buf->line_len - 1, 1); | |
| printfEOL(buf, -1, 1); | |
| return RETCODE_OK; | return RETCODE_OK; |
| } | } |
| Line 492 cli_Printf(linebuffer_t * __restrict buffer, char *fmt | Line 500 cli_Printf(linebuffer_t * __restrict buffer, char *fmt |
| } | } |
| /* | /* |
| * cli_PrintHelp() Print help screen | |
| * @buffer = CLI buffer | |
| * return: none | |
| */ | |
| inline void | |
| cli_PrintHelp(linebuffer_t * __restrict buffer) | |
| { | |
| if (buffer) | |
| bufHelp(0, buffer); | |
| else | |
| cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); | |
| } | |
| /* | |
| * cli_BindKey() Bind function to key | * cli_BindKey() Bind function to key |
| * @key = key structure | * @key = key structure |
| * @buffer = CLI buffer | * @buffer = CLI buffer |
| Line 526 cli_BindKey(bindkey_t * __restrict key, linebuffer_t * | Line 549 cli_BindKey(bindkey_t * __restrict key, linebuffer_t * |
| * @funcCmd = Callback function when user call command | * @funcCmd = Callback function when user call command |
| * @csInfo = Inline information for command | * @csInfo = Inline information for command |
| * @csHelp = Help line when call help | * @csHelp = Help line when call help |
| * @anComp = Completion array terminated with NULL element, -1 complete commands, NULL nothing | |
| * return: RETCODE_ERR error, RETCODE_OK ok | * return: RETCODE_ERR error, RETCODE_OK ok |
| */ | */ |
| int | int |
| cli_addCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, | cli_addCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, |
| const char *csInfo, const char *csHelp, const char **anComp) | const char *csInfo, const char *csHelp) |
| { | { |
| struct tagCommand *cmd; | struct tagCommand *cmd; |
| if (!buffer || !csCmd || !funcCmd) { | if (!buffer || !csCmd) { |
| cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); | cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); |
| return RETCODE_ERR; | return RETCODE_ERR; |
| } | } |
| Line 549 cli_addCommand(linebuffer_t * __restrict buffer, const | Line 571 cli_addCommand(linebuffer_t * __restrict buffer, const |
| cmd->cmd_level = cliLevel; | cmd->cmd_level = cliLevel; |
| cmd->cmd_func = funcCmd; | cmd->cmd_func = funcCmd; |
| cmd->cmd_comp = (char**) anComp; | |
| cmd->cmd_len = strlcpy(cmd->cmd_name, csCmd, STRSIZ); | cmd->cmd_len = strlcpy(cmd->cmd_name, csCmd, STRSIZ); |
| if (csInfo) | if (csInfo) |
| strlcpy(cmd->cmd_info, csInfo, STRSIZ); | strlcpy(cmd->cmd_info, csInfo, STRSIZ); |
| Line 596 cli_delCommand(linebuffer_t * __restrict buffer, const | Line 617 cli_delCommand(linebuffer_t * __restrict buffer, const |
| * @funcCmd = Callback function when user call command | * @funcCmd = Callback function when user call command |
| * @csInfo = Inline information for command | * @csInfo = Inline information for command |
| * @csHelp = Help line when call help | * @csHelp = Help line when call help |
| * @anComp = Completion array terminated with NULL element, -1 complete commands, NULL nothing, | |
| * update only if funcCmd is not NULL | |
| * return: RETCODE_ERR error, RETCODE_OK ok | * return: RETCODE_ERR error, RETCODE_OK ok |
| */ | */ |
| int | int |
| cli_updCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, | cli_updCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, |
| const char *csInfo, const char *csHelp, const char **anComp) | const char *csInfo, const char *csHelp) |
| { | { |
| struct tagCommand *cmd; | struct tagCommand *cmd; |
| int ret = RETCODE_OK; | int ret = RETCODE_OK; |
| Line 616 cli_updCommand(linebuffer_t * __restrict buffer, const | Line 635 cli_updCommand(linebuffer_t * __restrict buffer, const |
| if (cmd->cmd_level == cliLevel && !strcmp(cmd->cmd_name, csCmd)) { | if (cmd->cmd_level == cliLevel && !strcmp(cmd->cmd_name, csCmd)) { |
| ret = 1; | ret = 1; |
| if (funcCmd) { | if (funcCmd) |
| cmd->cmd_func = funcCmd; | cmd->cmd_func = funcCmd; |
| cmd->cmd_comp = (char**) anComp; | |
| } | |
| if (csInfo) | if (csInfo) |
| strlcpy(cmd->cmd_info, csInfo, STRSIZ); | strlcpy(cmd->cmd_info, csInfo, STRSIZ); |
| if (csHelp) | if (csHelp) |
| Line 939 cliInit(int fin, int fout, const char *prompt) | Line 956 cliInit(int fin, int fout, const char *prompt) |
| memset(keys, 0, sizeof(bindkey_t) * (MAX_BINDKEY + 1)); | memset(keys, 0, sizeof(bindkey_t) * (MAX_BINDKEY + 1)); |
| /* add helper functions */ | /* add helper functions */ |
| cli_addCommand(buffer, "exit", 0, cli_Cmd_Exit, "exit <cr>", "Exit from console", NULL); | cli_addCommand(buffer, "exit", 0, cli_Cmd_Exit, "exit <cr>", "Exit from console"); |
| cli_addCommand(buffer, "help", 0, cli_Cmd_Help, "help [command] <cr>", "Help screen", | cli_addCommand(buffer, "help", 0, cli_Cmd_Help, "help [command] <cr>", "Help screen"); |
| (const char**) -1); | cli_addCommand(buffer, "-------", 0, NULL, "-------------------------", NULL); |
| /* fill key bindings */ | /* fill key bindings */ |
| // ascii chars & ctrl+chars | // ascii chars & ctrl+chars |
| Line 1242 cliNetLoop(linebuffer_t * __restrict buffer, const cha | Line 1259 cliNetLoop(linebuffer_t * __restrict buffer, const cha |
| case 0: | case 0: |
| close(sock); | close(sock); |
| if (buffer) { | if (buffer) |
| ret = cliLoop(buffer, csHistFile) < 0 ? 1 : 0; | ret = cliLoop(buffer, csHistFile) < 0 ? 1 : 0; |
| cliEnd(buffer); | else |
| } else | |
| cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); | cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); |
| /* spawn Shell mode */ | /* spawn Shell mode */ |
| Line 1341 cliLoop(linebuffer_t * __restrict buffer, const char * | Line 1357 cliLoop(linebuffer_t * __restrict buffer, const char * |
| int ret = RETCODE_OK; | int ret = RETCODE_OK; |
| struct tagCommand *cmd; | struct tagCommand *cmd; |
| /* | |
| char **cli_stdCompletion(const char *text, int start, int end) | |
| { | |
| register int i; | |
| char **matches = NULL; | |
| char *cmdCompGet(const char *text, int state) | |
| { | |
| int len = strlen(text); | |
| for (i = state; cmdList[i].cmd_name; i++) { | |
| if (strncmp(cmdList[i].cmd_name, "---", 3) && | |
| !strncmp(cmdList[i].cmd_name, text, len)) | |
| return strdup(cmdList[i].cmd_name); | |
| } | |
| return NULL; | |
| } | |
| if (!start) | |
| matches = rl_completion_matches(text, cmdCompGet); | |
| else | |
| for (i = 0; cmdList[i].cmd_name; i++) { | |
| if (!cmdList[i].cmd_comp) | |
| continue; | |
| if (!strncmp(rl_line_buffer, cmdList[i].cmd_name, strlen(cmdList[i].cmd_name))) | |
| matches = rl_completion_matches(text, cmdList[i].cmd_comp); | |
| } | |
| return matches; | |
| } | |
| */ | |
| /* --- main body of CLI --- */ | /* --- main body of CLI --- */ |
| if (cli_loadHistory(buffer, csHistFile) == RETCODE_ERR) | if (cli_loadHistory(buffer, csHistFile) == RETCODE_ERR) |
| Line 1414 cliLoop(linebuffer_t * __restrict buffer, const char * | Line 1394 cliLoop(linebuffer_t * __restrict buffer, const char * |
| cli_Printf(buffer, "\nCommand '%s' not found!\n", items[0]); | cli_Printf(buffer, "\nCommand '%s' not found!\n", items[0]); |
| ret = -1; | ret = -1; |
| } else | } else |
| ret = cmd->cmd_func(buffer, i, items); | if (cmd->cmd_func) |
| ret = cmd->cmd_func(buffer, i, items); | |
| else { | |
| clrscrEOL(buffer); | |
| printfCR(buffer, 1); | |
| } | |
| } | } |
| cli_freeLine(buffer); | cli_freeLine(buffer); |