IonutParau 687cfebd00 testing version of LuaBIOS and OpenOS
people were having issues getting them to work so now we promote consistency
2025-06-28 20:41:49 +02:00

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