diff options
-rw-r--r-- | engines/hdb/lua-script.cpp | 102 | ||||
-rw-r--r-- | engines/hdb/lua-script.h | 53 | ||||
-rw-r--r-- | engines/hdb/module.mk | 1 |
3 files changed, 156 insertions, 0 deletions
diff --git a/engines/hdb/lua-script.cpp b/engines/hdb/lua-script.cpp new file mode 100644 index 0000000000..a844451998 --- /dev/null +++ b/engines/hdb/lua-script.cpp @@ -0,0 +1,102 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/lua/lua.h" +#include "common/lua/lauxlib.h" +#include "common/lua/lualib.h" +#include "hdb/lua-script.h" + +namespace HDB { + +LuaScript::LuaScript() { + _state = NULL; +} + +LuaScript::~LuaScript() { + if (_state) { + lua_close(_state); + } +} + +bool LuaScript::init() { + // Create new lua_State and initialize the Std Libs + _state = luaL_newstate(); + if (!_state || !registerStdLibs()) { + error("Cannot initialize Lua"); + return false; + } + + return true; +} + +bool LuaScript::executeFile(const Common::String &filename) { + + Common::File *file = new Common::File; + + if (!file->open(filename)) { + error("Cannot find \"%s\"", filename.c_str()); + } + + uint fileSize = file->size(); + const char *fileData = new char[fileSize]; + file->read((void *)fileData, fileSize); + + if (!executeChunk(fileData, fileSize, filename)) { + delete[] fileData; + delete file; + + return false; + } + + delete[] fileData; + delete file; + + return true; +} + +bool LuaScript::registerStdLibs() { + luaL_openlibs(_state); + + return true; +} + +bool LuaScript::executeChunk(const char *chunk, uint chunkSize, const Common::String &chunkName) const { + // Compile Chunk + if (luaL_loadbuffer(_state, chunk, chunkSize, chunkName.c_str())) { + error("Couldn't compile \"%s\": %s", chunkName.c_str(), lua_tostring(_state, -1)); + lua_pop(_state, -1); + + return false; + } + + // Execute Chunk + if (lua_pcall(_state, 0, 0, 0)) { + error("An error occured while executing \"%s\": %s.", chunkName.c_str(), lua_tostring(_state, -1)); + lua_pop(_state, -1); + + return false; + } + + return true; +} + +}
\ No newline at end of file diff --git a/engines/hdb/lua-script.h b/engines/hdb/lua-script.h new file mode 100644 index 0000000000..bf2277364e --- /dev/null +++ b/engines/hdb/lua-script.h @@ -0,0 +1,53 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/system.h" +#include "common/file.h" + +#include "hdb/file-manager.h" + +#ifndef HDB_LUA_SCRIPT_H +#define HDB_LUA_SCRIPT_H + +struct lua_State; + +namespace HDB { + +class LuaScript { +public: + LuaScript(); + ~LuaScript(); + + bool init(); + //bool executeMPC(Common::SeekableReadStream *stream); + bool executeFile(const Common::String &filename); + +private: + lua_State *_state; + + bool registerStdLibs(); + bool executeChunk(const char *chunk, uint chunkSize, const Common::String &chunkName) const; +}; + +} + +#endif // !HDB_LUA_SCRIPT_H diff --git a/engines/hdb/module.mk b/engines/hdb/module.mk index 89bac4da58..fda8f797c1 100644 --- a/engines/hdb/module.mk +++ b/engines/hdb/module.mk @@ -5,6 +5,7 @@ MODULE_OBJS := \ draw-manager.o \ file-manager.o \ hdb.o \ + lua-script.o \ console.o MODULE_DIRS += \ |