You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.0 KiB
180 lines
5.0 KiB
if not modules then modules = { } end modules ['l-gzip'] = {
|
|
version = 1.001,
|
|
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
|
|
copyright = "PRAGMA ADE / ConTeXt Development Team",
|
|
license = "see context related readme files"
|
|
}
|
|
|
|
-- We only have a few official methods here:
|
|
--
|
|
-- local decompressed = gzip.load (filename)
|
|
-- local resultsize = gzip.save (filename,compresslevel)
|
|
-- local compressed = gzip.compress (str,compresslevel)
|
|
-- local decompressed = gzip.decompress (str)
|
|
-- local iscompressed = gzip.compressed (str)
|
|
-- local suffix, okay = gzip.suffix (filename)
|
|
--
|
|
-- In LuaMetaTeX we have only xzip which implements a very few methods:
|
|
--
|
|
-- compress (str,level,method,window,memory,strategy)
|
|
-- decompress (str,window)
|
|
-- adler32 (str,checksum)
|
|
-- crc32 (str,checksum)
|
|
--
|
|
-- Special window values are:
|
|
--
|
|
-- flate : - 15
|
|
-- zlib : 15
|
|
-- gzip : 15 | 16
|
|
-- auto : 15 | 32
|
|
|
|
gzip = gzip or { } -- so in luatex we keep the old ones too
|
|
|
|
if not zlib then
|
|
zlib = xzip -- in luametatex we shadow the old one
|
|
elseif not xzip then
|
|
xzip = zlib
|
|
end
|
|
|
|
if zlib then
|
|
|
|
local suffix = file.suffix
|
|
local suffixes = file.suffixes
|
|
local find = string.find
|
|
local openfile = io.open
|
|
|
|
local gzipwindow = 15 + 16 -- +16: gzip, +32: gzip|zlib
|
|
local gziplevel = 3
|
|
local identifier = "^\x1F\x8B\x08"
|
|
|
|
local compress = zlib.compress
|
|
local decompress = zlib.decompress
|
|
|
|
function gzip.load(filename)
|
|
local f = openfile(filename,"rb")
|
|
if not f then
|
|
-- invalid file
|
|
else
|
|
local data = f:read("*all")
|
|
f:close()
|
|
if data and data ~= "" then
|
|
if suffix(filename) == "gz" then
|
|
data = decompress(data,gzipwindow)
|
|
end
|
|
return data
|
|
end
|
|
end
|
|
end
|
|
|
|
function gzip.save(filename,data,level)
|
|
if suffix(filename) ~= "gz" then
|
|
filename = filename .. ".gz"
|
|
end
|
|
local f = openfile(filename,"wb")
|
|
if f then
|
|
data = compress(data or "",level or gziplevel,nil,gzipwindow)
|
|
f:write(data)
|
|
f:close()
|
|
return #data
|
|
end
|
|
end
|
|
|
|
function gzip.suffix(filename)
|
|
local suffix, extra = suffixes(filename)
|
|
local gzipped = extra == "gz"
|
|
return suffix, gzipped
|
|
end
|
|
|
|
function gzip.compressed(s)
|
|
return s and find(s,identifier)
|
|
end
|
|
|
|
function gzip.compress(s,level)
|
|
if s and not find(s,identifier) then -- the find check might go away
|
|
if not level then
|
|
level = gziplevel
|
|
elseif level <= 0 then
|
|
return s
|
|
elseif level > 9 then
|
|
level = 9
|
|
end
|
|
return compress(s,level or gziplevel,nil,gzipwindow) or s
|
|
end
|
|
end
|
|
|
|
function gzip.decompress(s)
|
|
if s and find(s,identifier) then
|
|
return decompress(s,gzipwindow)
|
|
else
|
|
return s
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-- In luametatex we can use this one but it doesn't look like there wil be stream
|
|
-- support so for now we still use zlib (the performance difference is not that
|
|
-- spectacular in our usage.
|
|
|
|
-- if flate then
|
|
--
|
|
-- local type = type
|
|
-- local find = string.find
|
|
--
|
|
-- local compress = flate.gz_compress
|
|
-- local decompress = flate.gz_decompress
|
|
--
|
|
-- local absmax = 128*1024*1024
|
|
-- local initial = 64*1024
|
|
-- local identifier = "^\x1F\x8B\x08"
|
|
--
|
|
-- function gzip.compressed(s)
|
|
-- return s and find(s,identifier)
|
|
-- end
|
|
--
|
|
-- function gzip.compress(s,level)
|
|
-- if s and not find(s,identifier) then -- the find check might go away
|
|
-- if not level then
|
|
-- level = 3
|
|
-- elseif level <= 0 then
|
|
-- return s
|
|
-- elseif level > 9 then
|
|
-- level = 9
|
|
-- end
|
|
-- return compress(s,level) or s
|
|
-- end
|
|
-- end
|
|
--
|
|
-- function gzip.decompress(s,size,iterate)
|
|
-- if s and find(s,identifier) then
|
|
-- if type(size) ~= "number" then
|
|
-- size = initial
|
|
-- end
|
|
-- if size > absmax then
|
|
-- size = absmax
|
|
-- end
|
|
-- if type(iterate) == "number" then
|
|
-- max = size * iterate
|
|
-- elseif iterate == nil or iterate == true then
|
|
-- iterate = true
|
|
-- max = absmax
|
|
-- end
|
|
-- if max > absmax then
|
|
-- max = absmax
|
|
-- end
|
|
-- while true do
|
|
-- local d = decompress(s,size)
|
|
-- if d then
|
|
-- return d
|
|
-- end
|
|
-- size = 2 * size
|
|
-- if not iterate or size > max then
|
|
-- return false
|
|
-- end
|
|
-- end
|
|
-- else
|
|
-- return s
|
|
-- end
|
|
-- end
|
|
--
|
|
-- end
|
|
|