From afcd1d6d053e8dc8c933a6afdaecd841c46cbcaf Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Sat, 27 Jun 2026 17:06:12 +0200 Subject: [PATCH] refactor: replace interactive REPL with command dispatch --- includes/internal/cli/interactive.h | 8 ---- src/Makefile.am | 5 +- src/cli/interactive.c | 72 ----------------------------- src/main.c | 41 ++++++++++++---- 4 files changed, 33 insertions(+), 93 deletions(-) delete mode 100644 includes/internal/cli/interactive.h delete mode 100644 src/cli/interactive.c diff --git a/includes/internal/cli/interactive.h b/includes/internal/cli/interactive.h deleted file mode 100644 index 77f7503..0000000 --- a/includes/internal/cli/interactive.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef FT_SSL_INTERACTIVE_H -#define FT_SSL_INTERACTIVE_H - -#include - -enum cli_code run_interactive(void); - -#endif diff --git a/src/Makefile.am b/src/Makefile.am index c95ddf3..2343f9c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,15 +41,14 @@ FORCE: ft_ssl_SOURCES = \ main.c \ - ssl_run.c \ + cmd/command_table.c \ + cmd/digest_run.c \ ssl/run_stdin.c \ ssl/run_string.c \ ssl/run_file.c \ ssl/digest.c \ ssl/output.c \ - cli/parse.c \ cli/version.c \ - cli/interactive.c \ cli/handlers/option_map.c \ cli/handlers/handle_help.c \ cli/handlers/handle_version.c \ diff --git a/src/cli/interactive.c b/src/cli/interactive.c deleted file mode 100644 index 0f3a12f..0000000 --- a/src/cli/interactive.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -#include "ft_ssl.h" -#include "internal/cli/interactive.h" - -#define INTERACTIVE_BUFSIZ 4096 - -static const struct digest_algo * const s_algos[] = { -#define DIGEST_ALGO(lower, ds, bs) &g_##lower, -#include -#undef DIGEST_ALGO - NULL -}; - -static const struct digest_algo *find_algo(const char *name); -static void print_available(void); - -enum cli_code -run_interactive(void) -{ - char buf[INTERACTIVE_BUFSIZ]; - const struct digest_algo *algo; - struct ssl_config config; - - while (fgets(buf, (int)sizeof(buf), stdin)) - { - buf[strcspn(buf, "\n")] = '\0'; - if (buf[0] == '\0') - continue; - algo = find_algo(buf); - if (NULL == algo) - { - fprintf(stderr, "ft_ssl: unknown command -- '%s'\n", buf); - print_available(); - continue; - } - memset(&config, 0, sizeof(config)); - config.algo = algo; - ssl_run(&config); - } - return CLI_EXIT_SUCCESS; -} - -static const struct digest_algo * -find_algo(const char *name) -{ - size_t i; - - for (i = 0; s_algos[i]; ++i) - { - if (0 == strcmp(s_algos[i]->name, name)) - return s_algos[i]; - } - return NULL; -} - -static void -print_available(void) -{ - size_t i; - - fprintf(stderr, "available commands:"); - for (i = 0; s_algos[i]; ++i) - fprintf(stderr, " %s", s_algos[i]->name); - fprintf(stderr, "\n"); -} diff --git a/src/main.c b/src/main.c index 502588f..5c54c94 100644 --- a/src/main.c +++ b/src/main.c @@ -1,24 +1,45 @@ +#include #include +#include #include -#include "ft_ssl.h" +#include "internal/cmd/command.h" +#include "version_gen.h" char *g_prog_name = NULL; int main(int argc, char **argv) { - struct ssl_config config = {0}; - int ret = CLI_ERROR; + const struct command_descriptor *cmd; + int ret; g_prog_name = argv[0]; cli_set_prog_name(g_prog_name); - ret = cli_parse_arguments(argc, argv, &config); - if (CLI_SUCCESS != ret) - goto cleanup; - ret = ssl_run(&config); - -cleanup: - return (CLI_ERROR == ret) ? 2 : EXIT_SUCCESS; + if (argc < 2) + { + print_commands(stderr); + return 2; + } + if (0 == strcmp(argv[1], "-h") || 0 == strcmp(argv[1], "--help")) + { + print_commands(stdout); + return EXIT_SUCCESS; + } + cmd = find_command(argv[1]); + if (NULL == cmd) + { + fprintf(stderr, "%s: Error: %s is an invalid command.\n", + argv[0], argv[1]); + print_commands(stderr); + return 2; + } + if (NULL == cmd->run) + { + fprintf(stderr, "%s: %s: not yet implemented\n", argv[0], argv[1]); + return 2; + } + ret = cmd->run(argc - 1, argv + 1, cmd); + return ((int)CLI_ERROR == ret) ? 2 : EXIT_SUCCESS; }