Tue, 30 Nov 2010 13:22:35 +0000
squish.lua: AutoFetch file paths can now begin with / or . too
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 |