From 0bfc5d2ad4a40388ae0ee1c71561a3ba349786f3 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 18 Nov 2024 11:52:06 +0300 Subject: [PATCH] add base64 library --- src/logic/scripting/lua/libs/api_lua.hpp | 1 + src/logic/scripting/lua/libs/libbase64.cpp | 52 ++++++++++++++++++++++ src/logic/scripting/lua/lua_engine.cpp | 1 + src/logic/scripting/lua/lua_util.hpp | 5 +++ src/util/stringutil.cpp | 4 +- src/util/stringutil.hpp | 2 +- 6 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/logic/scripting/lua/libs/libbase64.cpp diff --git a/src/logic/scripting/lua/libs/api_lua.hpp b/src/logic/scripting/lua/libs/api_lua.hpp index bd810833..b0edba79 100644 --- a/src/logic/scripting/lua/libs/api_lua.hpp +++ b/src/logic/scripting/lua/libs/api_lua.hpp @@ -15,6 +15,7 @@ // Libraries extern const luaL_Reg audiolib[]; +extern const luaL_Reg base64lib[]; extern const luaL_Reg bjsonlib[]; extern const luaL_Reg blocklib[]; extern const luaL_Reg cameralib[]; diff --git a/src/logic/scripting/lua/libs/libbase64.cpp b/src/logic/scripting/lua/libs/libbase64.cpp new file mode 100644 index 00000000..26f77eb6 --- /dev/null +++ b/src/logic/scripting/lua/libs/libbase64.cpp @@ -0,0 +1,52 @@ +#include "api_lua.hpp" + +#include "util/stringutil.hpp" + +static int l_encode(lua::State* L) { + if (lua::istable(L, 1)) { + lua::pushvalue(L, 1); + size_t size = lua::objlen(L, 1); + util::Buffer buffer(size); + for (size_t i = 0; i < size; i++) { + lua::rawgeti(L, i + 1); + buffer[i] = lua::tointeger(L, -1); + lua::pop(L); + } + lua::pop(L); + return lua::pushstring(L, util::base64_encode( + reinterpret_cast(buffer.data()), buffer.size() + )); + } else if (auto bytes = lua::touserdata(L, 1)) { + return lua::pushstring( + L, + util::base64_encode( + bytes->data().data(), + bytes->data().size() + ) + ); + } + throw std::runtime_error("array or ByteArray expected"); +} + +static int l_decode(lua::State* L) { + auto buffer = util::base64_decode(lua::require_lstring(L, 1)); + if (lua::toboolean(L, 2)) { + lua::createtable(L, buffer.size(), 0); + for (size_t i = 0; i < buffer.size(); i++) { + lua::pushinteger(L, buffer[i] & 0xFF); + lua::rawseti(L, i+1); + } + } else { + lua::newuserdata(L, buffer.size()); + auto bytearray = lua::touserdata(L, -1); + bytearray->data().reserve(buffer.size()); + std::memcpy(bytearray->data().data(), buffer.data(), buffer.size()); + } + return 1; +} + +const luaL_Reg base64lib[] = { + {"encode", lua::wrap}, + {"decode", lua::wrap}, + {NULL, NULL} +}; diff --git a/src/logic/scripting/lua/lua_engine.cpp b/src/logic/scripting/lua/lua_engine.cpp index fe3e75b5..1d24ec93 100644 --- a/src/logic/scripting/lua/lua_engine.cpp +++ b/src/logic/scripting/lua/lua_engine.cpp @@ -39,6 +39,7 @@ static void remove_lib_funcs( } static void create_libs(State* L, StateType stateType) { + openlib(L, "base64", base64lib); openlib(L, "bjson", bjsonlib); openlib(L, "block", blocklib); openlib(L, "core", corelib); diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index f2b51c53..70dd7705 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -240,6 +240,11 @@ namespace lua { inline const char* tostring(lua::State* L, int idx) { return lua_tostring(L, idx); } + inline std::string_view tolstring(lua::State* L, int idx) { + size_t len = 0; + auto string = lua_tolstring(L, idx, &len); + return std::string_view(string, len); + } inline const void* topointer(lua::State* L, int idx) { return lua_topointer(L, idx); } diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index 12f4e74c..1fabcd2c 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -363,8 +363,8 @@ util::Buffer util::base64_decode(const char* str, size_t size) { return bytes; } -util::Buffer util::base64_decode(const std::string& str) { - return base64_decode(str.c_str(), str.size()); +util::Buffer util::base64_decode(std::string_view str) { + return base64_decode(str.data(), str.size()); } int util::replaceAll( diff --git a/src/util/stringutil.hpp b/src/util/stringutil.hpp index b0cd5d56..edd0df17 100644 --- a/src/util/stringutil.hpp +++ b/src/util/stringutil.hpp @@ -63,7 +63,7 @@ namespace util { std::string base64_encode(const ubyte* data, size_t size); util::Buffer base64_decode(const char* str, size_t size); - util::Buffer base64_decode(const std::string& str); + util::Buffer base64_decode(std::string_view str); std::string tohex(uint64_t value);