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