Files
2022-10-26 12:25:11 +08:00

127 lines
2.4 KiB
C++

#include "stdafx.h"
#include "lua_manager.h"
#ifdef _DEBUG
#pragma comment(lib, "../../lib/"VC_DIR_REDIRECT"/lua_d.lib")
#else
#pragma comment(lib, "../../lib/"VC_DIR_REDIRECT"/lua.lib")
#endif
CLuaStreamPack::CLuaStreamPack()
: buffer(0)
{
}
CLuaStreamPack::~CLuaStreamPack()
{
clear_buffer();
}
bool CLuaStreamPack::open( const char* _filename, Decrypt_CFunction _df /*= NULL*/ )
{
filename = _filename;
file.open(filename.c_str(), ios::in | ios::binary);
if (!file)
return false;
if (buffer) {
clear_buffer();
}
file.seekg(0, ios::end);
size = (size_t)file.tellg();
buffer = new char[size];
file.seekg(0, ios::beg);
file.read(buffer, size);
file.close();
if (_df) {
_df(buffer, (unsigned int)size);
}
return true;
}
void CLuaStreamPack::clear_buffer()
{
if (buffer)
delete[] buffer;
}
bool CLuaStreamPack::do_buffer( lua_State* L )
{
if(!buffer /*&& !open(filename.c_str(), df)*/)
return false;
int base = lua_gettop(L);
lua_pushcfunction(L, LuaHandler::traceback);
lua_insert(L, base);
const char* szName = filename.c_str();
int status = ( luaL_loadbuffer(L, buffer, size, szName) || lua_pcall(L, 0, LUA_MULTRET, base) );
//string strmsg = lua_tostring(L, -1);
lua_remove(L, base);
if (status != 0)
lua_gc(L, LUA_GCCOLLECT, 0);
return ( status == 0 ) ? true : false;
}
//////////////////////////////////////////////////////////////////////////
//
LuaHandler::LuaHandler()
{
register_function_ = NULL;
state_ = NULL;
}
LuaHandler::~LuaHandler()
{
}
bool LuaHandler::initialize( OnRegister_CFunction function_name )
{
register_function_ = function_name;
lua_State* pLuaState = luaL_newstate();
luaL_openlibs(pLuaState);
if (register_function_)
register_function_(pLuaState);
state_ = pLuaState;
return true;
}
void LuaHandler::close()
{
lua_close(state_);
}
int LuaHandler::traceback( lua_State* L )
{
lua_getglobal(L, "debug");
if (!lua_istable(L, -1)) {
lua_pop(L, 1);
return 1;
}
lua_getfield(L, -1, "traceback");
if (!lua_isfunction(L, -1)) {
lua_pop(L, 2);
return 1;
}
lua_pushvalue(L, 1); /* pass error message */
lua_pushinteger(L, 2); /* skip this function and traceback */
lua_call(L, 2, 1); /* call debug.traceback */
return 1;
}