Compare commits
No commits in common. "9e7d778e211148788b01a375505e80ebbd3b8da2" and "f5262fad08054a8ff897610bb6090bc449aa635e" have entirely different histories.
9e7d778e21
...
f5262fad08
@ -23,12 +23,14 @@ end
|
|||||||
|
|
||||||
local function readBuffer(fi)
|
local function readBuffer(fi)
|
||||||
local stream = {}
|
local stream = {}
|
||||||
if fi:read(4) ~= "lz16" then
|
if fi:read(4) ~= "lz16" and not tO.f then
|
||||||
return false, "not an lz16 archive"
|
return false, "not an lz16 archive"
|
||||||
end
|
end
|
||||||
function stream.read()
|
function stream.read()
|
||||||
local len = toint(fi:read(2) or "\0\0")
|
local len = toint(fi:read(2) or "\0\0")
|
||||||
if len < 1 then
|
if len < 1 then
|
||||||
|
print("nothing")
|
||||||
|
coroutine.yield()
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
@ -56,6 +58,7 @@ end
|
|||||||
|
|
||||||
function lz16.buffer(stream)
|
function lz16.buffer(stream)
|
||||||
if stream.mode.w then
|
if stream.mode.w then
|
||||||
|
print("write")
|
||||||
return writeBuffer(stream)
|
return writeBuffer(stream)
|
||||||
end
|
end
|
||||||
return readBuffer(stream)
|
return readBuffer(stream)
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
local shell = require "shell"
|
|
||||||
local mtar = require "libmtar"
|
|
||||||
|
|
||||||
local args, opts = shell.parse(...)
|
|
||||||
|
|
||||||
local w, lz16 = pcall(require, "liblz16")
|
|
||||||
if not w then lz16 = nil end
|
|
||||||
|
|
||||||
local function toint(s)
|
|
||||||
s = s or "\0"
|
|
||||||
local n = 0
|
|
||||||
local i = 1
|
|
||||||
for p in s:gmatch(".") do
|
|
||||||
n = n << 8
|
|
||||||
n = n | string.byte(p)
|
|
||||||
i=i+1
|
|
||||||
end
|
|
||||||
return n
|
|
||||||
end
|
|
||||||
|
|
||||||
local function vw(s)
|
|
||||||
if opts.v and s then
|
|
||||||
io.write(tostring(s))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function vp(...)
|
|
||||||
for k,v in ipairs({...}) do
|
|
||||||
vw(tostring(v).."\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if opts.x then
|
|
||||||
local f
|
|
||||||
if opts.z then
|
|
||||||
f = lz16.open(args[1],"rb")
|
|
||||||
else
|
|
||||||
f = io.open(args[1],"rb")
|
|
||||||
end
|
|
||||||
if not f then error("unable to open file") end
|
|
||||||
local w, r = mtar.unarchive(f,args[2] or ".",opts.v)
|
|
||||||
f:close()
|
|
||||||
elseif opts.t then
|
|
||||||
local f
|
|
||||||
if opts.z then
|
|
||||||
f = lz16.open(args[1],"rb")
|
|
||||||
else
|
|
||||||
f = io.open(args[1],"rb")
|
|
||||||
end
|
|
||||||
if not f then error("unable to open file") end
|
|
||||||
while true do
|
|
||||||
local nlen = toint(f:read(2))
|
|
||||||
if nlen == 0 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
local name = f:read(nlen)
|
|
||||||
local fsize = toint(f:read(2) or "\0\0")
|
|
||||||
f:read(fsize)
|
|
||||||
print(name..": "..tostring(fsize))
|
|
||||||
end
|
|
||||||
f:close()
|
|
||||||
elseif opts.c then
|
|
||||||
local mode = (opts.r and "ab") or "wb"
|
|
||||||
local f
|
|
||||||
if opts.z then
|
|
||||||
f = lz16.open(args[1],mode)
|
|
||||||
else
|
|
||||||
f = io.open(args[1],mode)
|
|
||||||
end
|
|
||||||
if not f then error("unable to open file") end
|
|
||||||
table.remove(args,1)
|
|
||||||
local fs = require "filesystem"
|
|
||||||
for k,v in pairs(args) do
|
|
||||||
local ap = true
|
|
||||||
if v:sub(1,1) ~= "/" then
|
|
||||||
ap = false
|
|
||||||
v = os.getenv("PWD") .. "/" .. v
|
|
||||||
end
|
|
||||||
v=fs.canonical(v)
|
|
||||||
vw(v.."... ")
|
|
||||||
if fs.isDirectory(v) then
|
|
||||||
vp("directory.")
|
|
||||||
for file in fs.list(v) do
|
|
||||||
if ap then
|
|
||||||
args[#args+1] = v.."/"..file
|
|
||||||
else
|
|
||||||
args[#args+1] = v:sub(os.getenv("PWD"):len()+2).."/"..file
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local fsize = fs.size(v)
|
|
||||||
local inputf = io.open(v,"rb")
|
|
||||||
if fsize and inputf then
|
|
||||||
local c = 0
|
|
||||||
if ap then
|
|
||||||
f:write(mtar.genHeader(v,fsize))
|
|
||||||
else
|
|
||||||
f:write(mtar.genHeader(v:sub(os.getenv("PWD"):len()+2),fsize))
|
|
||||||
end
|
|
||||||
while true do
|
|
||||||
local ib = inputf:read(4096)
|
|
||||||
if ib then
|
|
||||||
c=c+ib:len()
|
|
||||||
f:write(ib)
|
|
||||||
else
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
vp(c)
|
|
||||||
else
|
|
||||||
vp("failed to open.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
f:close()
|
|
||||||
else
|
|
||||||
print([[Usage:
|
|
||||||
mtar -[crtxvz] <archivefile> [otherfile] [otherfile]
|
|
||||||
Operations:
|
|
||||||
x: extract archive
|
|
||||||
c: create archive
|
|
||||||
t: list contents of archive
|
|
||||||
Flags:
|
|
||||||
v: be verbose
|
|
||||||
z: use LZSS compression (requires liblz16)]])
|
|
||||||
end
|
|
@ -1,30 +0,0 @@
|
|||||||
# mtar - Minitel Archiver
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
mtar -[crtxvz] <archivefile> [otherfile] [otherfile]
|
|
||||||
|
|
||||||
## Operations
|
|
||||||
|
|
||||||
x: extract archive
|
|
||||||
c: create archive
|
|
||||||
t: list contents of archive
|
|
||||||
|
|
||||||
## Flags
|
|
||||||
|
|
||||||
v: be verbose
|
|
||||||
z: use LZSS compression (requires liblz16)]])
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
Extract archive *example.mtar*
|
|
||||||
|
|
||||||
mtar -x example.mtar
|
|
||||||
|
|
||||||
Show the files in compressed archive *example.mtar.lss*
|
|
||||||
|
|
||||||
mtar -tz example.mtar.lss
|
|
||||||
|
|
||||||
Create a compressed archive *example.mtar.lss* from file *fun* and folder *junk*
|
|
||||||
|
|
||||||
mtar -cz example.mtar.lss fun junk/
|
|
||||||
|
|
@ -20,11 +20,15 @@ local function mkdir(dir)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function toint(s)
|
local function toint(s)
|
||||||
|
s=s or ""
|
||||||
local n = 0
|
local n = 0
|
||||||
local i = 1
|
local i = 1
|
||||||
for p in s:gmatch(".") do
|
while true do
|
||||||
|
local p = s:sub(i,i)
|
||||||
|
if p == "" then break end
|
||||||
|
local b = string.byte(p)
|
||||||
n = n << 8
|
n = n << 8
|
||||||
n = n | string.byte(p)
|
n = n | b
|
||||||
i=i+1
|
i=i+1
|
||||||
end
|
end
|
||||||
return n
|
return n
|
||||||
@ -54,18 +58,17 @@ function mtar.genHeader(fname,len) -- generate a header for file *fname* when pr
|
|||||||
return string.format("%s%s%s",cint(fname:len(),2),fname,cint(len,2))
|
return string.format("%s%s%s",cint(fname:len(),2),fname,cint(len,2))
|
||||||
end
|
end
|
||||||
|
|
||||||
function mtar.unarchive(stream,dest,verbose) -- Extract mtar archive read from *stream* to *dest*. If *verbose*, print status.
|
function mtar.unarchive(stream,dest)
|
||||||
dest = dest or "."
|
dest = dest or "."
|
||||||
|
mkdir(dest)
|
||||||
while true do
|
while true do
|
||||||
local nlen = toint(stream:read(2) or "\0\0")
|
local nlen = toint(stream:read(2))
|
||||||
if nlen == 0 then
|
if nlen == 0 then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
local name = cleanPath(stream:read(nlen))
|
local name = cleanPath(stream:read(nlen))
|
||||||
local fsize = toint(stream:read(2))
|
local fsize = toint(stream:read(2))
|
||||||
if verbose then
|
print(name,fsize)
|
||||||
io.write(name.." "..tostring(fsize).."... ")
|
|
||||||
end
|
|
||||||
local dir = name:match("(.+)/.*%.?.+")
|
local dir = name:match("(.+)/.*%.?.+")
|
||||||
if (dir) then
|
if (dir) then
|
||||||
mkdir(dir)
|
mkdir(dir)
|
||||||
@ -74,18 +77,12 @@ function mtar.unarchive(stream,dest,verbose) -- Extract mtar archive read from *
|
|||||||
local rsize,buf = fsize, ""
|
local rsize,buf = fsize, ""
|
||||||
if f then
|
if f then
|
||||||
repeat
|
repeat
|
||||||
buf = stream:read(math.min(rsize,2048))
|
buf = stream:read(math.min(rsize,1024))
|
||||||
f:write(buf)
|
f:write(buf)
|
||||||
rsize = rsize - buf:len()
|
rsize = rsize - buf:len()
|
||||||
if verbose then
|
|
||||||
io.write(tostring(rsize).." ")
|
|
||||||
end
|
|
||||||
until rsize <= 1
|
until rsize <= 1
|
||||||
f:close()
|
f:close()
|
||||||
end
|
end
|
||||||
if verbose then
|
|
||||||
print("done.")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user