summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-05-11 00:13:06 +0800
committerruki <[email protected]>2022-05-11 00:13:06 +0800
commit24c144ab6be8c6a86cdc555b371b86ea50e2322a (patch)
tree5e9289639c7dc4424659510941a72108037dca44
parent2ff70579a8473302cec690f4651f9be865073833 (diff)
new compress stream
-rw-r--r--xmake/core/compress/lz4.lua81
-rw-r--r--xmake/core/sandbox/modules/import/core/compress/lz4.lua18
2 files changed, 92 insertions, 7 deletions
diff --git a/xmake/core/compress/lz4.lua b/xmake/core/compress/lz4.lua
index 3c1918ab5..a6af2a77e 100644
--- a/xmake/core/compress/lz4.lua
+++ b/xmake/core/compress/lz4.lua
@@ -19,20 +19,87 @@
--
-- define module: lz4
-local lz4 = lz4 or {}
+local lz4 = lz4 or {}
+local _cstream = _cstream or {}
+local _dstream = _dstream or {}
-- load modules
local io = require("base/io")
local utils = require("base/utils")
local bytes = require("base/bytes")
+local table = require("base/table")
-- save metatable and builtin functions
-lz4._compress = lz4._compress or lz4.compress
-lz4._decompress = lz4._decompress or lz4.decompress
-lz4._block_compress = lz4._block_compress or lz4.block_compress
-lz4._block_decompress = lz4._block_decompress or lz4.block_decompress
-lz4._compress_file = lz4._compress_file or lz4.compress_file
-lz4._decompress_file = lz4._decompress_file or lz4.decompress_file
+lz4._compress = lz4._compress or lz4.compress
+lz4._decompress = lz4._decompress or lz4.decompress
+lz4._block_compress = lz4._block_compress or lz4.block_compress
+lz4._block_decompress = lz4._block_decompress or lz4.block_decompress
+lz4._compress_file = lz4._compress_file or lz4.compress_file
+lz4._decompress_file = lz4._decompress_file or lz4.decompress_file
+lz4._compress_stream_open = lz4._compress_stream_open or lz4.compress_stream_open
+lz4._compress_stream_close = lz4._compress_stream_close or lz4.compress_stream_close
+lz4._decompress_stream_open = lz4._decompress_stream_open or lz4.decompress_stream_open
+lz4._decompress_stream_close = lz4._decompress_stream_close or lz4.decompress_stream_close
+
+-- new a compress stream
+function _cstream.new(handle)
+ local instance = table.inherit(_cstream)
+ instance._HANDLE = handle
+ setmetatable(instance, _cstream)
+ return instance
+end
+
+-- get cdata of stream
+function _cstream:cdata()
+ return self._HANDLE
+end
+
+-- gc(stream)
+function _cstream:__gc()
+ if self:cdata() and lz4._compress_stream_close(self:cdata()) then
+ self._HANDLE = nil
+ end
+end
+
+-- new a decompress stream
+function _dstream.new(handle)
+ local instance = table.inherit(_dstream)
+ instance._HANDLE = handle
+ setmetatable(instance, _dstream)
+ return instance
+end
+
+-- get cdata of stream
+function _dstream:cdata()
+ return self._HANDLE
+end
+
+-- gc(stream)
+function _dstream:__gc()
+ if self:cdata() and lz4._decompress_stream_close(self:cdata()) then
+ self._HANDLE = nil
+ end
+end
+
+-- open a compress stream
+function lz4.compress_stream(opt)
+ local handle, errors = lz4._compress_stream_open()
+ if handle then
+ return _cstream.new(handle)
+ else
+ return nil, errors or "failed to open compress stream!"
+ end
+end
+
+-- open a decompress stream
+function lz4.decompress_stream(opt)
+ local handle, errors = lz4._decompress_stream_open()
+ if handle then
+ return _dstream.new(handle)
+ else
+ return nil, errors or "failed to open decompress stream!"
+ end
+end
-- compress frame data
--
diff --git a/xmake/core/sandbox/modules/import/core/compress/lz4.lua b/xmake/core/sandbox/modules/import/core/compress/lz4.lua
index 5287cc47f..c22ae43e1 100644
--- a/xmake/core/sandbox/modules/import/core/compress/lz4.lua
+++ b/xmake/core/sandbox/modules/import/core/compress/lz4.lua
@@ -77,5 +77,23 @@ function sandbox_core_compress_lz4.block_decompress(data, realsize, opt)
return result
end
+-- new compress stream
+function sandbox_core_compress_lz4.compress_stream(opt)
+ local result, errors = lz4.compress_stream(opt)
+ if not result and errors then
+ raise(errors)
+ end
+ return result
+end
+
+-- new a decompress stream
+function sandbox_core_compress_lz4.decompress_stream(opt)
+ local result, errors = lz4.decompress_stream(opt)
+ if not result and errors then
+ raise(errors)
+ end
+ return result
+end
+
-- return module
return sandbox_core_compress_lz4