mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Script: Added Unicode support
The script file can now be UTF8 encoded. There are some limitations with UTF8 data and the Lua string library, check: http://lua-users.org/lists/lua-l/2012-02/msg00241.html
This commit is contained in:
parent
dcdee91670
commit
99c67f7dac
@ -122,15 +122,14 @@ void CMeasureScript::ReadOptions(CConfigParser& parser, const WCHAR* section)
|
|||||||
{
|
{
|
||||||
m_MeterWindow->MakePathAbsolute(file);
|
m_MeterWindow->MakePathAbsolute(file);
|
||||||
}
|
}
|
||||||
std::string scriptFile = ConvertToAscii(file.c_str());
|
|
||||||
|
|
||||||
if (!m_Initialized ||
|
if (!m_Initialized ||
|
||||||
strcmp(scriptFile.c_str(), m_ScriptFile.c_str()) != 0)
|
wcscmp(file.c_str(), m_ScriptFile.c_str()) != 0)
|
||||||
{
|
{
|
||||||
DeleteLuaScript();
|
DeleteLuaScript();
|
||||||
|
|
||||||
lua_State* L = LuaManager::GetState();
|
lua_State* L = LuaManager::GetState();
|
||||||
m_ScriptFile = scriptFile;
|
m_ScriptFile = file;
|
||||||
m_LuaScript = new LuaScript(m_ScriptFile.c_str());
|
m_LuaScript = new LuaScript(m_ScriptFile.c_str());
|
||||||
|
|
||||||
if (m_LuaScript->IsInitialized())
|
if (m_LuaScript->IsInitialized())
|
||||||
@ -173,10 +172,7 @@ void CMeasureScript::ReadOptions(CConfigParser& parser, const WCHAR* section)
|
|||||||
|
|
||||||
if (!wstrValue.empty())
|
if (!wstrValue.empty())
|
||||||
{
|
{
|
||||||
std::string strStrVal = ConvertToAscii(wstrValue.c_str());
|
LuaManager::PushWide(L, wstrValue.c_str());
|
||||||
const char* strValue = strStrVal.c_str();
|
|
||||||
|
|
||||||
lua_pushstring(L, strValue);
|
|
||||||
lua_setfield(L, -3, strKey);
|
lua_setfield(L, -3, strKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +200,7 @@ void CMeasureScript::ReadOptions(CConfigParser& parser, const WCHAR* section)
|
|||||||
*/
|
*/
|
||||||
void CMeasureScript::Command(const std::wstring& command)
|
void CMeasureScript::Command(const std::wstring& command)
|
||||||
{
|
{
|
||||||
std::string str = ConvertToAscii(command.c_str());
|
std::string str = ConvertToUTF8(command.c_str());
|
||||||
m_LuaScript->RunString(str.c_str());
|
m_LuaScript->RunString(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ private:
|
|||||||
|
|
||||||
std::wstring m_StringValue;
|
std::wstring m_StringValue;
|
||||||
|
|
||||||
std::string m_ScriptFile;
|
std::wstring m_ScriptFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -61,27 +61,15 @@ void LuaManager::ReportErrors(lua_State* L)
|
|||||||
const char* error = lua_tostring(L, -1);
|
const char* error = lua_tostring(L, -1);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
const char* pos = error + 4; // Skip the drive
|
|
||||||
|
|
||||||
// Get rid of everything up to the filename
|
|
||||||
while (*pos != ':')
|
|
||||||
{
|
|
||||||
if (*pos == '\\')
|
|
||||||
{
|
|
||||||
error = pos + 1;
|
|
||||||
}
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogWithArgs(LOG_ERROR, L"Script: %S", error);
|
LogWithArgs(LOG_ERROR, L"Script: %S", error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LuaManager::PushWide(lua_State* L, const WCHAR* str)
|
void LuaManager::PushWide(lua_State* L, const WCHAR* str)
|
||||||
{
|
{
|
||||||
lua_pushstring(L, ConvertToAscii(str).c_str());
|
lua_pushstring(L, ConvertToUTF8(str).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring LuaManager::ToWide(lua_State* L, int narg)
|
std::wstring LuaManager::ToWide(lua_State* L, int narg)
|
||||||
{
|
{
|
||||||
return ConvertToWide(lua_tostring(L, narg));
|
return ConvertUTF8ToWide(lua_tostring(L, narg));
|
||||||
}
|
}
|
||||||
|
@ -25,15 +25,62 @@
|
|||||||
** The constructor
|
** The constructor
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
LuaScript::LuaScript(const char* file) :
|
LuaScript::LuaScript(const WCHAR* scriptFile) :
|
||||||
m_Ref(LUA_NOREF),
|
m_Ref(LUA_NOREF),
|
||||||
m_Initialized(true)
|
m_Initialized(false)
|
||||||
{
|
{
|
||||||
lua_State* L = LuaManager::GetState();
|
lua_State* L = LuaManager::GetState();
|
||||||
int result = luaL_loadfile(L, file);
|
|
||||||
|
|
||||||
// If the file loaded okay.
|
FILE* file = _wfopen(scriptFile, L"rb");
|
||||||
if (result == 0)
|
if (!file)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
long fileSize = ftell(file);
|
||||||
|
if (fileSize < 3)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load = 0;
|
||||||
|
std::string scriptName = ConvertToUTF8(wcsrchr(scriptFile, L'\\') + 1);
|
||||||
|
const char* scriptNameSz = scriptName.c_str();
|
||||||
|
|
||||||
|
BYTE* fileData = new BYTE[fileSize];
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
fread(fileData, fileSize, 1, file);
|
||||||
|
|
||||||
|
if (fileData[0] == 0xEF && fileData[1] == 0xBB && fileData[2] == 0xBF)
|
||||||
|
{
|
||||||
|
// Has UTF8 BOM, so assume that data is already in UTF8.
|
||||||
|
const char* utf8Data = (char*)fileData + 3;
|
||||||
|
int utf8Size = fileSize - 3;
|
||||||
|
|
||||||
|
load = luaL_loadbuffer(L, utf8Data, utf8Size, scriptNameSz);
|
||||||
|
delete [] fileData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Convert the file contents first to WCHAR with respect to the current
|
||||||
|
// code page and then to UTF8 in order to preserve code page specific chars.
|
||||||
|
|
||||||
|
int wideSize = MultiByteToWideChar(CP_ACP, 0, (char*)fileData, fileSize, NULL, 0);
|
||||||
|
WCHAR* wideData = new WCHAR[wideSize];
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, (char*)fileData, fileSize, wideData, wideSize);
|
||||||
|
delete [] fileData;
|
||||||
|
|
||||||
|
int utf8Size = WideCharToMultiByte(CP_UTF8, 0, wideData, wideSize, NULL, 0, NULL, NULL);
|
||||||
|
char* utf8Data = new char[utf8Size];
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, wideData, wideSize, utf8Data, utf8Size, NULL, NULL);
|
||||||
|
delete [] wideData;
|
||||||
|
|
||||||
|
load = luaL_loadbuffer(L, utf8Data, utf8Size, scriptNameSz);
|
||||||
|
delete [] utf8Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (load == 0)
|
||||||
{
|
{
|
||||||
// Create the table this script will reside in
|
// Create the table this script will reside in
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
@ -60,11 +107,12 @@ LuaScript::LuaScript(const char* file) :
|
|||||||
lua_setfenv(L, -2);
|
lua_setfenv(L, -2);
|
||||||
|
|
||||||
// Execute the Lua script
|
// Execute the Lua script
|
||||||
result = lua_pcall(L, 0, 0, 0);
|
if (lua_pcall(L, 0, 0, 0) == 0)
|
||||||
|
{
|
||||||
if (result)
|
m_Initialized = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
m_Initialized = false;
|
|
||||||
LuaManager::ReportErrors(L);
|
LuaManager::ReportErrors(L);
|
||||||
|
|
||||||
luaL_unref(L, LUA_GLOBALSINDEX, m_Ref);
|
luaL_unref(L, LUA_GLOBALSINDEX, m_Ref);
|
||||||
@ -73,9 +121,10 @@ LuaScript::LuaScript(const char* file) :
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Initialized = false;
|
|
||||||
LuaManager::ReportErrors(L);
|
LuaManager::ReportErrors(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -174,7 +223,7 @@ int LuaScript::RunFunctionWithReturn(const char* funcName, double& numValue, std
|
|||||||
else if (type == LUA_TSTRING)
|
else if (type == LUA_TSTRING)
|
||||||
{
|
{
|
||||||
const char* str = lua_tostring(L, -1);
|
const char* str = lua_tostring(L, -1);
|
||||||
strValue = ConvertToWide(str);
|
strValue = ConvertUTF8ToWide(str);
|
||||||
numValue = strtod(str, NULL);
|
numValue = strtod(str, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
class LuaScript
|
class LuaScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LuaScript(const char* file);
|
LuaScript(const WCHAR* scriptFile);
|
||||||
~LuaScript();
|
~LuaScript();
|
||||||
|
|
||||||
bool IsInitialized() { return m_Initialized; }
|
bool IsInitialized() { return m_Initialized; }
|
||||||
|
@ -53,7 +53,7 @@ static int Print(lua_State* L)
|
|||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log(LOG_DEBUG, ConvertToWide(message.c_str()).c_str());
|
Log(LOG_DEBUG, ConvertUTF8ToWide(message.c_str()).c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user