--- libaitcli/src/aitcli.c 2025/12/24 00:16:40 1.21.2.5 +++ libaitcli/src/aitcli.c 2025/12/25 20:35:07 1.22 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.21.2.5 2025/12/24 00:16:40 misho Exp $ +* $Id: aitcli.c,v 1.22 2025/12/25 20:35:07 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -197,11 +197,10 @@ bufCHARin(int idx, void * __restrict cli_buffer) memcpy(buf->line_input + pos, buf->line_inkeys[idx].key_ch, buf->line_inkeys[idx].key_len); buf->line_input[buf->line_lenin] = 0; - if (buf->line_mode == LINEMODE_INS) { - rewindin(buf, buf->line_posin - buf->line_inkeys[idx].key_len); - printfEOLin(buf); - rewindin(buf, buf->line_lenin - buf->line_posin); - } + rewindin(buf, buf->line_posin - buf->line_inkeys[idx].key_len); + printfEOLin(buf); + rewindin(buf, buf->line_lenin - buf->line_posin); + return RETCODE_OK; } @@ -241,9 +240,13 @@ bufCHAR(int idx, void * __restrict cli_buffer) static int bufEOLin(int idx, void * __restrict cli_buffer) { + linebuffer_t *buf = cli_buffer; + int ign __attribute__((unused)); + if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; + ign = write(buf->line_out, K_ENTER, 1); return RETCODE_EOL; } @@ -565,6 +568,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; @@ -572,16 +600,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; } @@ -732,9 +762,14 @@ cli_Printf(linebuffer_t * __restrict cli_buffer, char { va_list lst; FILE *f; + int fd; if (fmt) { - f = fdopen(dup(cli_buffer->line_out), "a"); + if ((fd = dup(cli_buffer->line_out)) == -1) { + LOGERR; + return; + } + f = fdopen(fd, "a"); if (!f) { LOGERR; return; @@ -1497,12 +1532,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++;