|
|
| version 1.2.2.9, 2010/06/07 13:47:42 | version 1.2.2.12, 2010/06/07 16:16:12 |
|---|---|
| Line 12 | Line 12 |
| #pragma GCC visibility push(hidden) | #pragma GCC visibility push(hidden) |
| /* | |
| commands_t cli_stdCmds[] = { | |
| { "test", cli_Cmd_Unsupported, "Test - Don`t use default command structure!", "test <cr>", cli_Comp_Filename }, | |
| { "-------", NULL, "---------------------", NULL, NULL }, | |
| { "help", cli_Cmd_Help, "Help screen", "help [command] <cr>", NULL }, | |
| { "exit", cli_Cmd_Exit, "Exit from console", "exit <cr>", NULL }, | |
| { NULL, NULL, NULL, NULL } | |
| }; | |
| */ | |
| // ------------------------------------------------ | // ------------------------------------------------ |
| int cli_Errno; | int cli_Errno; |
| Line 108 printfNL(linebuffer_t * __restrict buf, int prompt) | Line 98 printfNL(linebuffer_t * __restrict buf, int prompt) |
| } | } |
| } | } |
| static inline void | |
| printfCLI(linebuffer_t * __restrict buf, const unsigned char *text, int textlen, int prompt) | |
| { | |
| if (buf && text && textlen) { | |
| if (prompt && buf->line_prompt) | |
| write(buf->line_out, buf->line_prompt, buf->line_bol); | |
| write(buf->line_out, text, textlen); | |
| } | |
| } | |
| // ------------------------------------------------------------ | // ------------------------------------------------------------ |
| static int | static int |
| Line 145 bufCHAR(int idx, void * __restrict buffer) | Line 124 bufCHAR(int idx, void * __restrict buffer) |
| write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); | write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); |
| if (buf->line_mode == LINEMODE_INS) { | if (buf->line_mode == LINEMODE_INS) { |
| printfCLI(buf, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, | write(buf->line_out, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, |
| buf->line_len - buf->line_eol, 0); | buf->line_len - buf->line_eol); |
| printfEOL(buf, -1, 1); | printfEOL(buf, -1, 1); |
| } | } |
| return RETCODE_OK; | return RETCODE_OK; |
| Line 165 bufEOL(int idx, void * __restrict buffer) | Line 144 bufEOL(int idx, void * __restrict buffer) |
| static int | static int |
| bufEOF(int idx, void * __restrict buffer) | bufEOF(int idx, void * __restrict buffer) |
| { | { |
| linebuffer_t *buf = buffer; | /* |
| if (!buffer || idx < 0 || idx > MAX_BINDKEY) | if (!buffer || idx < 0 || idx > MAX_BINDKEY) |
| return RETCODE_ERR; | return RETCODE_ERR; |
| */ | |
| write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); | |
| return RETCODE_EOF; | return RETCODE_EOF; |
| } | } |
| Line 388 static int | Line 366 static int |
| bufComp(int idx, void * __restrict buffer) | bufComp(int idx, void * __restrict buffer) |
| { | { |
| linebuffer_t *buf = buffer; | linebuffer_t *buf = buffer; |
| char *str, *s, **app, *items[MAX_PROMPT_ITEMS]; | char *str, *s, **app, *items[MAX_PROMPT_ITEMS], szLine[STRSIZ]; |
| register int i; | register int i, j; |
| struct tagCommand *cmd, *c; | |
| int pos, ret = RETCODE_OK; | |
| if (!buffer || idx < 0 || idx > MAX_BINDKEY) | if (!buffer || idx < 0 || idx > MAX_BINDKEY) |
| return RETCODE_ERR; | return RETCODE_ERR; |
| Line 402 bufComp(int idx, void * __restrict buffer) | Line 382 bufComp(int idx, void * __restrict buffer) |
| io_TrimStr((u_char*) s); | io_TrimStr((u_char*) s); |
| } | } |
| i = j = 0; | |
| c = NULL; | |
| memset(szLine, 0, STRSIZ); | |
| if (*s) { | if (*s) { |
| memset(items, 0, sizeof(char*) * MAX_PROMPT_ITEMS); | memset(items, 0, sizeof(char*) * MAX_PROMPT_ITEMS); |
| for (app = items, i = 0; app < items + MAX_PROMPT_ITEMS - 1 && (*app = strsep(&s, " \t")); | for (app = items, i = 0; app < items + MAX_PROMPT_ITEMS - 1 && (*app = strsep(&s, " \t")); |
| *app ? i++ : i, *app ? app++ : app); | *app ? i++ : i, *app ? app++ : app); |
| // SLIST_FOREACH(cmd, &buf->line_cmds; cmd_next) | if (i) { |
| // if (!strncmp(cmd->cmd_name, items[i - 1], strlen(items[i - 1]))) | SLIST_FOREACH(cmd, &buf->line_cmds, cmd_next) |
| if (cmd->cmd_level == buf->line_level && | |
| !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) { | |
| j++; | |
| c = cmd; | |
| 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 && j == 1 && c && c->cmd_comp) { | |
| /* we are on argument of command and has complition callback */ | |
| printf("ima comp!\n"); | |
| goto endcomp; | |
| } | |
| } else { | |
| /* we have valid char but i == 0, this case is illegal */ | |
| ret = RETCODE_ERR; | |
| goto endcomp; | |
| } | |
| } 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) | |
| j++; | |
| c = cmd; | |
| strlcat(szLine, " ", STRSIZ); | |
| strlcat(szLine, cmd->cmd_name, STRSIZ); | |
| } | |
| } | } |
| /* completion show actions ... */ | |
| if (j > 1 && c) { | |
| printfNL(buf, 0); | |
| write(buf->line_out, szLine, strlen(szLine)); | |
| printfNL(buf, 1); | |
| } | |
| if (j == 1 && c) { | |
| clrscrEOL(buf); | |
| cli_freeLine(buf); | |
| pos = buf->line_eol - buf->line_bol; | |
| buf->line_len += c->cmd_len + 1; | |
| buf->line_eol += c->cmd_len + 1; | |
| memcpy(buf->line_buf + pos, c->cmd_name, c->cmd_len); | |
| buf->line_buf[pos + c->cmd_len] = (u_char) *K_SPACE; | |
| buf->line_buf[buf->line_len - 1] = 0; | |
| printfEOL(buf, -1, 1); | |
| } | |
| endcomp: | |
| free(str); | free(str); |
| return RETCODE_OK; | return ret; |
| } | } |
| static int | static int |