mirror of
https://github.com/NeoFlock/neonucleus.git
synced 2025-09-24 09:03:32 +02:00
124 lines
2.7 KiB
Lua
124 lines
2.7 KiB
Lua
local io = {}
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
function io.close(file)
|
|
return (file or io.output()):close()
|
|
end
|
|
|
|
function io.flush()
|
|
return io.output():flush()
|
|
end
|
|
|
|
function io.lines(filename, ...)
|
|
if filename then
|
|
local file, reason = io.open(filename)
|
|
if not file then
|
|
error(reason, 2)
|
|
end
|
|
local args = table.pack(...)
|
|
return function()
|
|
local result = table.pack(file:read(table.unpack(args, 1, args.n)))
|
|
if not result[1] then
|
|
if result[2] then
|
|
error(result[2], 2)
|
|
else -- eof
|
|
file:close()
|
|
return nil
|
|
end
|
|
end
|
|
return table.unpack(result, 1, result.n)
|
|
end
|
|
else
|
|
return io.input():lines()
|
|
end
|
|
end
|
|
|
|
function io.open(path, mode)
|
|
-- These requires are not on top because this is a bootstrapped file.
|
|
local resolved_path = require("shell").resolve(path)
|
|
local stream, result = require("filesystem").open(resolved_path, mode)
|
|
if stream then
|
|
return require("buffer").new(mode, stream)
|
|
else
|
|
return nil, result
|
|
end
|
|
end
|
|
|
|
function io.stream(fd,file,mode)
|
|
checkArg(1,fd,'number')
|
|
checkArg(2, file, "table", "string", "nil")
|
|
assert(fd>=0,'fd must be >= 0. 0 is input, 1 is stdout, 2 is stderr')
|
|
local dio = require("process").info().data.io
|
|
if file then
|
|
if type(file) == "string" then
|
|
file = assert(io.open(file, mode))
|
|
end
|
|
dio[fd] = file
|
|
end
|
|
return dio[fd]
|
|
end
|
|
|
|
function io.input(file)
|
|
return io.stream(0, file, 'r')
|
|
end
|
|
|
|
function io.output(file)
|
|
return io.stream(1, file,'w')
|
|
end
|
|
|
|
function io.error(file)
|
|
return io.stream(2, file,'w')
|
|
end
|
|
|
|
function io.popen(prog, mode, env)
|
|
return require("pipe").popen(prog, mode, env)
|
|
end
|
|
|
|
function io.read(...)
|
|
return io.input():read(...)
|
|
end
|
|
|
|
function io.tmpfile()
|
|
local name = os.tmpname()
|
|
if name then
|
|
return io.open(name, "a")
|
|
end
|
|
end
|
|
|
|
function io.type(object)
|
|
if type(object) == "table" then
|
|
if getmetatable(object) == "file" then
|
|
if object.stream.handle then
|
|
return "file"
|
|
else
|
|
return "closed file"
|
|
end
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function io.write(...)
|
|
return io.output():write(...)
|
|
end
|
|
|
|
local dup_mt = {__index = function(dfd, key)
|
|
local fd_value = dfd.fd[key]
|
|
if key ~= "close" and type(fd_value) ~= "function" then return fd_value end
|
|
return function(self, ...)
|
|
if key == "close" or self._closed then self._closed = true return end
|
|
return fd_value(self.fd, ...)
|
|
end
|
|
end, __newindex = function(dfd, key, value)
|
|
dfd.fd[key] = value
|
|
end}
|
|
|
|
function io.dup(fd)
|
|
return setmetatable({fd=fd,_closed=false}, dup_mt)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
return io
|