2018-03-19 10:10:54 +11:00
|
|
|
-- This is released into the public domain.
|
|
|
|
-- No warranty is provided, implied or otherwise.
|
|
|
|
|
|
|
|
return function(dev, file, mode)
|
|
|
|
local n = "rb"
|
|
|
|
if mode then n = "wb" end
|
2018-03-28 00:40:05 +11:00
|
|
|
local handle, r = dev.open(file, n)
|
|
|
|
if not handle then return nil, r end
|
2018-03-19 10:10:54 +11:00
|
|
|
local open = true
|
|
|
|
local function closer()
|
|
|
|
if not open then return end
|
|
|
|
open = false
|
|
|
|
pcall(function()
|
|
|
|
dev.close(handle)
|
|
|
|
end)
|
|
|
|
end
|
2018-03-29 08:15:09 +11:00
|
|
|
local function seeker(whence, point)
|
|
|
|
if not open then return end
|
|
|
|
return dev.seek(handle, whence, point)
|
|
|
|
end
|
2018-03-19 10:10:54 +11:00
|
|
|
if not mode then
|
|
|
|
return {
|
|
|
|
close = closer,
|
2018-03-29 08:15:09 +11:00
|
|
|
seek = seeker,
|
2018-03-19 10:10:54 +11:00
|
|
|
read = function (len)
|
|
|
|
if len == "*a" then
|
|
|
|
local ch = ""
|
|
|
|
local c = dev.read(handle, neo.readBufSize)
|
|
|
|
while c do
|
|
|
|
ch = ch .. c
|
|
|
|
c = dev.read(handle, neo.readBufSize)
|
|
|
|
end
|
|
|
|
return ch
|
|
|
|
end
|
|
|
|
if type(len) ~= "number" then error("Length of read must be number or '*a'") end
|
|
|
|
return dev.read(handle, len)
|
|
|
|
end
|
|
|
|
}, closer
|
|
|
|
else
|
|
|
|
return {
|
|
|
|
close = closer,
|
2018-03-29 08:15:09 +11:00
|
|
|
seek = seeker,
|
2018-03-19 10:10:54 +11:00
|
|
|
write = function (txt)
|
|
|
|
if type(txt) ~= "string" then error("Write data must be string-bytearray") end
|
2018-03-28 00:40:05 +11:00
|
|
|
local ok, b = dev.write(handle, txt)
|
|
|
|
if not ok then error(tostring(b)) end
|
2018-03-19 10:10:54 +11:00
|
|
|
end
|
|
|
|
}, closer
|
|
|
|
end
|
|
|
|
end
|