^ Example: deserialize('return { ["foo"] = "bar" }') -> {foo='bar'}
^ Example: deserialize('print("foo")') -> nil (function call fails)
^ error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)
+minetest.compress(data, method, ...) -> compressed_data
+^ Compress a string of data.
+^ `method` is a string identifying the compression method to be used.
+^ Supported compression methods:
+^ Deflate (zlib): "deflate"
+^ `...` indicates method-specific arguments. Currently defined arguments are:
+^ Deflate: `level` - Compression level, 0-9 or nil.
+minetest.decompress(compressed_data, method, ...) -> data
+^ Decompress a string of data (using ZLib).
+^ See documentation on minetest.compress() for supported compression methods.
+^ currently supported.
+^ `...` indicates method-specific arguments. Currently, no methods use this.
minetest.is_protected(pos, name) -> bool
^ This function should be overridden by protection mods and should be used to
check if a player can interact at a position.
#include "common/c_converter.h"
#include "common/c_content.h"
#include "cpp_api/s_async.h"
+#include "serialization.h"
#include "debug.h"
#include "porting.h"
#include "log.h"
return 1;
}
+// compress(data, method, level)
+int ModApiUtil::l_compress(lua_State *L)
+{
+ size_t size;
+ const char *data = luaL_checklstring(L, 1, &size);
+
+ int level = -1;
+ if (!lua_isnone(L, 3) && !lua_isnil(L, 3))
+ level = luaL_checknumber(L, 3);
+
+ std::ostringstream os;
+ compressZlib(std::string(data, size), os, level);
+
+ std::string out = os.str();
+
+ lua_pushlstring(L, out.data(), out.size());
+ return 1;
+}
+
+// decompress(data, method)
+int ModApiUtil::l_decompress(lua_State *L)
+{
+ size_t size;
+ const char * data = luaL_checklstring(L, 1, &size);
+
+ std::istringstream is(std::string(data, size));
+ std::ostringstream os;
+ decompressZlib(is, os);
+
+ std::string out = os.str();
+
+ lua_pushlstring(L, out.data(), out.size());
+ return 1;
+}
void ModApiUtil::Initialize(lua_State *L, int top)
{
API_FCT(is_yes);
API_FCT(get_builtin_path);
+
+ API_FCT(compress);
+ API_FCT(decompress);
}
void ModApiUtil::InitializeAsync(AsyncEngine& engine)
ASYNC_API_FCT(is_yes);
ASYNC_API_FCT(get_builtin_path);
+
+ ASYNC_API_FCT(compress);
+ ASYNC_API_FCT(decompress);
}
// get_scriptdir()
static int l_get_builtin_path(lua_State *L);
+ // compress(data, method, ...)
+ static int l_compress(lua_State *L);
+
+ // decompress(data, method, ...)
+ static int l_decompress(lua_State *L);
+
public:
static void Initialize(lua_State *L, int top);
}
}
-void compressZlib(SharedBuffer<u8> data, std::ostream &os)
+void compressZlib(SharedBuffer<u8> data, std::ostream &os, int level)
{
z_stream z;
const s32 bufsize = 16384;
z.zfree = Z_NULL;
z.opaque = Z_NULL;
- ret = deflateInit(&z, -1);
+ ret = deflateInit(&z, level);
if(ret != Z_OK)
throw SerializationError("compressZlib: deflateInit failed");
}
deflateEnd(&z);
-
}
-void compressZlib(const std::string &data, std::ostream &os)
+void compressZlib(const std::string &data, std::ostream &os, int level)
{
SharedBuffer<u8> databuf((u8*)data.c_str(), data.size());
- compressZlib(databuf, os);
+ compressZlib(databuf, os, level);
}
void decompressZlib(std::istream &is, std::ostream &os)
Misc. serialization functions
*/
-void compressZlib(SharedBuffer<u8> data, std::ostream &os);
-void compressZlib(const std::string &data, std::ostream &os);
+void compressZlib(SharedBuffer<u8> data, std::ostream &os, int level = -1);
+void compressZlib(const std::string &data, std::ostream &os, int level = -1);
void decompressZlib(std::istream &is, std::ostream &os);
// These choose between zlib and a self-made one according to version