added a ported, minimal version of the fs API from MultICE

This commit is contained in:
Izaya 2017-07-31 12:10:07 +10:00
parent 5300a21a37
commit d477d9a069
1 changed files with 73 additions and 0 deletions

73
modules/lib/fs.lua Normal file
View File

@ -0,0 +1,73 @@
do
_G.fs = {}
local fT,hT = {},{["_c"]=0}
function fs.mount(mp,pr)
fT[mp] = pr
end
function fs.simplify(p)
local pt,npt,rp = {},{},""
for P in p:gmatch("[^/]+") do
pt[#pt+1] = P
end
for k,v in pairs(pt) do
if v == ".." then
npt[#npt] = nil
elseif v ~= "." then
npt[#npt+1] = v
end
end
for k,v in pairs(npt) do
rp=rp.."/"..v
end
if p:sub(1,1) ~= "/" then rp = rp:sub(2) end
return rp
end
function fs.resolve(p)
if p:sub(1,1) ~= "/" then -- absolute/relative path
p=(os.getenv("PWD") or "").."/"..p
end
p=fs.simplify(p)
local pt = {}
for P in p:gmatch("[^/]+") do
pt[#pt+1] = P
end
return pt, p:match("/?(.-)/"), p:match("/?.-/(.+)")
end
function fs.open(p,m)
local _,d,p = fs.resolve(p)
local d = fT[d]
local f,C=d.open(p,m),hT._c
if f then
hT._c = C + 1
hT[C] = {d,f}
return C
end
return false
end
function fs.close(h)
if hT[h] then
hT[h][1].close(hT[h][2])
end
return false
end
function fs.read(h,n)
if hT[h] then
return hT[h][1].read(hT[h][2],n)
end
return false
end
function fs.readall(f)
local s=""
repeat
c=fs.read(f,2048)
s=s..c
until c==""
return s
end
function fs.write(h,d)
if hT[h] then
return hT[h][1].write(hT[h][2],d)
end
return false
end
end