|
- local mtar = require "libmtar"
- local w, lz16 = pcall(require, "liblz16")
- if not w then lz16 = nil end
-
- pkgfs = {}
- local findex = {}
- local handles = {}
- local hc = 0
-
- local function rfalse()
- return false
- end
- local function rzero()
- return 0
- end
-
- pkgfs.component = {seek = rfalse, makeDirectory = rfalse, write = rfalse, rename = rfalse, setlabel = rfalse, spaceUsed = rzero, spaceTotal = rzero, lastModified = rzero}
-
- local function fopen(path,comp)
- local f
- if comp and lz16 then
- f = lz16.open(path,"rb")
- else
- f = io.open(path,"rb")
- end
- return f
- end
-
- local function fnormalize(s)
- return table.concat(fs.segments(s),"/")
- end
-
- function pkgfs.component.list(path)
- path = fnormalize(path).."/"
- local ft,rt = {},{}
- for k,v in pairs(findex) do
- k="/"..k
- if k:match(path.."([^/]+)/.+") then
- ft[k:match(path.."([^/]+)/.+").."/"] = true
- elseif k:match(path.."([^/]+)") then
- ft[k:match(path.."([^/]+)")] = true
- end
- end
- for k,v in pairs(ft) do
- rt[#rt+1] = k
- end
- return rt
- end
- function pkgfs.component.isDirectory(path)
- path = fnormalize(path).."/"
- for k,v in pairs(findex) do
- k="/"..k
- if k:match(path.."([^/]+)/.+") then
- return true
- end
- end
- return false
- end
- function pkgfs.component.size(path)
- path=fnormalize(path)
- if not findex[path] then return false end
- local f = fopen(findex[path][1], findex[path][2])
- for fname, read, fsize in mtar.iter(f) do
- if fname == path then
- return fsize
- end
- end
- return false
- end
-
- function pkgfs.component.open(path,mode)
- path=fnormalize(path)
- if mode:find("w") or mode:find("a") or not findex[path] then
- return false
- end
- local f = fopen(findex[path][1],findex[path][2])
- for fname,read,fsize in mtar.iter(f) do
- if fname == path then
- hc = hc + 1
- handles[hc] = {read, f}
- return hc
- end
- end
- end
-
- function pkgfs.component.read(handle, n)
- if not handles[handle] then return false end
- local rv = handles[handle][1](n)
- if not rv then return nil end
- if rv:len() < 1 then return nil end
- return rv
- end
-
- function pkgfs.component.close(handle)
- if not handles[handle] then return false end
- handles[handle][2]:close()
- handles[handle] = nil
- return true
- end
-
- function pkgfs.add(fname,comp)
- if fname:sub(1,1) ~= "/" then
- fname = "/"..fnormalize(os.getenv("PWD").."/"..fname)
- end
- local f = fopen(fname,comp)
- if not fname then error("unable to open file") end
- print(fname)
- for name, read, fsize in mtar.iter(f) do
- findex[fnormalize(name)] = {fname,comp}
- end
- f:close()
- end
-
- return pkgfs
|