diff options
| author | aunsane <aunsane@gmail.com> | 2018-03-22 01:53:49 +0300 | 
|---|---|---|
| committer | aunsane <aunsane@gmail.com> | 2018-03-22 01:54:09 +0300 | 
| commit | 2a498d86625f65f6ab308fa20c421099c785bf94 (patch) | |
| tree | 9c0d59f41411e46288f88ccdbde4a0d23f440720 /plugins/MirLua/src/mlua.cpp | |
| parent | 46cded99bbfb90bea8e998e9183c20cc3e4f7365 (diff) | |
MirLua: various fixes
- CMLua now inherit PLUGIN
- additional lua fuctions initialization moved to separated loader
- ability to realod script without object recreation
- scropt object should control own enable state
- fix m_json whit is not workes almost at all
- version bump
Diffstat (limited to 'plugins/MirLua/src/mlua.cpp')
| -rw-r--r-- | plugins/MirLua/src/mlua.cpp | 234 | 
1 files changed, 24 insertions, 210 deletions
diff --git a/plugins/MirLua/src/mlua.cpp b/plugins/MirLua/src/mlua.cpp index 3f1da7760c..b0a12289c6 100644 --- a/plugins/MirLua/src/mlua.cpp +++ b/plugins/MirLua/src/mlua.cpp @@ -2,10 +2,17 @@  int hMLuaLangpack;
 -CMLua::CMLua() : L(nullptr), Scripts(1)
 +CMLua::CMLua()
 +	: PLUGIN(MODULE),
 +	L(nullptr),
 +	Scripts(1)
  {
  	MUUID muidLast = MIID_LAST;
  	hMLuaLangpack = GetPluginLangId(muidLast, 0);
 +
 +	CreatePluginService(MS_LUA_CALL, &CMLua::Call);
 +	CreatePluginService(MS_LUA_EXEC, &CMLua::Exec);
 +	CreatePluginService(MS_LUA_EVAL, &CMLua::Eval);
  }
  CMLua::~CMLua()
 @@ -13,216 +20,17 @@ CMLua::~CMLua()  	Unload();
  }
 -/***********************************************/
 -
 -static int mlua_print(lua_State *L)
 -{
 -	CMStringA data;
 -	int nargs = lua_gettop(L);
 -	for (int i = 1; i <= nargs; i++) {
 -		switch (lua_type(L, i)) {
 -		case LUA_TNIL:
 -			data.Append("nil");
 -			break;
 -		case LUA_TBOOLEAN:
 -			data.AppendFormat("%s", lua_toboolean(L, i) ? "true" : "false");
 -			break;
 -		case LUA_TNUMBER:
 -			data.AppendFormat("%s", lua_tostring(L, i));
 -			break;
 -		case LUA_TSTRING:
 -			data.AppendFormat("'%s'", lua_tostring(L, i));
 -			break;
 -		default:
 -			if (luaL_callmeta(L, i, "__tostring")) {
 -				data.AppendFormat("'%s'", lua_tostring(L, -1));
 -				break;
 -			}
 -			data.AppendFormat("%s(0x%p)", luaL_typename(L, i), lua_topointer(L, i));
 -			break;
 -		}
 -		data.Append(", ");
 -	}
 -	if (data.GetLength() >= 1)
 -		data.Delete(data.GetLength() - 2, 2);
 -
 -	Log(data.GetBuffer());
 -
 -	return 0;
 -}
 -
 -static int mlua_toansi(lua_State *L)
 -{
 -	const char *value = luaL_checkstring(L, 1);
 -	int codepage = luaL_optinteger(L, 2, Langpack_GetDefaultCodePage());
 -
 -	ptrA string(mir_strdup(value));
 -	lua_pushstring(L, mir_utf8decodecp(string, codepage, nullptr));
 -
 -	return 1;
 -}
 -
 -static int mlua_toucs2(lua_State *L)
 -{
 -	const char *value = luaL_checkstring(L, 1);
 -
 -	ptrW unicode(mir_utf8decodeW(value));
 -	size_t length = mir_wstrlen(unicode) * sizeof(wchar_t);
 -
 -	ptrA string((char*)mir_calloc(length + 1));
 -	memcpy(string, unicode, length);
 -
 -	lua_pushlstring(L, string, length + 1);
 -
 -	return 1;
 -}
 -
 -static int mlua_topointer(lua_State *L)
 -{
 -	switch (lua_type(L, 1))
 -	{
 -	case LUA_TBOOLEAN:
 -		lua_pushlightuserdata(L, (void*)lua_toboolean(L, 1));
 -		break;
 -	case LUA_TNUMBER:
 -		if (lua_isinteger(L, 1)) {
 -			lua_Integer value = lua_tointeger(L, 1);
 -			if (value > INTPTR_MAX) {
 -				const char *msg = lua_pushfstring(L, "%f is larger than %d", value, INTPTR_MAX);
 -				return luaL_argerror(L, 1, msg);
 -			}
 -			lua_pushlightuserdata(L, (void*)value);
 -		}
 -		break;
 -	case LUA_TSTRING:
 -		lua_pushlightuserdata(L, (void*)lua_tostring(L, 1));
 -		break;
 -	case LUA_TLIGHTUSERDATA:
 -		lua_pushvalue(L, 1);
 -	default:
 -		return luaL_argerror(L, 1, luaL_typename(L, 1));
 -	}
 -
 -	return 1;
 -}
 -
 -static int mlua_tonumber(lua_State *L)
 -{
 -	if (lua_islightuserdata(L, 1)) {
 -		lua_Integer value = (lua_Integer)lua_touserdata(L, 1);
 -		lua_pushinteger(L, value);
 -		return 1;
 -	}
 -
 -	int n = lua_gettop(L);
 -	lua_pushvalue(L, lua_upvalueindex(1));
 -	lua_pushvalue(L, 1);
 -	if (n == 2)
 -		lua_pushvalue(L, 2);
 -	luaM_pcall(L, n, 1);
 -
 -	return 1;
 -}
 -
 -static int mlua_interpolate(lua_State *L)
 -{
 -	const char *string = luaL_checkstring(L, 1);
 -
 -	char pattern[128];
 -
 -	if (lua_istable(L, 2)) {
 -		for (lua_pushnil(L); lua_next(L, 2); lua_pop(L, 3)) {
 -			lua_pushvalue(L, -2);
 -			const char *key = lua_tostring(L, -1);
 -			const char *val = lua_tostring(L, -2);
 -
 -			mir_snprintf(pattern, "{%s}", key);
 -			string = luaL_gsub(L, string, pattern, val ? val : "");
 -		}
 -	}
 -	else {
 -		int nargs = lua_gettop(L);
 -		for (int i = 2; i <= nargs; i++) {
 -			const char *val = lua_tostring(L, i);
 -
 -			mir_snprintf(pattern, "{%d}", i - 1);
 -			string = luaL_gsub(L, string, pattern, val ? val : "");
 -			lua_pop(L, 1);
 -		}
 -	}
 -
 -	lua_Debug ar;
 -	int level = 1;
 -	while (lua_getstack(L, level++, &ar)) {
 -		int i = 1;
 -		while (const char *name = lua_getlocal(L, &ar, i++)) {
 -			const char *val = lua_tostring(L, -1);
 -			mir_snprintf(pattern, "{%s}", name);
 -			string = luaL_gsub(L, string, pattern, val ? val : "");
 -			lua_pop(L, 1);
 -		}
 -	}
 -
 -	lua_pushstring(L, string);
 -
 -	return 1;
 -}
 -
 -/***********************************************/
 -
 -void CMLua::SetPaths()
 -{
 -	wchar_t path[MAX_PATH];
 -
 -	lua_getglobal(L, "package");
 -
 -	FoldersGetCustomPathT(g_hCLibsFolder, path, _countof(path), VARSW(MIRLUA_PATHT));
 -	lua_pushfstring(L, "%s\\?.dll", ptrA(mir_utf8encodeW(path)));
 -	lua_setfield(L, -2, "cpath");
 -
 -	FoldersGetCustomPathT(g_hScriptsFolder, path, _countof(path), VARSW(MIRLUA_PATHT));
 -	lua_pushfstring(L, "%s\\?.lua", ptrA(mir_utf8encodeW(path)));
 -	lua_setfield(L, -2, "path");
 -
 -	lua_pop(L, 1);
 -}
 -
  void CMLua::Load()
  {
  	Log("Loading lua engine");
  	L = luaL_newstate();
 -	Log("Loading std modules");
 +	Log("Loading standard modules");
  	luaL_openlibs(L);
 -	SetPaths();
 -
 -	lua_register(L, "print", mlua_print);
 -	lua_register(L, "a", mlua_toansi);
 -	lua_register(L, "toansi", mlua_toansi);
 -	lua_register(L, "u", mlua_toucs2);
 -	lua_register(L, "toucs2", mlua_toucs2);
 -	lua_register(L, "topointer", mlua_topointer);
 -
 -	lua_getglobal(L, "tonumber");
 -	lua_pushcclosure(L, mlua_tonumber, 1);
 -	lua_setglobal(L, "tonumber");
 -
 -	lua_pushstring(L, "");
 -	lua_getmetatable(L, -1);
 -	lua_pushstring(L, "__mod");
 -	lua_pushcfunction(L, mlua_interpolate);
 -	lua_rawset(L, -3);
 -	lua_pushstring(L, "__index");
 -	lua_rawget(L, -2);
 -	lua_pushcfunction(L, mlua_interpolate);
 -	lua_setfield(L, -2, "interpolate");
 -	lua_pop(L, 3);
 -
  	lua_atpanic(L, luaM_atpanic);
 -	Log("Loading miranda modules");
 +	CMLuaFunctionLoader::Load(L);
  	CMLuaModuleLoader::Load(L);
 -	Log("Loading scripts");
  	CMLuaScriptLoader::Load(L);
  }
 @@ -243,6 +51,12 @@ void CMLua::Unload()  	lua_close(L);
  }
 +void CMLua::Reload()
 +{
 +	Unload();
 +	Load();
 +}
 +
  /***********************************************/
  static int mlua_call(lua_State *L)
 @@ -276,7 +90,7 @@ INT_PTR CMLua::Call(WPARAM wParam, LPARAM lParam)  	lua_newtable(L);
  	lua_pushcclosure(L, mlua_call, 1);
 -	
 +
  	CMLuaEnvironment env(L);
  	env.Load();
 @@ -286,11 +100,11 @@ INT_PTR CMLua::Call(WPARAM wParam, LPARAM lParam)  	return (INT_PTR)result;
  }
 -INT_PTR CMLua::Exec(WPARAM, LPARAM lParam)
 +INT_PTR CMLua::Eval(WPARAM, LPARAM lParam)
  {
 -	const wchar_t *path = (const wchar_t*)lParam;
 +	const wchar_t *script = (const wchar_t*)lParam;
 -	if (luaL_loadfile(L, ptrA(mir_utf8encodeW(path)))) {
 +	if (luaL_loadstring(L, ptrA(mir_utf8encodeW(script)))) {
  		ReportError(L);
  		return NULL;
  	}
 @@ -304,11 +118,11 @@ INT_PTR CMLua::Exec(WPARAM, LPARAM lParam)  	return (INT_PTR)result;
  }
 -INT_PTR CMLua::Eval(WPARAM, LPARAM lParam)
 +INT_PTR CMLua::Exec(WPARAM, LPARAM lParam)
  {
 -	const wchar_t *script = (const wchar_t*)lParam;
 +	const wchar_t *path = (const wchar_t*)lParam;
 -	if (luaL_loadstring(L, ptrA(mir_utf8encodeW(script)))) {
 +	if (luaL_loadfile(L, ptrA(mir_utf8encodeW(path)))) {
  		ReportError(L);
  		return NULL;
  	}
 @@ -320,4 +134,4 @@ INT_PTR CMLua::Eval(WPARAM, LPARAM lParam)  	lua_pop(L, 1);
  	return (INT_PTR)result;
 -}
\ No newline at end of file +}
  | 
