--- libaitcli/src/aitcli.c 2025/12/23 23:11:13 1.21.2.3 +++ libaitcli/src/aitcli.c 2025/12/24 00:49:52 1.21.2.7 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.21.2.3 2025/12/23 23:11:13 misho Exp $ +* $Id: aitcli.c,v 1.21.2.7 2025/12/24 00:49:52 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -84,29 +84,43 @@ cli_SetErr(int eno, char *estr, ...) // ------------------------------------------------------------ static inline void -clrscrEOL(linebuffer_t * __restrict buf) +rewindin(linebuffer_t * __restrict buf, int len) { + int ign __attribute__((unused)); + + if (buf) { + if (len == -1) + len = buf->line_posin; + while (len-- > 0) + ign = write(buf->line_out, K_CTRL_H, 1); + } +} + +static inline void +clrscrEOLin(linebuffer_t * __restrict buf) +{ register int i; int ign __attribute__((unused)); - if (buf && buf->line_prompt) { - ign = write(buf->line_out, K_CR, 1); + if (buf) { + rewindin(buf, -1); - for (i = 0; i < buf->line_len; i++) + for (i = 0; i < buf->line_lenin; i++) ign = write(buf->line_out, K_SPACE, 1); } } static inline void -rewindin(linebuffer_t * __restrict buf, int len) +clrscrEOL(linebuffer_t * __restrict buf) { + register int i; int ign __attribute__((unused)); - if (buf) { - if (len == -1) - len = buf->line_posin; - while (len-- > 0) - ign = write(buf->line_out, K_CTRL_H, 1); + if (buf && buf->line_prompt) { + ign = write(buf->line_out, K_CR, 1); + + for (i = 0; i < buf->line_len; i++) + ign = write(buf->line_out, K_SPACE, 1); } } @@ -330,10 +344,8 @@ bufCLRin(int idx, void * __restrict cli_buffer) if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; - memset(buf->line_input, ' ', buf->line_lenin); - rewindin(buf, -1); - printfEOLin(buf); - rewindin(buf, -1); + clrscrEOLin(buf); + rewindin(buf, buf->line_lenin); cli_freeInput(cli_buffer); return RETCODE_OK; } @@ -352,6 +364,33 @@ bufCLR(int idx, void * __restrict cli_buffer) } static int +bufBSin(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_posin > 0) { + clrscrEOLin(buf); + rewindin(buf, -1); + + buf->line_posin--; + buf->line_lenin--; + memmove(buf->line_input + buf->line_posin, + buf->line_input + buf->line_posin + 1, + buf->line_lenin - buf->line_posin); + buf->line_input[buf->line_lenin] = 0; + + rewindin(buf, buf->line_lenin - buf->line_posin); + printfEOLin(buf); + rewindin(buf, buf->line_lenin - buf->line_posin); + } + + return RETCODE_OK; +} + +static int bufBS(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; @@ -466,6 +505,22 @@ bufEND(int idx, void * __restrict cli_buffer) } static int +bufLEFTin(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_posin > 0) { + rewindin(buf, 1); + buf->line_posin--; + } + + return RETCODE_OK; +} + +static int bufLEFT(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; @@ -480,6 +535,22 @@ bufLEFT(int idx, void * __restrict cli_buffer) } static int +bufRIGHTin(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_posin < buf->line_lenin) { + write(buf->line_out, buf->line_input + buf->line_posin, 1); + buf->line_posin++; + } + + return RETCODE_OK; +} + +static int bufRIGHT(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; @@ -494,6 +565,31 @@ bufRIGHT(int idx, void * __restrict cli_buffer) } static int +bufDELin(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_lenin > 0 && buf->line_posin < buf->line_lenin) { + clrscrEOLin(buf); + rewindin(buf, buf->line_lenin); + + buf->line_lenin--; + memmove(buf->line_input + buf->line_posin, + buf->line_input + buf->line_posin + 1, + buf->line_lenin - buf->line_posin); + buf->line_input[buf->line_lenin] = 0; + + printfEOLin(buf); + rewindin(buf, buf->line_lenin - buf->line_posin); + } + + return RETCODE_OK; +} + +static int bufDEL(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; @@ -501,16 +597,18 @@ bufDEL(int idx, void * __restrict cli_buffer) if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; - clrscrEOL(buf); + if (buf->line_bol < buf->line_eol && buf->line_eol < buf->line_len) { + clrscrEOL(buf); - 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; + 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, buf->line_len - 1, 1); - printfEOL(buf, -1, 1); + printfEOL(buf, buf->line_len - 1, 1); + printfEOL(buf, -1, 1); + } return RETCODE_OK; } @@ -1224,8 +1322,11 @@ cliInit(int fin, int fout, const char *prompt) keys[i].key_func = bufEOL; inkeys[i].key_func = bufEOLin; } - if (cli_buffer->line_prompt && (i == *K_CTRL_H || i == *K_BACKSPACE)) - keys[i].key_func = bufBS; + if (i == *K_CTRL_H || i == *K_BACKSPACE) { + if (cli_buffer->line_prompt) + keys[i].key_func = bufBS; + inkeys[i].key_func = bufBSin; + } if (i == *K_CTRL_C) { keys[i].key_func = bufCLR; inkeys[i].key_func = bufCLRin; @@ -1402,12 +1503,14 @@ cliInit(int fin, int fout, const char *prompt) keys[i].key_len = inkeys[i].key_len = sizeof K_RIGHT - 1; if (cli_buffer->line_prompt) keys[i].key_func = bufRIGHT; + inkeys[i].key_func = bufRIGHTin; memcpy(keys[i].key_ch, K_RIGHT, keys[i].key_len); memcpy(inkeys[i].key_ch, K_RIGHT, inkeys[i].key_len); i++; keys[i].key_len = inkeys[i].key_len = sizeof K_LEFT - 1; if (cli_buffer->line_prompt) keys[i].key_func = bufLEFT; + inkeys[i].key_func = bufLEFTin; memcpy(keys[i].key_ch, K_LEFT, keys[i].key_len); memcpy(inkeys[i].key_ch, K_LEFT, inkeys[i].key_len); i++; @@ -1421,12 +1524,14 @@ cliInit(int fin, int fout, const char *prompt) keys[i].key_len = inkeys[i].key_len = sizeof K_INS - 1; if (cli_buffer->line_prompt) keys[i].key_func = bufMODE; + inkeys[i].key_func = bufMODE; memcpy(keys[i].key_ch, K_INS, keys[i].key_len); memcpy(inkeys[i].key_ch, K_INS, inkeys[i].key_len); i++; keys[i].key_len = inkeys[i].key_len = sizeof K_DEL - 1; if (cli_buffer->line_prompt) keys[i].key_func = bufDEL; + inkeys[i].key_func = bufDELin; memcpy(keys[i].key_ch, K_DEL, keys[i].key_len); memcpy(inkeys[i].key_ch, K_DEL, inkeys[i].key_len); i++;