From 172eb705513280adccc87883c40cb73bf7ed69a5 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 29 Apr 2024 01:11:15 -0700 Subject: [PATCH] [6s] Break out builtin commands into a list of structs The 6s builtin commands are now in a separate file, with a list of name, description, and function pointers. --- src/user/6s/6s.module | 1 + src/user/6s/commands.cpp | 35 +++++++++++++++++++++++++++++++++++ src/user/6s/commands.h | 31 +++++++++++++++++++++++++++++++ src/user/6s/main.cpp | 20 +++++++++++--------- 4 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/user/6s/commands.cpp create mode 100644 src/user/6s/commands.h diff --git a/src/user/6s/6s.module b/src/user/6s/6s.module index f82a273..50d0c04 100644 --- a/src/user/6s/6s.module +++ b/src/user/6s/6s.module @@ -5,5 +5,6 @@ module("6s", deps = [ "libc", "edit" ], description = "j6 shell", sources = [ + "commands.cpp", "main.cpp", ]) diff --git a/src/user/6s/commands.cpp b/src/user/6s/commands.cpp new file mode 100644 index 0000000..33546ca --- /dev/null +++ b/src/user/6s/commands.cpp @@ -0,0 +1,35 @@ +#include +#include +#include "commands.h" + +static void +help(edit::source &s) +{ + for (unsigned i = 0; i < g_builtins_count; ++i) { + char line[100]; + util::counted output { line, sizeof(line) }; + + builtin &cmd = g_builtins[i]; + + size_t len = util::format(output, "%20s - %s\r\n", cmd.name(), cmd.description()); + s.write(line, len); + } +} + +static void +version(edit::source &s) +{ + static const char *gv = GIT_VERSION; + + char line[100]; + util::counted output { line, sizeof(line) }; + + size_t len = util::format(output, "jsix version %s\r\n", gv); + s.write(line, len); +} + +builtin g_builtins[] = { + { "help", "list availble commands", help }, + { "version", "print current jsix version", version }, +}; +size_t g_builtins_count = sizeof(g_builtins) / sizeof(g_builtins[0]); diff --git a/src/user/6s/commands.h b/src/user/6s/commands.h new file mode 100644 index 0000000..5394452 --- /dev/null +++ b/src/user/6s/commands.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +namespace edit { + class source; +} + + +class builtin +{ +public: + using runf = void (*)(edit::source &); + + builtin(const char *name, const char *desc, runf func) : + m_name {name}, m_desc {desc}, m_func {func} {} + + const char * name() const { return m_name; } + const char * description() const { return m_desc; } + + void run(edit::source &s) { m_func(s); } + +private: + const char *m_name; + const char *m_desc; + runf m_func; +}; + + +extern builtin g_builtins[]; +extern size_t g_builtins_count; diff --git a/src/user/6s/main.cpp b/src/user/6s/main.cpp index 5d0a4d2..c489ca4 100644 --- a/src/user/6s/main.cpp +++ b/src/user/6s/main.cpp @@ -11,6 +11,8 @@ #include #include +#include "commands.h" + extern "C" { int main(int, const char **); } @@ -111,14 +113,14 @@ handle_command(edit::source &s, const char *command, size_t len) if (len == 0) return; - if (strncmp(command, "help", len) == 0) { - s.write("help", 4); - s.write("\r\n", 2); - s.write("version", 7); - s.write("\r\n", 2); - } else if (!strncmp(command, "version", len)) { - static const char *version = GIT_VERSION; - s.write(version, strlen(version)); - s.write("\r\n", 2); + for (unsigned i = 0; i < g_builtins_count; ++i) { + builtin &cmd = g_builtins[i]; + if (strncmp(command, cmd.name(), len) == 0) { + cmd.run(s); + return; + } } + + static const char unknown[] = "\x1b[1;33mUnknown command.\x1b[0m\r\n"; + s.write(unknown, sizeof(unknown)-1); }