gzip/deflatelua.lua

Sun, 10 Oct 2010 02:24:41 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 10 Oct 2010 02:24:41 +0100
changeset 78
22977dbb746b
parent 65
41aeda62af16
permissions
-rwxr-xr-x

gzip/deflatelua.lua: Move licence to the top and add myself for modifications

78
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
1 --[[
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
2 LICENSE
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
3
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
4 Copyright (C) 2008, David Manura.
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
5 Modifications (C) 2010, Matthew Wild <mwild1@gmail.com>
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
6
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
7 Permission is hereby granted, free of charge, to any person obtaining a copy
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
8 of this software and associated documentation files (the "Software"), to deal
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
9 in the Software without restriction, including without limitation the rights
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
11 copies of the Software, and to permit persons to whom the Software is
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
12 furnished to do so, subject to the following conditions:
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
13
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
14 The above copyright notice and this permission notice shall be included in
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
15 all copies or substantial portions of the Software.
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
16
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
22 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
23 THE SOFTWARE.
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
24
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
25 (end license)
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
26 --]]
22977dbb746b gzip/deflatelua.lua: Move licence to the top and add myself for modifications
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
27
59
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 -- dmlib.deflate
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 -- deflate (and gunzip) implemented in Lua.
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 --
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 -- Note: only supports decompression.
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 -- Compression not implemented.
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 --
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 -- References
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 -- [1] DEFLATE Compressed Data Format Specification version 1.3
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 -- http://tools.ietf.org/html/rfc1951
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 -- [2] GZIP file format specification version 4.3
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 -- http://tools.ietf.org/html/rfc1952
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 -- [3] http://en.wikipedia.org/wiki/DEFLATE
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 -- [4] pyflate, by Paul Sladen
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 -- http://www.paul.sladen.org/projects/pyflate/
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 -- [5] Compress::Zlib::Perl - partial pure Perl implementation of
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 -- Compress::Zlib
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 -- http://search.cpan.org/~nwclark/Compress-Zlib-Perl/Perl.pm
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 --
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 -- (c) 2008 David Manura. Licensed under the same terms as Lua (MIT).
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 local assert, error, ipairs, pairs, tostring, type, setmetatable, io, math, table_sort,
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 math_max, string_char, io_open, _G =
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 assert, error, ipairs, pairs, tostring, type, setmetatable, io, math, table.sort,
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 math.max, string.char, io.open, _G;
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 local function memoize(f)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local mt = {};
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local t = setmetatable({}, mt)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 function mt:__index(k)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 local v = f(k); t[k] = v
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 return v
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 return t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 local function runtime_error(s, level)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 level = level or 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 error({s}, level+1)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local function make_os(outbs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 local os = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 os.outbs = outbs
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 os.wnd = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 os.wnd_pos = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 return os
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local function output(os, byte)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 -- debug('OUTPUT:', s)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local wnd_pos = os.wnd_pos
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 os.outbs(byte)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 os.wnd[wnd_pos] = byte
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 os.wnd_pos = wnd_pos % 32768 + 1 -- 32K
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local function noeof(val)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 return assert(val, 'unexpected end of file')
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 local function hasbit(bits, bit)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 return bits % (bit + bit) >= bit
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 -- small optimization (lookup table for powers of 2)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 local pow2 = memoize(function(n) return 2^n end)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 --local tbits = memoize(
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 -- function(bits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 -- return memoize( function(bit) return getbit(bits, bit) end )
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 -- end )
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 -- weak metatable marking objects as bitstream type
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 local is_bitstream = setmetatable({}, {__mode='k'})
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 local function bytestream_from_string(s)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 local i = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 local o = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 function o:read()
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 local by
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 if i <= #s then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 by = s:byte(i)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 i = i + 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 return by
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 return o
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local left
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 local function bitstream_from_bytestream(bys)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 local buf_byte, buf_nbit, o = 0, 0, {};
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 function o:nbits_left_in_byte()
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 return buf_nbit
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 function o:read(nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 nbits = nbits or 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 while buf_nbit < nbits do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 local byte = bys:read()
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 if not byte then return end -- note: more calls also return nil
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 buf_byte = buf_byte + pow2[buf_nbit] * byte
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 buf_nbit = buf_nbit + 8
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 local m = pow2[nbits]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 local bits = buf_byte % m
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 buf_byte = (buf_byte - bits) / m
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 buf_nbit = buf_nbit - nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 return bits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 is_bitstream[o] = true
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 return o
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 local function get_bitstream(o)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 return is_bitstream[o] and o or bitstream_from_bytestream(bytestream_from_string(o))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 local function get_obytestream(o)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 local bs
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 if io.type(o) == 'file' then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 bs = function(sbyte) o:write(string_char(sbyte)) end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 elseif type(o) == 'function' then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 bs = o
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 return bs
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 local function HuffmanTable(init, is_full)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 local t = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 if is_full then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 for val,nbits in pairs(init) do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 if nbits ~= 0 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 t[#t+1] = {val=val, nbits=nbits}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 --debug('*',val,nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 else
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 for i=1,#init-2,2 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 local firstval, nbits, nextval = init[i], init[i+1], init[i+2]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 --debug(val, nextval, nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 if nbits ~= 0 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 for val=firstval,nextval-1 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 t[#t+1] = {val=val, nbits=nbits}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 table_sort(t, function(a,b)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 return a.nbits == b.nbits and a.val < b.val or a.nbits < b.nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 end)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 -- assign codes
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 local code = 1 -- leading 1 marker
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 local nbits = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 for i,s in ipairs(t) do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 if s.nbits ~= nbits then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 code = code * pow2[s.nbits - nbits]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 nbits = s.nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 s.code = code
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 --debug('huffman code:', i, s.nbits, s.val, code, bits_tostring(code))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 code = code + 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 local minbits = math.huge
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 local look = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 for i,s in ipairs(t) do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 minbits = math.min(minbits, s.nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 look[s.code] = s.val
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 --for _,o in ipairs(t) do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 -- debug(':', o.nbits, o.val)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 --end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 -- function t:lookup(bits) return look[bits] end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 local function msb(bits, nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 local res = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 for i=1,nbits do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 local b = bits % 2
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 bits = (bits - b) / 2
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 res = res * 2 + b
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 return res
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 local tfirstcode = memoize(
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 function(bits) return pow2[minbits] + msb(bits, minbits) end)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 function t:read(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 local code, nbits = 1, 0 -- leading 1 marker
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 while 1 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 if nbits == 0 then -- small optimization (optional)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 code = tfirstcode[noeof(bs:read(minbits))]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 nbits = nbits + minbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 else
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 local b = noeof(bs:read())
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 nbits = nbits + 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 --debug('b',b)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 code = code * 2 + b -- MSB first
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 --debug('code?', code, bits_tostring(code))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 local val = look[code]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 if val then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 --debug('FOUND', val)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 return val
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 return t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 local function parse_gzip_header(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 -- local FLG_FTEXT = 2^0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 local FLG_FHCRC = 2^1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 local FLG_FEXTRA = 2^2
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 local FLG_FNAME = 2^3
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 local FLG_FCOMMENT = 2^4
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 local id1 = bs:read(8)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 local id2 = bs:read(8)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 local cm = bs:read(8) -- compression method
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 local flg = bs:read(8) -- FLaGs
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 local mtime = bs:read(32) -- Modification TIME
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268 local xfl = bs:read(8) -- eXtra FLags
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 local os = bs:read(8) -- Operating System
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 if hasbit(flg, FLG_FEXTRA) then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 local xlen = bs:read(16)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 local extra = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 for i=1,xlen do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 extra = bs:read(8)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 if hasbit(flg, FLG_FNAME) then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 while bs:read(8) ~= 0 do end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 if hasbit(flg, FLG_FCOMMENT) then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 while bs:read(8) ~= 0 do end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 if hasbit(flg, FLG_FHCRC) then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 bs:read(16)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 local function parse_huffmantables(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 local hlit = bs:read(5) -- # of literal/length codes - 257
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 local hdist = bs:read(5) -- # of distance codes - 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295 local hclen = noeof(bs:read(4)) -- # of code length codes - 4
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 local ncodelen_codes = hclen + 4
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 local codelen_init = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 local codelen_vals = {
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 for i=1,ncodelen_codes do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 local nbits = bs:read(3)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 local val = codelen_vals[i]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 codelen_init[val] = nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 local codelentable = HuffmanTable(codelen_init, true)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 local function decode(ncodes)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 local init = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 local nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 local val = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 while val < ncodes do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 local codelen = codelentable:read(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 --FIX:check nil?
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 local nrepeat
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 if codelen <= 15 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 nrepeat = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 nbits = codelen
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 --debug('w', nbits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 elseif codelen == 16 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 nrepeat = 3 + noeof(bs:read(2))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 -- nbits unchanged
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 elseif codelen == 17 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 nrepeat = 3 + noeof(bs:read(3))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 nbits = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 elseif codelen == 18 then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 nrepeat = 11 + noeof(bs:read(7))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 nbits = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 else
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 error 'ASSERT'
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 for i=1,nrepeat do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 init[val] = nbits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 val = val + 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 local huffmantable = HuffmanTable(init, true)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 return huffmantable
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 local nlit_codes = hlit + 257
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 local ndist_codes = hdist + 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 local littable = decode(nlit_codes)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 local disttable = decode(ndist_codes)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 return littable, disttable
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 local tdecode_len_base
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352 local tdecode_len_nextrabits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 local tdecode_dist_base
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 local tdecode_dist_nextrabits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 local function parse_compressed_item(bs, os, littable, disttable)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 local val = littable:read(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 --debug(val, val < 256 and string_char(val))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 if val < 256 then -- literal
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 output(os, val)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 elseif val == 256 then -- end of block
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 return true
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 else
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 if not tdecode_len_base then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 local t = {[257]=3}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 local skip = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 for i=258,285,4 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 for j=i,i+3 do t[j] = t[j-1] + skip end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 if i ~= 258 then skip = skip * 2 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 t[285] = 258
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 tdecode_len_base = t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 --for i=257,285 do debug('T1',i,t[i]) end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 if not tdecode_len_nextrabits then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 local t = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 for i=257,285 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 local j = math_max(i - 261, 0)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 t[i] = (j - (j % 4)) / 4
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 t[285] = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381 tdecode_len_nextrabits = t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 --for i=257,285 do debug('T2',i,t[i]) end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 local len_base = tdecode_len_base[val]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 local nextrabits = tdecode_len_nextrabits[val]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 local extrabits = bs:read(nextrabits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 local len = len_base + extrabits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 if not tdecode_dist_base then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 local t = {[0]=1}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391 local skip = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 for i=1,29,2 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 for j=i,i+1 do t[j] = t[j-1] + skip end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 if i ~= 1 then skip = skip * 2 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396 tdecode_dist_base = t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 --for i=0,29 do debug('T3',i,t[i]) end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399 if not tdecode_dist_nextrabits then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 local t = {}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 for i=0,29 do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 local j = math_max(i - 2, 0)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 t[i] = (j - (j % 2)) / 2
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 tdecode_dist_nextrabits = t
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 --for i=0,29 do debug('T4',i,t[i]) end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 local dist_val = disttable:read(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 local dist_base = tdecode_dist_base[dist_val]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 local dist_nextrabits = tdecode_dist_nextrabits[dist_val]
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 local dist_extrabits = bs:read(dist_nextrabits)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 local dist = dist_base + dist_extrabits
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 --debug('BACK', len, dist)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 for i=1,len do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 local pos = (os.wnd_pos - 1 - dist) % 32768 + 1 -- 32K
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 output(os, assert(os.wnd[pos], 'invalid distance'))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 return false
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 local function parse_block(bs, os)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 local bfinal = bs:read(1)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 local btype = bs:read(2)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 local BTYPE_NO_COMPRESSION = 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429 local BTYPE_FIXED_HUFFMAN = 1
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 local BTYPE_DYNAMIC_HUFFMAN = 2
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 local BTYPE_RESERVED = 3
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 if btype == BTYPE_NO_COMPRESSION then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 bs:read(bs:nbits_left_in_byte())
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 local len = bs:read(16)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436 local nlen = noeof(bs:read(16))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 for i=1,len do
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 local by = noeof(bs:read(8))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440 output(os, by)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
441 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 elseif btype == BTYPE_FIXED_HUFFMAN or btype == BTYPE_DYNAMIC_HUFFMAN then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 local littable, disttable
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 if btype == BTYPE_DYNAMIC_HUFFMAN then
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 littable, disttable = parse_huffmantables(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
446 else
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 littable = HuffmanTable {0,8, 144,9, 256,7, 280,8, 288,nil}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 disttable = HuffmanTable {0,5, 32,nil}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 repeat until parse_compressed_item(
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 bs, os, littable, disttable
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 );
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 return bfinal ~= 0
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460 local function deflate(t)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
461 local bs, os = get_bitstream(t.input)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 , make_os(get_obytestream(t.output))
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 repeat until parse_block(bs, os)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464 end
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
465
65
41aeda62af16 gzip: Some changes to make embedding decompression code compatible with uglify
Matthew Wild <mwild1@gmail.com>
parents: 59
diff changeset
466 return function (t)
59
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467 local bs = get_bitstream(t.input)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 local outbs = get_obytestream(t.output)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
470 parse_gzip_header(bs)
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
471
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
472 deflate{input=bs, output=outbs}
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 bs:read(bs:nbits_left_in_byte())
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475 bs:read()
165b36273ce7 gzip: Add support for gzipping output files, based on a very hacked compress.deflatelua by David Manura
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
476 end

mercurial