Free cookie consent management tool by TermsFeed Policy Generator

source: stable/HeuristicLab.ExtLibs/HeuristicLab.EPPlus/4.0.3/EPPlus-4.0.3/Packaging/DotNetZip/Zlib/InfTree.cs @ 12707

Last change on this file since 12707 was 12074, checked in by sraggl, 10 years ago

#2341: Added EPPlus-4.0.3 to ExtLibs

File size: 29.1 KB
Line 
1// Inftree.cs
2// ------------------------------------------------------------------
3//
4// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. 
5// All rights reserved.
6//
7// This code module is part of DotNetZip, a zipfile class library.
8//
9// ------------------------------------------------------------------
10//
11// This code is licensed under the Microsoft Public License.
12// See the file License.txt for the license details.
13// More info on: http://dotnetzip.codeplex.com
14//
15// ------------------------------------------------------------------
16//
17// last saved (in emacs):
18// Time-stamp: <2009-October-28 12:43:54>
19//
20// ------------------------------------------------------------------
21//
22// This module defines classes used in  decompression. This code is derived
23// from the jzlib implementation of zlib. In keeping with the license for jzlib,
24// the copyright to that code is below.
25//
26// ------------------------------------------------------------------
27//
28// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
29//
30// Redistribution and use in source and binary forms, with or without
31// modification, are permitted provided that the following conditions are met:
32//
33// 1. Redistributions of source code must retain the above copyright notice,
34// this list of conditions and the following disclaimer.
35//
36// 2. Redistributions in binary form must reproduce the above copyright
37// notice, this list of conditions and the following disclaimer in
38// the documentation and/or other materials provided with the distribution.
39//
40// 3. The names of the authors may not be used to endorse or promote products
41// derived from this software without specific prior written permission.
42//
43// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
44// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
45// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
46// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
47// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
49// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
50// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
51// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
52// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53//
54// -----------------------------------------------------------------------
55//
56// This program is based on zlib-1.1.3; credit to authors
57// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
58// and contributors of zlib.
59//
60// -----------------------------------------------------------------------
61
62
63
64using System;
65namespace OfficeOpenXml.Packaging.Ionic.Zlib
66{
67       
68        sealed class InfTree
69        {
70               
71                private const int MANY = 1440;
72               
73                private const int Z_OK = 0;
74                private const int Z_STREAM_END = 1;
75                private const int Z_NEED_DICT = 2;
76                private const int Z_ERRNO = - 1;
77                private const int Z_STREAM_ERROR = - 2;
78                private const int Z_DATA_ERROR = - 3;
79                private const int Z_MEM_ERROR = - 4;
80                private const int Z_BUF_ERROR = - 5;
81                private const int Z_VERSION_ERROR = - 6;
82               
83                internal const int fixed_bl = 9;
84                internal const int fixed_bd = 5;
85               
86                //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
87                internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186,
88                        0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8,
89                        14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255};
90                //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
91                internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577};
92               
93                // Tables for deflate from PKZIP's appnote.txt.
94                //UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
95                internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
96               
97                // see note #13 above about 258
98                //UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
99                internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112};
100               
101                //UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
102                internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
103               
104                //UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
105                internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
106               
107                // If BMAX needs to be larger than 16, then h and x[] should be uLong.
108                internal const int BMAX = 15; // maximum bit length of any code
109               
110                internal int[] hn = null; // hufts used in space
111                internal int[] v = null; // work area for huft_build
112                internal int[] c = null; // bit length count table
113                internal int[] r = null; // table entry for structure assignment
114                internal int[] u = null; // table stack
115                internal int[] x = null; // bit offsets, then code stack
116               
117                private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v)
118                {
119                        // Given a list of code lengths and a maximum table size, make a set of
120                        // tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
121                        // if the given code set is incomplete (the tables are still built in this
122                        // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
123                        // lengths), or Z_MEM_ERROR if not enough memory.
124                       
125                        int a; // counter for codes of length k
126                        int f; // i repeats in table every f entries
127                        int g; // maximum code length
128                        int h; // table level
129                        int i; // counter, current code
130                        int j; // counter
131                        int k; // number of bits in current code
132                        int l; // bits per table (returned in m)
133                        int mask; // (1 << w) - 1, to avoid cc -O bug on HP
134                        int p; // pointer into c[], b[], or v[]
135                        int q; // points to current table
136                        int w; // bits before this table == (l * h)
137                        int xp; // pointer into x
138                        int y; // number of dummy codes added
139                        int z; // number of entries in current table
140                       
141                        // Generate counts for each bit length
142                       
143                        p = 0; i = n;
144                        do
145                        {
146                                c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX
147                        }
148                        while (i != 0);
149                       
150                        if (c[0] == n)
151                        {
152                                // null input--all zero length codes
153                                t[0] = - 1;
154                                m[0] = 0;
155                                return Z_OK;
156                        }
157                       
158                        // Find minimum and maximum length, bound *m by those
159                        l = m[0];
160                        for (j = 1; j <= BMAX; j++)
161                                if (c[j] != 0)
162                                        break;
163                        k = j; // minimum code length
164                        if (l < j)
165                        {
166                                l = j;
167                        }
168                        for (i = BMAX; i != 0; i--)
169                        {
170                                if (c[i] != 0)
171                                        break;
172                        }
173                        g = i; // maximum code length
174                        if (l > i)
175                        {
176                                l = i;
177                        }
178                        m[0] = l;
179                       
180                        // Adjust last length count to fill out codes, if needed
181                        for (y = 1 << j; j < i; j++, y <<= 1)
182                        {
183                                if ((y -= c[j]) < 0)
184                                {
185                                        return Z_DATA_ERROR;
186                                }
187                        }
188                        if ((y -= c[i]) < 0)
189                        {
190                                return Z_DATA_ERROR;
191                        }
192                        c[i] += y;
193                       
194                        // Generate starting offsets into the value table for each length
195                        x[1] = j = 0;
196                        p = 1; xp = 2;
197                        while (--i != 0)
198                        {
199                                // note that i == g from above
200                                x[xp] = (j += c[p]);
201                                xp++;
202                                p++;
203                        }
204                       
205                        // Make a table of values in order of bit lengths
206                        i = 0; p = 0;
207                        do
208                        {
209                                if ((j = b[bindex + p]) != 0)
210                                {
211                                        v[x[j]++] = i;
212                                }
213                                p++;
214                        }
215                        while (++i < n);
216                        n = x[g]; // set n to length of v
217                       
218                        // Generate the Huffman codes and for each, make the table entries
219                        x[0] = i = 0; // first Huffman code is zero
220                        p = 0; // grab values in bit order
221                        h = - 1; // no tables yet--level -1
222                        w = - l; // bits decoded == (l * h)
223                        u[0] = 0; // just to keep compilers happy
224                        q = 0; // ditto
225                        z = 0; // ditto
226                       
227                        // go through the bit lengths (k already is bits in shortest code)
228                        for (; k <= g; k++)
229                        {
230                                a = c[k];
231                                while (a-- != 0)
232                                {
233                                        // here i is the Huffman code of length k bits for value *p
234                                        // make tables up to required level
235                                        while (k > w + l)
236                                        {
237                                                h++;
238                                                w += l; // previous table always l bits
239                                                // compute minimum size table less than or equal to l bits
240                                                z = g - w;
241                                                z = (z > l)?l:z; // table size upper limit
242                                                if ((f = 1 << (j = k - w)) > a + 1)
243                                                {
244                                                        // try a k-w bit table
245                                                        // too few codes for k-w bit table
246                                                        f -= (a + 1); // deduct codes from patterns left
247                                                        xp = k;
248                                                        if (j < z)
249                                                        {
250                                                                while (++j < z)
251                                                                {
252                                                                        // try smaller tables up to z bits
253                                                                        if ((f <<= 1) <= c[++xp])
254                                                                                break; // enough codes to use up j bits
255                                                                        f -= c[xp]; // else deduct codes from patterns
256                                                                }
257                                                        }
258                                                }
259                                                z = 1 << j; // table entries for j-bit table
260                                               
261                                                // allocate new table
262                                                if (hn[0] + z > MANY)
263                                                {
264                                                        // (note: doesn't matter for fixed)
265                                                        return Z_DATA_ERROR; // overflow of MANY
266                                                }
267                                                u[h] = q = hn[0]; // DEBUG
268                                                hn[0] += z;
269                                               
270                                                // connect to last table, if there is one
271                                                if (h != 0)
272                                                {
273                                                        x[h] = i; // save pattern for backing up
274                                                        r[0] = (sbyte) j; // bits in this table
275                                                        r[1] = (sbyte) l; // bits to dump before this table
276                                                        j = SharedUtils.URShift(i, (w - l));
277                                                        r[2] = (int) (q - u[h - 1] - j); // offset to this table
278                                                        Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table
279                                                }
280                                                else
281                                                {
282                                                        t[0] = q; // first table is returned result
283                                                }
284                                        }
285                                       
286                                        // set up table entry in r
287                                        r[1] = (sbyte) (k - w);
288                                        if (p >= n)
289                                        {
290                                                r[0] = 128 + 64; // out of values--invalid code
291                                        }
292                                        else if (v[p] < s)
293                                        {
294                                                r[0] = (sbyte) (v[p] < 256?0:32 + 64); // 256 is end-of-block
295                                                r[2] = v[p++]; // simple code is just the value
296                                        }
297                                        else
298                                        {
299                                                r[0] = (sbyte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists
300                                                r[2] = d[v[p++] - s];
301                                        }
302                                       
303                                        // fill code-like entries with r
304                                        f = 1 << (k - w);
305                                        for (j = SharedUtils.URShift(i, w); j < z; j += f)
306                                        {
307                                                Array.Copy(r, 0, hp, (q + j) * 3, 3);
308                                        }
309                                       
310                                        // backwards increment the k-bit code i
311                                        for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1))
312                                        {
313                                                i ^= j;
314                                        }
315                                        i ^= j;
316                                       
317                                        // backup over finished tables
318                                        mask = (1 << w) - 1; // needed on HP, cc -O bug
319                                        while ((i & mask) != x[h])
320                                        {
321                                                h--; // don't need to update q
322                                                w -= l;
323                                                mask = (1 << w) - 1;
324                                        }
325                                }
326                        }
327                        // Return Z_BUF_ERROR if we were given an incomplete table
328                        return y != 0 && g != 1?Z_BUF_ERROR:Z_OK;
329                }
330               
331                internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec z)
332                {
333                        int result;
334                        initWorkArea(19);
335                        hn[0] = 0;
336                        result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
337                       
338                        if (result == Z_DATA_ERROR)
339                        {
340                                z.Message = "oversubscribed dynamic bit lengths tree";
341                        }
342                        else if (result == Z_BUF_ERROR || bb[0] == 0)
343                        {
344                                z.Message = "incomplete dynamic bit lengths tree";
345                                result = Z_DATA_ERROR;
346                        }
347                        return result;
348                }
349               
350                internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZlibCodec z)
351                {
352                        int result;
353                       
354                        // build literal/length tree
355                        initWorkArea(288);
356                        hn[0] = 0;
357                        result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
358                        if (result != Z_OK || bl[0] == 0)
359                        {
360                                if (result == Z_DATA_ERROR)
361                                {
362                                        z.Message = "oversubscribed literal/length tree";
363                                }
364                                else if (result != Z_MEM_ERROR)
365                                {
366                                        z.Message = "incomplete literal/length tree";
367                                        result = Z_DATA_ERROR;
368                                }
369                                return result;
370                        }
371                       
372                        // build distance tree
373                        initWorkArea(288);
374                        result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
375                       
376                        if (result != Z_OK || (bd[0] == 0 && nl > 257))
377                        {
378                                if (result == Z_DATA_ERROR)
379                                {
380                                        z.Message = "oversubscribed distance tree";
381                                }
382                                else if (result == Z_BUF_ERROR)
383                                {
384                                        z.Message = "incomplete distance tree";
385                                        result = Z_DATA_ERROR;
386                                }
387                                else if (result != Z_MEM_ERROR)
388                                {
389                                        z.Message = "empty distance tree with lengths";
390                                        result = Z_DATA_ERROR;
391                                }
392                                return result;
393                        }
394                       
395                        return Z_OK;
396                }
397               
398                internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZlibCodec z)
399                {
400                        bl[0] = fixed_bl;
401                        bd[0] = fixed_bd;
402                        tl[0] = fixed_tl;
403                        td[0] = fixed_td;
404                        return Z_OK;
405                }
406               
407                private void  initWorkArea(int vsize)
408                {
409                        if (hn == null)
410                        {
411                                hn = new int[1];
412                                v = new int[vsize];
413                                c = new int[BMAX + 1];
414                                r = new int[3];
415                                u = new int[BMAX];
416                                x = new int[BMAX + 1];
417                        }
418                        else
419                        {
420                            if (v.Length < vsize)
421                            {
422                                v = new int[vsize];
423                            }
424                            Array.Clear(v,0,vsize);
425                            Array.Clear(c,0,BMAX+1);
426                            r[0]=0; r[1]=0; r[2]=0;
427                            //  for(int i=0; i<BMAX; i++){u[i]=0;}
428                            //Array.Copy(c, 0, u, 0, BMAX);
429                            Array.Clear(u,0,BMAX);
430                            //  for(int i=0; i<BMAX+1; i++){x[i]=0;}
431                            //Array.Copy(c, 0, x, 0, BMAX + 1);
432                            Array.Clear(x,0,BMAX+1);
433                        }
434                }
435        }
436}
Note: See TracBrowser for help on using the repository browser.