[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.
This commit is contained in:
Justin C. Miller
2024-04-29 01:11:15 -07:00
parent 7322df98f5
commit 172eb70551
4 changed files with 78 additions and 9 deletions

View File

@@ -5,5 +5,6 @@ module("6s",
deps = [ "libc", "edit" ], deps = [ "libc", "edit" ],
description = "j6 shell", description = "j6 shell",
sources = [ sources = [
"commands.cpp",
"main.cpp", "main.cpp",
]) ])

35
src/user/6s/commands.cpp Normal file
View File

@@ -0,0 +1,35 @@
#include <edit/line.h>
#include <util/format.h>
#include "commands.h"
static void
help(edit::source &s)
{
for (unsigned i = 0; i < g_builtins_count; ++i) {
char line[100];
util::counted<char> 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<char> 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]);

31
src/user/6s/commands.h Normal file
View File

@@ -0,0 +1,31 @@
#pragma once
#include <stddef.h>
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;

View File

@@ -11,6 +11,8 @@
#include <j6/types.h> #include <j6/types.h>
#include <edit/line.h> #include <edit/line.h>
#include "commands.h"
extern "C" { extern "C" {
int main(int, const char **); int main(int, const char **);
} }
@@ -111,14 +113,14 @@ handle_command(edit::source &s, const char *command, size_t len)
if (len == 0) if (len == 0)
return; return;
if (strncmp(command, "help", len) == 0) { for (unsigned i = 0; i < g_builtins_count; ++i) {
s.write("help", 4); builtin &cmd = g_builtins[i];
s.write("\r\n", 2); if (strncmp(command, cmd.name(), len) == 0) {
s.write("version", 7); cmd.run(s);
s.write("\r\n", 2); return;
} else if (!strncmp(command, "version", len)) {
static const char *version = GIT_VERSION;
s.write(version, strlen(version));
s.write("\r\n", 2);
} }
} }
static const char unknown[] = "\x1b[1;33mUnknown command.\x1b[0m\r\n";
s.write(unknown, sizeof(unknown)-1);
}