--- libaitcli/src/aitcli.c 2022/10/17 22:03:47 1.17.2.2 +++ libaitcli/src/aitcli.c 2025/12/17 23:40:35 1.20.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.17.2.2 2022/10/17 22:03:47 misho Exp $ +* $Id: aitcli.c,v 1.20.2.1 2025/12/17 23:40:35 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2022 +Copyright 2004 - 2025 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -87,25 +87,28 @@ static inline void clrscrEOL(linebuffer_t * __restrict buf) { register int i; + int ign __attribute__((unused)); if (buf && buf->line_prompt) { - write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, K_CR, 1); for (i = 0; i < buf->line_len; i++) - write(buf->line_out, K_SPACE, 1); + ign = write(buf->line_out, K_SPACE, 1); } } static inline void printfEOL(linebuffer_t * __restrict buf, int len, int prompt) { + int ign __attribute__((unused)); + if (buf) { if (prompt && buf->line_prompt) { - write(buf->line_out, K_CR, 1); - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } - write(buf->line_out, buf->line_buf, len == -1 ? + ign = write(buf->line_out, buf->line_buf, len == -1 ? buf->line_eol - buf->line_bol : len); } } @@ -113,21 +116,25 @@ printfEOL(linebuffer_t * __restrict buf, int len, int static inline void printfCR(linebuffer_t * __restrict buf, int prompt) { + int ign __attribute__((unused)); + if (buf && prompt && buf->line_prompt) { - write(buf->line_out, K_CR, 1); - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } } static inline void printfNL(linebuffer_t * __restrict buf, int prompt) { + int ign __attribute__((unused)); + if (buf) { - write(buf->line_out, K_ENTER, 1); + ign = write(buf->line_out, K_ENTER, 1); if (prompt) if (prompt && buf->line_prompt) - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } } @@ -138,6 +145,7 @@ bufCHAR(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; int pos; + int ign __attribute__((unused)); if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; @@ -155,10 +163,10 @@ bufCHAR(int idx, void * __restrict cli_buffer) buf->line_buf[buf->line_len - 1] = 0; if (buf->line_prompt) - write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); + ign = write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); if (buf->line_mode == LINEMODE_INS) { - write(buf->line_out, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, + ign = write(buf->line_out, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, buf->line_len - buf->line_eol); printfEOL(buf, -1, 1); } @@ -178,12 +186,18 @@ bufEOL(int idx, void * __restrict cli_buffer) static int bufEOF(int idx, void * __restrict cli_buffer) { + int ret; + /* if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; */ - return RETCODE_EOF; + printfNL(cli_buffer, 0); + ret = cli_Cmd_End(cli_buffer, idx, NULL); + printfCR(cli_buffer, (ret != RETCODE_EOF)); + + return ret; } static int @@ -404,6 +418,7 @@ bufComp(int idx, void * __restrict cli_buffer) register int i, j; struct tagCommand *cmd, *c; int pos, ret = RETCODE_OK; + int ign __attribute__((unused)); if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; @@ -416,7 +431,7 @@ bufComp(int idx, void * __restrict cli_buffer) str_Trim(s); } - i = j = 0; + j = 0; c = NULL; memset(szLine, 0, STRSIZ); if (*s) { @@ -466,7 +481,7 @@ bufComp(int idx, void * __restrict cli_buffer) /* completion show actions ... */ if (j > 1 && c) { printfNL(buf, 0); - write(buf->line_out, szLine, strlen(szLine)); + ign = write(buf->line_out, szLine, strlen(szLine)); printfNL(buf, 1); printfEOL(buf, buf->line_len - 1, 1); printfEOL(buf, -1, 1); @@ -511,6 +526,7 @@ static int bufEndNode(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; + char szPrompt[STRSIZ + 16] = {[0 ... STRSIZ + 15] = 0}; if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; @@ -518,6 +534,8 @@ bufEndNode(int idx, void * __restrict cli_buffer) if (buf->line_level > 0) { printfNL(cli_buffer, 0); buf->line_level--; + snprintf(szPrompt, sizeof szPrompt, "%s{%d}> ", buf->line_porigin, buf->line_level); + cli_setPrompt(buf, szPrompt); cli_Printf(buf, "Enter to config level %d\n", buf->line_level); } @@ -540,7 +558,7 @@ cli_Printf(linebuffer_t * __restrict cli_buffer, char FILE *f; if (fmt) { - f = fdopen(cli_buffer->line_out, "a"); + f = fdopen(dup(cli_buffer->line_out), "a"); if (!f) { LOGERR; return; @@ -549,6 +567,8 @@ cli_Printf(linebuffer_t * __restrict cli_buffer, char va_start(lst, fmt); vfprintf(f, fmt, lst); va_end(lst); + + fclose(f); } else cli_SetErr(EINVAL, "Invalid input parameters ..."); } @@ -1490,7 +1510,6 @@ int cliRun(linebuffer_t * __restrict cli_buffer, char *psInput, int prompt) { char *line, *s, *t, **app, *items[MAX_PROMPT_ITEMS]; - register int i; int ret = RETCODE_OK; struct tagCommand *cmd; @@ -1512,14 +1531,11 @@ cliRun(linebuffer_t * __restrict cli_buffer, char *psI (*app = strsep(&s, " \t")); *app ? app++ : app); // exec_cmd ... - i = 0; SLIST_FOREACH(cmd, &cli_buffer->line_cmds, cmd_next) { if (!(cmd->cmd_level & (1 << cli_buffer->line_level))) continue; if (*items[0] && !strncmp(cmd->cmd_name, items[0], strlen(items[0]))) break; - else - i++; } if (!cmd) { @@ -1575,7 +1591,7 @@ cliLoop(linebuffer_t * __restrict cli_buffer, const ch cli_freeLine(cli_buffer); cli_resetHistory(cli_buffer); e_free(line); - } while (cli_buffer->line_kill || ret < 1); + } while (!cli_buffer->line_kill); cli_saveHistory(cli_buffer, csHistFile, HISTORY_LINES);