diff options
author | lonkaars <loek@pipeframe.xyz> | 2024-05-20 11:44:29 +0200 |
---|---|---|
committer | lonkaars <loek@pipeframe.xyz> | 2024-05-20 11:44:29 +0200 |
commit | b854c4d6ac06c4a39006a086766deb90096c2998 (patch) | |
tree | 1ba6366048430009aa3412cbba402e7315d94f82 /client/rl.c | |
parent | 9ff66bfe22c5f378584db2a57160d00b585a77ce (diff) |
WIP CLI
Diffstat (limited to 'client/rl.c')
-rw-r--r-- | client/rl.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/client/rl.c b/client/rl.c new file mode 100644 index 0000000..fb26057 --- /dev/null +++ b/client/rl.c @@ -0,0 +1,55 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <stdarg.h> + +#include <readline/readline.h> +#include <readline/history.h> + +#include "rl.h" + +void rl_printf(const char *fmt, ...) { + // save line + char* saved_line = rl_copy_text(0, rl_end); + int saved_point = rl_point; + int saved_end = rl_end; + + // clear line + rl_save_prompt(); + rl_replace_line("", 0); + rl_redisplay(); + + // printf + va_list args; + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + + // restore line + rl_restore_prompt(); + rl_replace_line(saved_line, 0); + rl_point = saved_point; + rl_end = saved_end; + rl_redisplay(); + + free(saved_line); +} + +int cli_main() { + char* input = NULL; + while (1) { + if (input != NULL) free(input); + input = readline(CLI_PROMPT); + + // exit on ^D or ^C (EOF) + if (input == NULL) return EXIT_SUCCESS; + + // add non-empty line to history + if (*input) add_history(input); + + if (strcmp(input, "exit") == 0) return EXIT_SUCCESS; + } + + return EXIT_SUCCESS; +} + |