Files
integration/luprex/core/cpp/luaconsole.cpp

107 lines
2.4 KiB
C++
Raw Normal View History

2021-01-23 16:10:29 -05:00
#include <string.h>
#include "luaconsole.hpp"
LuaConsole::LuaConsole() {
lua_state_ = lua_open();
clear();
}
LuaConsole::~LuaConsole() {
lua_close(lua_state_);
}
void LuaConsole::clear() {
2021-02-02 16:29:07 -05:00
raw_input_ = "";
2021-01-23 16:10:29 -05:00
lines_ = 0;
2021-02-02 16:29:07 -05:00
lua_expression_ = "";
words_.clear();
2021-01-23 20:12:21 -05:00
syntax_ = "";
action_ = DO_NOTHING;
2021-01-23 16:10:29 -05:00
}
2021-02-02 16:29:07 -05:00
void LuaConsole::split_words() {
words_.clear();
std::string acc;
for (char c : raw_input_) {
if ((c == ' ')||(c == '\n')) {
if (!acc.empty()) {
words_.push_back(acc);
acc = "";
}
} else {
acc += c;
}
}
if (!acc.empty()) {
words_.push_back(acc);
}
}
2021-01-23 16:10:29 -05:00
void LuaConsole::add(std::string line) {
2021-01-23 20:12:21 -05:00
if (action_ != DO_NOTHING) {
clear();
}
2021-01-23 16:10:29 -05:00
for (int i = 0; i < int(line.size()); i++) {
if (line[i] == '\n') line[i] = ' ';
}
2021-02-02 16:29:07 -05:00
raw_input_ += line;
raw_input_ += '\n';
2021-01-23 16:10:29 -05:00
lines_ += 1;
2021-02-07 15:35:31 -05:00
// Try to interpret it as a special command.
if (lines_ == 1) {
split_words();
if ((words_.size() >= 1)&&(words_[0].size() == 1)) {
2021-02-02 16:29:07 -05:00
action_ = DO_COMMAND;
2021-02-07 15:35:31 -05:00
return;
2021-01-23 16:10:29 -05:00
}
}
2021-02-07 15:35:31 -05:00
words_.clear();
2021-02-02 16:29:07 -05:00
// Strip the leading punctuation from lua commands.
std::string partial;
2021-02-07 15:35:31 -05:00
if (raw_input_[0] == '=') {
partial = std::string("return ") + raw_input_.substr(1);
2021-02-02 16:29:07 -05:00
} else {
2021-02-07 15:35:31 -05:00
partial = raw_input_;
2021-02-02 16:29:07 -05:00
}
2021-01-23 16:10:29 -05:00
// Analyze lua expressions.
int top = lua_gettop(lua_state_);
2021-02-02 16:29:07 -05:00
int status = luaL_loadbuffer(lua_state_, partial.c_str(), partial.size(), "=stdin");
2021-01-23 16:10:29 -05:00
if (status == LUA_ERRSYNTAX)
{
const char *eof = "'<eof>'";
size_t lmsg;
const char *msg = lua_tolstring(lua_state_, -1, &lmsg);
const char *tp = msg + lmsg - (sizeof(eof) - 1);
if (strstr(msg, eof) == tp) {
2021-01-23 20:12:21 -05:00
action_ = DO_NOTHING;
2021-01-23 16:10:29 -05:00
} else {
2021-01-23 20:12:21 -05:00
action_ = DO_SYNTAX;
2021-02-02 16:29:07 -05:00
syntax_ = msg;
2021-01-23 16:10:29 -05:00
}
} else {
2021-02-02 16:29:07 -05:00
action_ = DO_LUA;
lua_expression_ = partial;
2021-01-23 16:10:29 -05:00
}
lua_settop(lua_state_, top);
}
void LuaConsole::add_stdin() {
2021-01-23 20:12:21 -05:00
if (action_ != DO_NOTHING) {
clear();
}
2021-01-23 16:10:29 -05:00
const int MAXINPUT = 1000;
char buf[MAXINPUT];
2021-02-02 16:29:07 -05:00
fputs(raw_input_.empty() ? "> " : ">> ", stdout);
2021-01-23 16:10:29 -05:00
fflush(stdout);
if (fgets(buf, MAXINPUT, stdin)) {
size_t len = strlen(buf);
if (len > 0 && buf[len - 1] == '\n')
buf[len - 1] = '\0';
add(buf);
}
}