You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

376 lines
18 KiB

  1. // Copyright (c) 2006, ComponentAce
  2. // http://www.componentace.com
  3. // All rights reserved.
  4. // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
  5. // Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  6. // Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  7. // Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
  8. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  9. /*
  10. Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
  11. Redistribution and use in source and binary forms, with or without
  12. modification, are permitted provided that the following conditions are met:
  13. 1. Redistributions of source code must retain the above copyright notice,
  14. this list of conditions and the following disclaimer.
  15. 2. Redistributions in binary form must reproduce the above copyright
  16. notice, this list of conditions and the following disclaimer in
  17. the documentation and/or other materials provided with the distribution.
  18. 3. The names of the authors may not be used to endorse or promote products
  19. derived from this software without specific prior written permission.
  20. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  21. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  22. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  23. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  24. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  26. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  29. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. */
  31. /*
  32. * This program is based on zlib-1.1.3, so all credit should go authors
  33. * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
  34. * and contributors of zlib.
  35. */
  36. using System;
  37. namespace zlib
  38. {
  39. sealed class InfTree
  40. {
  41. private const int MANY = 1440;
  42. private const int Z_OK = 0;
  43. private const int Z_STREAM_END = 1;
  44. private const int Z_NEED_DICT = 2;
  45. private const int Z_ERRNO = - 1;
  46. private const int Z_STREAM_ERROR = - 2;
  47. private const int Z_DATA_ERROR = - 3;
  48. private const int Z_MEM_ERROR = - 4;
  49. private const int Z_BUF_ERROR = - 5;
  50. private const int Z_VERSION_ERROR = - 6;
  51. internal const int fixed_bl = 9;
  52. internal const int fixed_bd = 5;
  53. 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,
  54. 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,
  55. 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};
  56. 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};
  57. // Tables for deflate from PKZIP's appnote.txt.
  58. 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};
  59. 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};
  60. 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};
  61. 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};
  62. // If BMAX needs to be larger than 16, then h and x[] should be uLong.
  63. internal const int BMAX = 15; // maximum bit length of any code
  64. internal static 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)
  65. {
  66. // Given a list of code lengths and a maximum table size, make a set of
  67. // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
  68. // if the given code set is incomplete (the tables are still built in this
  69. // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
  70. // lengths), or Z_MEM_ERROR if not enough memory.
  71. int a; // counter for codes of length k
  72. int[] c = new int[BMAX + 1]; // bit length count table
  73. int f; // i repeats in table every f entries
  74. int g; // maximum code length
  75. int h; // table level
  76. int i; // counter, current code
  77. int j; // counter
  78. int k; // number of bits in current code
  79. int l; // bits per table (returned in m)
  80. int mask; // (1 << w) - 1, to avoid cc -O bug on HP
  81. int p; // pointer into c[], b[], or v[]
  82. int q; // points to current table
  83. int[] r = new int[3]; // table entry for structure assignment
  84. int[] u = new int[BMAX]; // table stack
  85. int w; // bits before this table == (l * h)
  86. int[] x = new int[BMAX + 1]; // bit offsets, then code stack
  87. int xp; // pointer into x
  88. int y; // number of dummy codes added
  89. int z; // number of entries in current table
  90. // Generate counts for each bit length
  91. p = 0; i = n;
  92. do
  93. {
  94. c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX
  95. }
  96. while (i != 0);
  97. if (c[0] == n)
  98. {
  99. // null input--all zero length codes
  100. t[0] = - 1;
  101. m[0] = 0;
  102. return Z_OK;
  103. }
  104. // Find minimum and maximum length, bound *m by those
  105. l = m[0];
  106. for (j = 1; j <= BMAX; j++)
  107. if (c[j] != 0)
  108. break;
  109. k = j; // minimum code length
  110. if (l < j)
  111. {
  112. l = j;
  113. }
  114. for (i = BMAX; i != 0; i--)
  115. {
  116. if (c[i] != 0)
  117. break;
  118. }
  119. g = i; // maximum code length
  120. if (l > i)
  121. {
  122. l = i;
  123. }
  124. m[0] = l;
  125. // Adjust last length count to fill out codes, if needed
  126. for (y = 1 << j; j < i; j++, y <<= 1)
  127. {
  128. if ((y -= c[j]) < 0)
  129. {
  130. return Z_DATA_ERROR;
  131. }
  132. }
  133. if ((y -= c[i]) < 0)
  134. {
  135. return Z_DATA_ERROR;
  136. }
  137. c[i] += y;
  138. // Generate starting offsets into the value table for each length
  139. x[1] = j = 0;
  140. p = 1; xp = 2;
  141. while (--i != 0)
  142. {
  143. // note that i == g from above
  144. x[xp] = (j += c[p]);
  145. xp++;
  146. p++;
  147. }
  148. // Make a table of values in order of bit lengths
  149. i = 0; p = 0;
  150. do
  151. {
  152. if ((j = b[bindex + p]) != 0)
  153. {
  154. v[x[j]++] = i;
  155. }
  156. p++;
  157. }
  158. while (++i < n);
  159. n = x[g]; // set n to length of v
  160. // Generate the Huffman codes and for each, make the table entries
  161. x[0] = i = 0; // first Huffman code is zero
  162. p = 0; // grab values in bit order
  163. h = - 1; // no tables yet--level -1
  164. w = - l; // bits decoded == (l * h)
  165. u[0] = 0; // just to keep compilers happy
  166. q = 0; // ditto
  167. z = 0; // ditto
  168. // go through the bit lengths (k already is bits in shortest code)
  169. for (; k <= g; k++)
  170. {
  171. a = c[k];
  172. while (a-- != 0)
  173. {
  174. // here i is the Huffman code of length k bits for value *p
  175. // make tables up to required level
  176. while (k > w + l)
  177. {
  178. h++;
  179. w += l; // previous table always l bits
  180. // compute minimum size table less than or equal to l bits
  181. z = g - w;
  182. z = (z > l)?l:z; // table size upper limit
  183. if ((f = 1 << (j = k - w)) > a + 1)
  184. {
  185. // try a k-w bit table
  186. // too few codes for k-w bit table
  187. f -= (a + 1); // deduct codes from patterns left
  188. xp = k;
  189. if (j < z)
  190. {
  191. while (++j < z)
  192. {
  193. // try smaller tables up to z bits
  194. if ((f <<= 1) <= c[++xp])
  195. break; // enough codes to use up j bits
  196. f -= c[xp]; // else deduct codes from patterns
  197. }
  198. }
  199. }
  200. z = 1 << j; // table entries for j-bit table
  201. // allocate new table
  202. if (hn[0] + z > MANY)
  203. // (note: doesn't matter for fixed)
  204. return Z_DATA_ERROR; // overflow of MANY
  205. u[h] = q = hn[0]; // DEBUG
  206. hn[0] += z;
  207. // connect to last table, if there is one
  208. if (h != 0)
  209. {
  210. x[h] = i; // save pattern for backing up
  211. r[0] = (byte) j; // bits in this table
  212. r[1] = (byte) l; // bits to dump before this table
  213. j = SupportClass.URShift(i, (w - l));
  214. r[2] = (int) (q - u[h - 1] - j); // offset to this table
  215. Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table
  216. }
  217. else
  218. {
  219. t[0] = q; // first table is returned result
  220. }
  221. }
  222. // set up table entry in r
  223. r[1] = (byte) (k - w);
  224. if (p >= n)
  225. {
  226. r[0] = 128 + 64; // out of values--invalid code
  227. }
  228. else if (v[p] < s)
  229. {
  230. r[0] = (byte) (v[p] < 256?0:32 + 64); // 256 is end-of-block
  231. r[2] = v[p++]; // simple code is just the value
  232. }
  233. else
  234. {
  235. r[0] = (byte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists
  236. r[2] = d[v[p++] - s];
  237. }
  238. // fill code-like entries with r
  239. f = 1 << (k - w);
  240. for (j = SupportClass.URShift(i, w); j < z; j += f)
  241. {
  242. Array.Copy(r, 0, hp, (q + j) * 3, 3);
  243. }
  244. // backwards increment the k-bit code i
  245. for (j = 1 << (k - 1); (i & j) != 0; j = SupportClass.URShift(j, 1))
  246. {
  247. i ^= j;
  248. }
  249. i ^= j;
  250. // backup over finished tables
  251. mask = (1 << w) - 1; // needed on HP, cc -O bug
  252. while ((i & mask) != x[h])
  253. {
  254. h--; // don't need to update q
  255. w -= l;
  256. mask = (1 << w) - 1;
  257. }
  258. }
  259. }
  260. // Return Z_BUF_ERROR if we were given an incomplete table
  261. return y != 0 && g != 1?Z_BUF_ERROR:Z_OK;
  262. }
  263. internal static int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z)
  264. {
  265. int r;
  266. int[] hn = new int[1]; // hufts used in space
  267. int[] v = new int[19]; // work area for huft_build
  268. r = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
  269. if (r == Z_DATA_ERROR)
  270. {
  271. z.msg = "oversubscribed dynamic bit lengths tree";
  272. }
  273. else if (r == Z_BUF_ERROR || bb[0] == 0)
  274. {
  275. z.msg = "incomplete dynamic bit lengths tree";
  276. r = Z_DATA_ERROR;
  277. }
  278. return r;
  279. }
  280. internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z)
  281. {
  282. int r;
  283. int[] hn = new int[1]; // hufts used in space
  284. int[] v = new int[288]; // work area for huft_build
  285. // build literal/length tree
  286. r = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
  287. if (r != Z_OK || bl[0] == 0)
  288. {
  289. if (r == Z_DATA_ERROR)
  290. {
  291. z.msg = "oversubscribed literal/length tree";
  292. }
  293. else if (r != Z_MEM_ERROR)
  294. {
  295. z.msg = "incomplete literal/length tree";
  296. r = Z_DATA_ERROR;
  297. }
  298. return r;
  299. }
  300. // build distance tree
  301. r = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
  302. if (r != Z_OK || (bd[0] == 0 && nl > 257))
  303. {
  304. if (r == Z_DATA_ERROR)
  305. {
  306. z.msg = "oversubscribed distance tree";
  307. }
  308. else if (r == Z_BUF_ERROR)
  309. {
  310. z.msg = "incomplete distance tree";
  311. r = Z_DATA_ERROR;
  312. }
  313. else if (r != Z_MEM_ERROR)
  314. {
  315. z.msg = "empty distance tree with lengths";
  316. r = Z_DATA_ERROR;
  317. }
  318. return r;
  319. }
  320. return Z_OK;
  321. }
  322. internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z)
  323. {
  324. bl[0] = fixed_bl;
  325. bd[0] = fixed_bd;
  326. tl[0] = fixed_tl;
  327. td[0] = fixed_td;
  328. return Z_OK;
  329. }
  330. }
  331. }