forked from eklitzke/lua-bz2
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathltn12.lua
93 lines (85 loc) · 1.72 KB
/
ltn12.lua
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