Do a refactor of command parsing in lpxclient and lpxserver

This commit is contained in:
2024-02-28 18:24:36 -05:00
parent 4495ae7133
commit c2a94b5332
6 changed files with 240 additions and 183 deletions

View File

@@ -42,78 +42,6 @@ LuaConsole::StringVec LuaConsole::get_command() {
return result;
}
void LuaConsole::synerr(const eng::string &msg) {
words_.clear();
words_.push_back("syntax");
words_.push_back(msg);
}
void LuaConsole::simplify(const StringVec &words) {
words_ = words;
if (words.size() == 0) {
return;
} else if (sv::valid_int64(words[0])) {
if (words.size() == 1) {
eng::string num = words[0];
words_.clear();
words_.push_back("choose");
words_.push_back(num);
} else {
synerr("/choose command takes no arguments");
}
} else if (words[0] == "choose") {
if ((words.size() == 2)&&(sv::valid_int64(words[1]))) {
// OK
} else {
synerr("/choose [menu-line-number]");
}
} else if (words[0] == "view") {
if (words.size() != 1) {
synerr("/view takes no arguments");
}
} else if (words[0] == "menu") {
if (words.size() == 1) {
words_.push_back("-");
} else if ((words.size() == 2)&&(sv::valid_int64(words[1]))) {
// OK
} else {
synerr("/menu [optional-tangible-id]");
}
} else if (words[0] == "quit") {
if (words.size() != 1) {
synerr("/quit takes no arguments");
}
} else if (words[0] == "tick") {
if (words.size() != 1) {
synerr("/tick takes no arguments");
}
} else if (words[0] == "cpl") {
if (words.size() != 1) {
synerr("/cpl takes no arguments");
}
} else if (words[0] == "work") {
if (words.size() != 1) {
synerr("/work takes no arguments");
}
} else if (words[0] == "display") {
if (words.size() != 1) {
synerr("/display takes no arguments");
}
} else if (words[0] == "aborthttp") {
if (words.size() != 1) {
synerr("/aborthttp takes no arguments");
}
} else if (words[0] == "connect") {
if ((words.size() == 2)&&(sv::valid_hostname(words[1]))) {
// OK
} else {
synerr("/connect [hostname]");
}
} else {
synerr("unrecognized command");
}
}
void LuaConsole::clear_raw_input() {
raw_input_ = "";
lines_ = 0;
@@ -132,7 +60,13 @@ void LuaConsole::add(eng::string line) {
// Try to interpret it as a slash-command.
if ((lines_ == 1)&&(raw_input_[0] == '/')) {
simplify(split_words(raw_input_.substr(1)));
words_ = split_words(raw_input_.substr(1));
if ((words_.size() == 1) && (sv::valid_int64(words_[0]))) {
eng::string num = words_[0];
words_.clear();
words_.push_back("choose");
words_.push_back(num);
}
clear_raw_input();
return;
}
@@ -177,3 +111,108 @@ void LuaConsole::add(eng::string line) {
lua_settop(lua_state_, top);
}
void CommonCommands::do_command(const StringVec &words) {
if (words.size() == 0) {
return;
}
if (words[0] == "choose") {
if ((words.size() == 2)&&(sv::valid_int64(words[1]))) {
return do_choose_command(sv::to_int64(words[1]));
} else {
return do_syntax_error("/choose [menu-line-number]");
}
}
if (words[0] == "view") {
if (words.size() == 1) {
return do_view_command();
} else {
return do_syntax_error("/view takes no arguments");
}
}
if (words[0] == "moveto") {
if ((words.size() == 3) && sv::valid_int64(words[1]) && sv::valid_int64(words[2])) {
return do_moveto_command(sv::to_int64(words[1]), sv::to_int64(words[2]));
} else {
return do_syntax_error("/moveto [x] [y]");
}
}
if (words[0] == "menu") {
if (words.size() == 1) {
return do_menu_command(0);
} else if ((words.size() == 2) && sv::valid_int64(words[1])) {
return do_menu_command(sv::to_int64(words[1]));
} else {
return do_syntax_error("/menu [optional-tangible-id]");
}
}
if (words[0] == "quit") {
if (words.size() == 1) {
return do_quit_command();
} else {
return do_syntax_error("/quit takes no arguments");
}
}
if (words[0] == "cpl") {
if (words.size() == 1) {
return do_cpl_command();
} else {
return do_syntax_error("/cpl takes no arguments");
}
}
if (words[0] == "work") {
if (words.size() == 1) {
return do_work_command();
} else {
return do_syntax_error("/work takes no arguments");
}
}
if (words[0] == "display") {
if (words.size() == 1) {
return do_display_command();
} else {
return do_syntax_error("/display takes no arguments");
}
}
if (words[0] == "aborthttp") {
if (words.size() == 1) {
return do_aborthttp_command();
} else {
return do_syntax_error("/aborthttp takes no arguments");
}
}
if (words[0] == "connect") {
if ((words.size() == 2)&&(sv::valid_hostname(words[1]))) {
return do_connect_command(words[1]);
} else {
return do_syntax_error("/connect [hostname]");
}
}
if (words[0] == "luainvoke") {
if (words.size() == 2) {
return do_luainvoke_command(words[1]);
} else {
return do_syntax_error("/luainvoke [command]");
}
}
if (words[0] == "luaprobe") {
if (words.size() == 2) {
return do_luaprobe_command(words[1]);
} else {
return do_syntax_error("/luainvoke [command]");
}
}
return do_unknown_command(words[0]);
}