--- libaitcli/example/t.c 2010/06/03 23:29:32 1.1.2.2 +++ libaitcli/example/t.c 2010/06/04 11:05:18 1.1.2.4 @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -36,7 +37,6 @@ printfEOL(linebuffer_t * __restrict buf, int len, int if (prompt && buf->line_prompt) write(buf->line_out, buf->line_prompt, buf->line_bol); -// printf("buf=%s eol=%d bol=%d len=%d\n", buf->line_buf, buf->line_eol, buf->line_bol, buf->line_len); write(buf->line_out, buf->line_buf, len == -1 ? buf->line_eol - buf->line_bol: len); } } @@ -70,13 +70,17 @@ catCh2Buf(int idx, void * __restrict buffer) { linebuffer_t *buf = buffer; int pos; + unsigned char b[BUFSIZ]; if (!buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; pos = buf->line_eol - buf->line_bol; - if (buf->line_eol == buf->line_len - 1) + if (buf->line_mode == LINEMODE_INS) + memmove(buf->line_buf + pos + buf->line_keys[idx].key_len, buf->line_buf + pos, + buf->line_len - buf->line_eol); + if (buf->line_mode == LINEMODE_INS || buf->line_eol == buf->line_len - 1) buf->line_len += buf->line_keys[idx].key_len; buf->line_eol += buf->line_keys[idx].key_len; @@ -84,6 +88,12 @@ catCh2Buf(int idx, void * __restrict buffer) buf->line_buf[buf->line_len - 1] = 0; write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); + + if (buf->line_mode == LINEMODE_INS) { + printfCLI(buf, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, + buf->line_len - buf->line_eol, 0); + printfEOL(buf, -1, 1); + } return RETCODE_OK; } @@ -211,8 +221,12 @@ bufBS(int idx, void * __restrict buffer) buf->line_eol--; buf->line_len--; - buf->line_buf[buf->line_eol - buf->line_bol] = 0; + memmove(buf->line_buf + buf->line_eol - buf->line_bol, + buf->line_buf + buf->line_eol - buf->line_bol + 1, + buf->line_len - buf->line_eol); + buf->line_buf[buf->line_len - 1] = 0; + printfEOL(buf, buf->line_len - 1, 1); printfEOL(buf, -1, 1); } @@ -220,6 +234,26 @@ bufBS(int idx, void * __restrict buffer) } static int +bufBTAB(int idx, void * __restrict buffer) +{ + linebuffer_t *buf = buffer; + + if (!buffer || idx < 0 || idx > MAX_BINDKEY) + return RETCODE_ERR; + + if (buf->line_bol < buf->line_eol) { + clrscrEOL(buf); + + buf->line_len = buf->line_eol - buf->line_bol + 1; + buf->line_buf[buf->line_len - 1] = 0; + + printfEOL(buf, -1, 1); + } + + return RETCODE_OK; +} + +static int bufMode(int idx, void * __restrict buffer) { linebuffer_t *buf = buffer; @@ -295,15 +329,16 @@ bufDel(int idx, void * __restrict buffer) if (!buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; - if (buf->line_bol < buf->line_eol) { - clrscrEOL(buf); + clrscrEOL(buf); - buf->line_eol--; - buf->line_len--; - buf->line_buf[buf->line_eol] = 0; + buf->line_len--; + memmove(buf->line_buf + buf->line_eol - buf->line_bol, + buf->line_buf + buf->line_eol - buf->line_bol + 1, + buf->line_len - buf->line_eol); + buf->line_buf[buf->line_len - 1] = 0; - printfEOL(buf, -1, 1); - } + printfEOL(buf, buf->line_len - 1, 1); + printfEOL(buf, -1, 1); return RETCODE_OK; } @@ -485,7 +520,7 @@ initCLI(int fin, int fout, const char *prompt) keys[i].key_func = bufLEFT; memcpy(keys[i].key_ch, K_LEFT, keys[i++].key_len); keys[i].key_len = sizeof K_BTAB - 1; - keys[i].key_func = bufBS; + keys[i].key_func = bufBTAB; memcpy(keys[i].key_ch, K_BTAB, keys[i++].key_len); // 4 bytes keys[i].key_len = sizeof K_INS - 1; @@ -768,7 +803,7 @@ main() { int ret; bindkey_t key = { sizeof K_TAB - 1, K_TAB, bufTab }; - linebuffer_t *buffer = initCLI(STDIN_FILENO, STDOUT_FILENO, /*CLI_PROMPT*/ NULL); + linebuffer_t *buffer = initCLI(STDIN_FILENO, STDOUT_FILENO, CLI_PROMPT); bindKeyCLI(&key, buffer);