#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
#include <lua.hpp>
class Interpreter {
public:
// initialize lua and import libraries; handle error
Interpreter() {
luaState = luaL_newstate();
if(!luaState)
throw std::runtime_error("initializing lua failed");
luaL_openlibs(luaState);
}
~Interpreter() {
lua_close(luaState);
}
// executes a string in the current lua state
void executeCommand(std::string command) {
bool err = luaL_dostring(luaState, command.c_str());
if(err)
reportError();
}
// executes a file in the current lua state
void executeFile(std::string file) {
bool err = luaL_loadfile(luaState, file.c_str());
// could not load file
if(err)
reportError();
else {
bool err = lua_pcall(luaState, 0, 0, 0);
// could not execute file
if(err)
reportError();
}
}
private:
lua_State* luaState;
// get error from top of stack, pop it from the stack and report it
void reportError() {
std::string err = lua_tostring(luaState, -1);
lua_pop(luaState, 1);
std::cerr << err << std::endl;
}
};
int main(int argc, char** argv) {
std::vector<std::string> args(argv, argv + argc);
if(args.size() != 3) {
std::cerr << "usage:\n ./a.out -cmd command\n ./a.out -file file" << std::endl;
} else {
// throws on failed initialization, see above
Interpreter li;
if(args[1] == "-cmd")
li.executeCommand(args[2]);
else if(args[1] == "-file")
li.executeFile(args[2]);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKI2luY2x1ZGUgPGx1YS5ocHA+CgoKY2xhc3MgSW50ZXJwcmV0ZXIgewogIHB1YmxpYzoKICAgIC8vIGluaXRpYWxpemUgbHVhIGFuZCBpbXBvcnQgbGlicmFyaWVzOyBoYW5kbGUgZXJyb3IKICAgIEludGVycHJldGVyKCkgewogICAgICBsdWFTdGF0ZSA9IGx1YUxfbmV3c3RhdGUoKTsKCiAgICAgIGlmKCFsdWFTdGF0ZSkKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImluaXRpYWxpemluZyBsdWEgZmFpbGVkIik7CgogICAgICBsdWFMX29wZW5saWJzKGx1YVN0YXRlKTsKICAgIH0KCiAgICB+SW50ZXJwcmV0ZXIoKSB7CiAgICAgIGx1YV9jbG9zZShsdWFTdGF0ZSk7CiAgICB9CgogICAgLy8gZXhlY3V0ZXMgYSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgbHVhIHN0YXRlCiAgICB2b2lkIGV4ZWN1dGVDb21tYW5kKHN0ZDo6c3RyaW5nIGNvbW1hbmQpIHsKICAgICAgYm9vbCBlcnIgPSBsdWFMX2Rvc3RyaW5nKGx1YVN0YXRlLCBjb21tYW5kLmNfc3RyKCkpOwoKICAgICAgaWYoZXJyKQogICAgICAgIHJlcG9ydEVycm9yKCk7CiAgICB9CgogICAgLy8gZXhlY3V0ZXMgYSBmaWxlIGluIHRoZSBjdXJyZW50IGx1YSBzdGF0ZQogICAgdm9pZCBleGVjdXRlRmlsZShzdGQ6OnN0cmluZyBmaWxlKSB7CiAgICAgIGJvb2wgZXJyID0gbHVhTF9sb2FkZmlsZShsdWFTdGF0ZSwgZmlsZS5jX3N0cigpKTsKCiAgICAgIC8vIGNvdWxkIG5vdCBsb2FkIGZpbGUKICAgICAgaWYoZXJyKQogICAgICAgIHJlcG9ydEVycm9yKCk7CgogICAgICBlbHNlIHsKICAgICAgICBib29sIGVyciA9IGx1YV9wY2FsbChsdWFTdGF0ZSwgMCwgMCwgMCk7CgogICAgICAgIC8vIGNvdWxkIG5vdCBleGVjdXRlIGZpbGUKICAgICAgICBpZihlcnIpCiAgICAgICAgICByZXBvcnRFcnJvcigpOwogICAgICB9CiAgICB9CgogIHByaXZhdGU6CiAgICBsdWFfU3RhdGUqIGx1YVN0YXRlOwoKICAgIC8vIGdldCBlcnJvciBmcm9tIHRvcCBvZiBzdGFjaywgcG9wIGl0IGZyb20gdGhlIHN0YWNrIGFuZCByZXBvcnQgaXQKICAgIHZvaWQgcmVwb3J0RXJyb3IoKSB7CiAgICAgIHN0ZDo6c3RyaW5nIGVyciA9IGx1YV90b3N0cmluZyhsdWFTdGF0ZSwgLTEpOwogICAgICBsdWFfcG9wKGx1YVN0YXRlLCAxKTsKCiAgICAgIHN0ZDo6Y2VyciA8PCBlcnIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKGFyZ3YsIGFyZ3YgKyBhcmdjKTsKCiAgaWYoYXJncy5zaXplKCkgIT0gMykgewogICAgc3RkOjpjZXJyIDw8ICJ1c2FnZTpcbiAuL2Eub3V0IC1jbWQgY29tbWFuZFxuIC4vYS5vdXQgLWZpbGUgZmlsZSIgPDwgc3RkOjplbmRsOwogIH0gZWxzZSB7CiAgICAvLyB0aHJvd3Mgb24gZmFpbGVkIGluaXRpYWxpemF0aW9uLCBzZWUgYWJvdmUKICAgIEludGVycHJldGVyIGxpOwogIAogICAgaWYoYXJnc1sxXSA9PSAiLWNtZCIpCiAgICAgIGxpLmV4ZWN1dGVDb21tYW5kKGFyZ3NbMl0pOwogICAgZWxzZSBpZihhcmdzWzFdID09ICItZmlsZSIpCiAgICAgIGxpLmV4ZWN1dGVGaWxlKGFyZ3NbMl0pOwogIH0KfQ==