2018-03-19 10:10:54 +11:00
|
|
|
-- This is released into the public domain.
|
|
|
|
-- No warranty is provided, implied or otherwise.
|
|
|
|
|
2018-04-12 09:04:16 +10:00
|
|
|
local function ensureMode(mode)
|
2018-03-19 10:10:54 +11:00
|
|
|
local n = "rb"
|
2018-04-12 09:04:16 +10:00
|
|
|
if type(mode) == "boolean" then
|
|
|
|
if mode then
|
|
|
|
n = "wb"
|
|
|
|
end
|
|
|
|
elseif type(mode) == "string" then
|
|
|
|
if mode == "append" then
|
|
|
|
n = "ab"
|
|
|
|
else
|
|
|
|
error("Invalid fmode " .. mode)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
error("Invalid fmode")
|
|
|
|
end
|
|
|
|
return n
|
|
|
|
end
|
|
|
|
local function create(dev, file, mode)
|
|
|
|
local n = ensureMode(mode)
|
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-04-12 09:04:16 +10:00
|
|
|
local function reader(len)
|
|
|
|
if not open then return end
|
|
|
|
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
|
|
|
|
local function writer(txt)
|
|
|
|
if not open then return end
|
|
|
|
neo.ensureType(txt, "string")
|
|
|
|
return dev.write(handle, txt)
|
|
|
|
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-04-12 09:04:16 +10:00
|
|
|
if mode == "rb" then
|
2018-03-19 10:10:54 +11:00
|
|
|
return {
|
|
|
|
close = closer,
|
2018-03-29 08:15:09 +11:00
|
|
|
seek = seeker,
|
2018-04-12 09:04:16 +10:00
|
|
|
read = reader
|
2018-03-19 10:10:54 +11:00
|
|
|
}, closer
|
|
|
|
else
|
|
|
|
return {
|
|
|
|
close = closer,
|
2018-03-29 08:15:09 +11:00
|
|
|
seek = seeker,
|
2018-04-12 09:04:16 +10:00
|
|
|
read = reader,
|
|
|
|
write = writer
|
2018-03-19 10:10:54 +11:00
|
|
|
}, closer
|
|
|
|
end
|
|
|
|
end
|
2018-04-12 09:04:16 +10:00
|
|
|
return {
|
2018-04-18 08:57:31 +10:00
|
|
|
ensureMode = ensureMode,
|
2018-04-12 09:04:16 +10:00
|
|
|
create = create
|
|
|
|
}
|