aboutsummaryrefslogtreecommitdiff
path: root/vendor/lua-bz2/bz2/ltn12.lua
blob: d2da675d7f3430fa049e8215567f1f7a7c0bf16b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
local _M = {}
local bz2 = require("bz2")

_M.filter = {}
_M.source = {}
_M.sink = {}

local function buildProcessor(filter, err)
	if not filter then
		return nil, err
	end
	return function(chunk)
		if not filter then
			return nil, "closed"
		end
		-- Skip empty chunks due to unexpected 'flushing'
		if chunk and #chunk == 0 then
			return ""
		end
		-- On nil, update closes the stream out as ltn12 expects
		local ret, err = filter:update(chunk)
		if not chunk then
			filter:close()
			filter = nil
		end
		if not ret then
			return nil, err
		end
		return ret
	end

end

function _M.filter.compress(blockSize100k, verbosity, workFactor)
	return buildProcessor(bz2.initCompress(blockSize100k, verbosity, workFactor))
end

function _M.filter.decompress(verbosity, small)
	return buildProcessor(bz2.initDecompress(verbosity, small))
end

function _M.sink.file(name, blockSize100k, verbosity, workFactor)
	local writer, err = bz2.openWrite(name, blockSize100k, verbosity, workFactor)
	if not writer then
		return nil, err
	end
	return function(data)
		if not writer then
			return nil, "closed"
		end
		if not data then
			writer:close()
			writer = nil
			return
		end
		if #data == 0 then
			return 1
		end
		local ret, err = writer:write(data)
		if not ret then
			return nil, err
		end
		return 1
	end
end

function _M.source.file(name, verbosity, small)
	local reader, err = bz2.openRead(name, verbosity, small)
	if not reader then	
		return nil, err
	end
	return function()
		if not reader then
			return
		end
		local ret, err = reader:read(true)
		if ret and #ret == 0 then
			reader:close()
			reader = nil
			return
		end
		if not ret then
			return nil, err
		end
		if err then
			reader:close()
			reader = nil
		end
		return ret
	end
end

return _M