forked from Hyperion/HyperionOS
139 lines
3.6 KiB
Plaintext
139 lines
3.6 KiB
Plaintext
local fs={}
|
|
|
|
-- "VFS_open" : open
|
|
-- "VFS_read" : read
|
|
-- "VFS_write" : write
|
|
-- "VFS_close" : close
|
|
|
|
function fs.open(path, mode)
|
|
local fd=syscall.VFS_open(path,mode)
|
|
local ret={
|
|
close=function()
|
|
-- close file
|
|
return syscall.VFS_close(fd)
|
|
end,
|
|
flush=function()
|
|
-- close and reopen file to flush buffers
|
|
syscall.VFS_close(fd)
|
|
fd=syscall.VFS_open(path,mode)
|
|
end
|
|
}
|
|
if mode=="r" then
|
|
ret.read=function(count)
|
|
local data = syscall.VFS_read(fd,count)
|
|
return data
|
|
end
|
|
ret.readAll=function(chunkSize)
|
|
local chunks={} -- to store read chunks
|
|
while true do
|
|
local chunk=syscall.VFS_read(fd,chunkSize or 65536)
|
|
if chunk==nil or #chunk==0 then break end
|
|
table.insert(chunks,chunk)
|
|
end
|
|
return table.concat(chunks)
|
|
end
|
|
ret.readLine = function(chunkSize)
|
|
local buffer = {} -- stores leftover data
|
|
local buffer_str = "" -- concatenated buffer
|
|
local chunk_size = chunkSize or 65536 -- adjust chunk size for performance
|
|
local eof = false
|
|
|
|
while true do
|
|
-- Try to find a newline in the current buffer
|
|
local line_end = buffer_str:find("\n")
|
|
if line_end then
|
|
local line = buffer_str:sub(1, line_end - 1)
|
|
buffer_str = buffer_str:sub(line_end + 1)
|
|
return line
|
|
end
|
|
|
|
-- If EOF was reached previously and buffer is empty, stop
|
|
if eof then
|
|
if buffer_str ~= "" then
|
|
local last_line = buffer_str
|
|
buffer_str = ""
|
|
return last_line
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
-- Read the next chunk
|
|
local chunk = syscall.VFS_read(fd, chunk_size)
|
|
if not chunk or chunk == "" then
|
|
eof = true
|
|
else
|
|
buffer_str = buffer_str .. chunk
|
|
end
|
|
end
|
|
end
|
|
elseif mode=="w" then
|
|
ret.write=function(data)
|
|
-- write data to file
|
|
return syscall.VFS_write(fd,data)
|
|
end
|
|
elseif mode=="a" then
|
|
ret.write=function(data)
|
|
-- append data to file
|
|
return syscall.VFS_write(fd,data)
|
|
end
|
|
else
|
|
error("Invalid mode '"..mode.."'",2)
|
|
end
|
|
return ret
|
|
end
|
|
|
|
function fs.readAllText(path)
|
|
local file=fs.open(path,"r")
|
|
if not file then return false end
|
|
local content=file.readAll()
|
|
file.close()
|
|
return content
|
|
end
|
|
|
|
function fs.writeAllText(path, data)
|
|
local file=fs.open(path,"w")
|
|
file.write(data)
|
|
file.close()
|
|
end
|
|
|
|
function fs.appendAllText(path, data)
|
|
local file=fs.open(path,"a")
|
|
if not file then return false end
|
|
file.write(data)
|
|
file.close()
|
|
end
|
|
|
|
function fs.mkdir(path)
|
|
return syscall.VFS_mkdir(path)
|
|
end
|
|
|
|
function fs.remove(path)
|
|
return syscall.VFS_remove(path)
|
|
end
|
|
|
|
function fs.list(path)
|
|
return syscall.VFS_list(path)
|
|
end
|
|
|
|
function fs.type(path)
|
|
return syscall.VFS_type(path)
|
|
end
|
|
|
|
function fs.attributes(path)
|
|
return syscall.VFS_attributes(path)
|
|
end
|
|
|
|
function fs.exists(path)
|
|
return syscall.VFS_exists(path)
|
|
end
|
|
|
|
function fs.getcwd()
|
|
return syscall.VFS_getcwd()
|
|
end
|
|
|
|
function fs.setcwd(path)
|
|
return syscall.VFS_setcwd(path)
|
|
end
|
|
|
|
return fs |