First version of new slash-command parser.

This commit is contained in:
2026-01-07 15:29:03 -05:00
parent c681170c95
commit 1087d18a2e
3 changed files with 291 additions and 10 deletions

View File

@@ -5,6 +5,9 @@
#include "driver-windows.cpp"
#endif
#include "slash-parser.hpp"
#include "slash-parser.cpp"
#define POLLVEC_SIZE (DRV_MAX_CHAN + 1)
#define MAX_BIO_BUFFER (128 * 1024)
@@ -191,14 +194,12 @@ class Driver {
}
}
void handle_lua_source() {
if (engw.get_rescan_lua_source(&engw)) {
drvutil::ostringstream oss;
std::string err = drvutil::package_lua_source(".", &oss);
if_error_print_and_exit(err);
std::string_view ossv = oss.view();
engw.play_access(&engw, AccessKind::INVOKE_LUA_SOURCE, 0, ossv.size(), ossv.data(), nullptr, nullptr);
}
void inject_lua_source() {
drvutil::ostringstream oss;
std::string err = drvutil::package_lua_source(".", &oss);
if_error_print_and_exit(err);
std::string_view ossv = oss.view();
engw.play_access(&engw, AccessKind::INVOKE_LUA_SOURCE, 0, ossv.size(), ossv.data(), nullptr, nullptr);
}
void channel_printbuffer() {
@@ -213,6 +214,20 @@ class Driver {
}
}
void handle_slash_command(const std::string &cmd)
{
SlashCommandParser parser(cmd);
if (parser.Parse("/quit", "")) {
exit(0);
}
else if (parser.Parse("/cpl", "")) {
inject_lua_source();
}
else {
readline_device_.printline(parser.Error());
}
}
void add_console_command(std::string_view addition)
{
std::string cmd = console_command_ + std::string(addition);
@@ -229,7 +244,7 @@ class Driver {
} else if (message == "white space") {
// no need to do anything.
} else if (message == "slash command") {
readline_device_.printline("slash command.");
handle_slash_command(cmd);
} else if (message.empty()) {
engw.play_access(&engw, AccessKind::INVOKE_LUA_EXPR,
0, cmd.size(), cmd.c_str(), nullptr, nullptr);
@@ -689,7 +704,9 @@ class Driver {
// Main loop.
while (!engw.get_stop_driver(&engw)) {
handle_lua_source();
if (engw.get_rescan_lua_source(&engw)) {
inject_lua_source();
}
handle_new_outgoing_sockets();
handle_socket_input_output();
handle_console_input();