[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:
@@ -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
35
src/user/6s/commands.cpp
Normal 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
31
src/user/6s/commands.h
Normal 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;
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user