From 513bac81b544b133f18e94fad4582055c007d47d Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 17 Mar 2025 20:16:52 +0300 Subject: [PATCH] fix crc32 in static build (#488) fix crc32 in static build --- res/scripts/stdmin.lua | 23 ++++----------------- src/logic/scripting/lua/libs/api_lua.hpp | 1 + src/logic/scripting/lua/lua_engine.cpp | 1 + src/logic/scripting/lua/lua_overrides.cpp | 25 +++++++++++++++++++++++ 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 9a1de9b4..6afd8681 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -26,36 +26,21 @@ function __vc_Canvas_set_data(self, data) self:_set_data(tostring(_ffi.cast("uintptr_t", canvas_ffi_buffer))) end -_ffi.cdef([[ - unsigned long crc32(unsigned long crc, const char *buf, unsigned len); -]]) - -local zlib -if _ffi.os == "Windows" then - zlib = _ffi.load("zlib1") -elseif _ffi.os == "OSX" then - zlib = _ffi.load("z") -elseif _ffi.os == "Linux" then - zlib = _ffi.load("libz.so.1") -else - error("platform does not support zlib " .. _ffi.os) -end - function crc32(bytes, chksum) local chksum = chksum or 0 local length = #bytes - if type(bytes) == "string" then - return zlib.crc32(chksum, bytes, length) - elseif type(bytes) == "table" then + if type(bytes) == "table" then + local buffer_len = _ffi.new('int[1]', length) local buffer = _ffi.new( string.format("char[%s]", length) ) for i=1, length do buffer[i - 1] = bytes[i] end - return zlib.crc32(chksum, buffer, length) + bytes = _ffi.string(buffer, buffer_len[0]) end + return _crc32(bytes, chksum) end -- Check if given table is an array diff --git a/src/logic/scripting/lua/libs/api_lua.hpp b/src/logic/scripting/lua/libs/api_lua.hpp index e44c3609..818b9c30 100644 --- a/src/logic/scripting/lua/libs/api_lua.hpp +++ b/src/logic/scripting/lua/libs/api_lua.hpp @@ -56,6 +56,7 @@ extern const luaL_Reg transformlib[]; // Lua Overrides extern int l_print(lua::State* L); +extern int l_crc32(lua::State* L); namespace lua { inline uint check_argc(lua::State* L, int a) { diff --git a/src/logic/scripting/lua/lua_engine.cpp b/src/logic/scripting/lua/lua_engine.cpp index 09c0f424..ffeaf360 100644 --- a/src/logic/scripting/lua/lua_engine.cpp +++ b/src/logic/scripting/lua/lua_engine.cpp @@ -84,6 +84,7 @@ static void create_libs(State* L, StateType stateType) { } addfunc(L, "print", lua::wrap); + addfunc(L, "_crc32", lua::wrap); } void lua::init_state(State* L, StateType stateType) { diff --git a/src/logic/scripting/lua/lua_overrides.cpp b/src/logic/scripting/lua/lua_overrides.cpp index 24746ad7..2040392c 100644 --- a/src/logic/scripting/lua/lua_overrides.cpp +++ b/src/logic/scripting/lua/lua_overrides.cpp @@ -1,4 +1,5 @@ #include +#include #include "libs/api_lua.hpp" @@ -25,3 +26,27 @@ int l_print(lua::State* L) { *output_stream << std::endl; return 0; } + +int l_crc32(lua::State* L) { + auto value = lua::tointeger(L, 2); + if (lua::isstring(L, 1)) { + auto string = lua::tolstring(L, 1); + return lua::pushinteger( + L, + crc32( + value, + reinterpret_cast(string.data()), + string.length() + ) + ); + } else if (auto bytearray = lua::touserdata(L, 1)) { + auto& bytes = bytearray->data(); + return lua::pushinteger(L, crc32(value, bytes.data(), bytes.size())); + } else if (lua::istable(L, 1)) { + std::vector bytes; + lua::read_bytes_from_table(L, 1, bytes); + return lua::pushinteger(L, crc32(value, bytes.data(), bytes.size())); + } else { + throw std::runtime_error("invalid argument 1"); + } +}