internal int[] x = null; // bit offsets, then code stack 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) { // Given a list of code lengths and a maximum table size, make a set of // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR // if the given code set is incomplete (the tables are still built in this // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of // lengths), or Z_MEM_ERROR if not enough memory. int a; // counter for codes of length k int f; // i repeats in table every f entries int g; // maximum code length int h; // table level int i; // counter, current code int j; // counter int k; // number of bits in current code int l; // bits per table (returned in m) int mask; // (1 << w) - 1, to avoid cc -O bug on HP int p; // pointer into c[], b[], or v[] int q; // points to current table int w; // bits before this table == (l * h) int xp; // pointer into x int y; // number of dummy codes added int z; // number of entries in current table // Generate counts for each bit length p = 0; i = n; do { c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX }while (i != 0); if (c[0] == n) { // null input--all zero length codes t[0] = -1; m[0] = 0; return(Z_OK); } // Find minimum and maximum length, bound *m by those l = m[0]; for (j = 1; j <= BMAX; j++) { if (c[j] != 0) { break; } } k = j; // minimum code length if (l < j) { l = j; } for (i = BMAX; i != 0; i--) { if (c[i] != 0) { break; } } g = i; // maximum code length if (l > i) { l = i; } m[0] = l; // Adjust last length count to fill out codes, if needed for (y = 1 << j; j < i; j++, y <<= 1) { if ((y -= c[j]) < 0) { return(Z_DATA_ERROR); } } if ((y -= c[i]) < 0) { return(Z_DATA_ERROR); } c[i] += y; // Generate starting offsets into the value table for each length x[1] = j = 0; p = 1; xp = 2; while (--i != 0) { // note that i == g from above x[xp] = (j += c[p]); xp++; p++; } // Make a table of values in order of bit lengths i = 0; p = 0; do { if ((j = b[bindex + p]) != 0) { v[x[j]++] = i; } p++; }while (++i < n); n = x[g]; // set n to length of v // Generate the Huffman codes and for each, make the table entries x[0] = i = 0; // first Huffman code is zero p = 0; // grab values in bit order h = -1; // no tables yet--level -1 w = -l; // bits decoded == (l * h) u[0] = 0; // just to keep compilers happy q = 0; // ditto z = 0; // ditto // go through the bit lengths (k already is bits in shortest code) for (; k <= g; k++) { a = c[k]; while (a-- != 0) { // here i is the Huffman code of length k bits for value *p // make tables up to required level while (k > w + l) { h++; w += l; // previous table always l bits // compute minimum size table less than or equal to l bits z = g - w; z = (z > l)?l:z; // table size upper limit if ((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table // too few codes for k-w bit table f -= (a + 1); // deduct codes from patterns left xp = k; if (j < z) { while (++j < z) { // try smaller tables up to z bits if ((f <<= 1) <= c[++xp]) { break; // enough codes to use up j bits } f -= c[xp]; // else deduct codes from patterns } } } z = 1 << j; // table entries for j-bit table // allocate new table if (hn[0] + z > MANY) { // (note: doesn't matter for fixed) return(Z_DATA_ERROR); // overflow of MANY } u[h] = q = hn[0]; // DEBUG hn[0] += z; // connect to last table, if there is one if (h != 0) { x[h] = i; // save pattern for backing up r[0] = (sbyte)j; // bits in this table r[1] = (sbyte)l; // bits to dump before this table j = SharedUtils.URShift(i, (w - l)); r[2] = (int)(q - u[h - 1] - j); // offset to this table Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table } else { t[0] = q; // first table is returned result } } // set up table entity in r r[1] = (sbyte)(k - w); if (p >= n) { r[0] = 128 + 64; // out of values--invalid code } else if (v[p] < s) { r[0] = (sbyte)(v[p] < 256?0:32 + 64); // 256 is end-of-block r[2] = v[p++]; // simple code is just the value } else { r[0] = (sbyte)(e[v[p] - s] + 16 + 64); // non-simple--look up in lists r[2] = d[v[p++] - s]; } // fill code-like entries with r f = 1 << (k - w); for (j = SharedUtils.URShift(i, w); j < z; j += f) { Array.Copy(r, 0, hp, (q + j) * 3, 3); } // backwards increment the k-bit code i for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1)) { i ^= j; } i ^= j; // backup over finished tables mask = (1 << w) - 1; // needed on HP, cc -O bug while ((i & mask) != x[h]) { h--; // don't need to update q w -= l; mask = (1 << w) - 1; } } } // Return Z_BUF_ERROR if we were given an incomplete table return(y != 0 && g != 1?Z_BUF_ERROR:Z_OK); }
/// <summary> /// Map from a distance to a distance code. /// </summary> /// <remarks> /// No side effects. _dist_code[256] and _dist_code[257] are never used. /// </remarks> internal static int DistanceCode(int dist) { return((dist < 256) ? _dist_code[dist] : _dist_code[256 + SharedUtils.URShift(dist, 7)]); }
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) { int num = 0; int num2 = n; do { this.c[b[bindex + num]]++; num++; num2--; }while (num2 != 0); if (this.c[0] == n) { t[0] = -1; m[0] = 0; return(0); } int num3 = m[0]; int i; for (i = 1; i <= 15; i++) { if (this.c[i] != 0) { break; } } int j = i; if (num3 < i) { num3 = i; } for (num2 = 15; num2 != 0; num2--) { if (this.c[num2] != 0) { break; } } int num4 = num2; if (num3 > num2) { num3 = num2; } m[0] = num3; int num5 = 1 << i; while (i < num2) { if ((num5 -= this.c[i]) < 0) { return(-3); } i++; num5 <<= 1; } if ((num5 -= this.c[num2]) < 0) { return(-3); } this.c[num2] += num5; i = (this.x[1] = 0); num = 1; int num6 = 2; while (--num2 != 0) { i = (this.x[num6] = i + this.c[num]); num6++; num++; } num2 = 0; num = 0; do { if ((i = b[bindex + num]) != 0) { v[this.x[i]++] = num2; } num++; }while (++num2 < n); n = this.x[num4]; num2 = (this.x[0] = 0); num = 0; int num7 = -1; int num8 = -num3; this.u[0] = 0; int num9 = 0; int num10 = 0; while (j <= num4) { int num11 = this.c[j]; while (num11-- != 0) { int num12; while (j > num8 + num3) { num7++; num8 += num3; num10 = num4 - num8; num10 = ((num10 <= num3) ? num10 : num3); if ((num12 = 1 << ((i = j - num8) & 31)) > num11 + 1) { num12 -= num11 + 1; num6 = j; if (i < num10) { while (++i < num10) { if ((num12 <<= 1) <= this.c[++num6]) { break; } num12 -= this.c[num6]; } } } num10 = 1 << i; if (hn[0] + num10 > 1440) { return(-3); } num9 = (this.u[num7] = hn[0]); hn[0] += num10; if (num7 != 0) { this.x[num7] = num2; this.r[0] = (int)((sbyte)i); this.r[1] = (int)((sbyte)num3); i = SharedUtils.URShift(num2, num8 - num3); this.r[2] = num9 - this.u[num7 - 1] - i; Array.Copy(this.r, 0, hp, (this.u[num7 - 1] + i) * 3, 3); } else { t[0] = num9; } } this.r[1] = (int)((sbyte)(j - num8)); if (num >= n) { this.r[0] = 192; } else if (v[num] < s) { this.r[0] = (int)((v[num] >= 256) ? 96 : 0); this.r[2] = v[num++]; } else { this.r[0] = (int)((sbyte)(e[v[num] - s] + 16 + 64)); this.r[2] = d[v[num++] - s]; } num12 = 1 << j - num8; for (i = SharedUtils.URShift(num2, num8); i < num10; i += num12) { Array.Copy(this.r, 0, hp, (num9 + i) * 3, 3); } i = 1 << j - 1; while ((num2 & i) != 0) { num2 ^= i; i = SharedUtils.URShift(i, 1); } num2 ^= i; int num13 = (1 << num8) - 1; while ((num2 & num13) != this.x[num7]) { num7--; num8 -= num3; num13 = (1 << num8) - 1; } } j++; } return((num5 == 0 || num4 == 1) ? 0 : -5); }
private unsafe 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) { int index = 0; int num5 = n; do { this.c[b[bindex + index]]++; index++; num5--; }while (num5 != 0); if (this.c[0] == n) { t[0] = -1; m[0] = 0; return(0); } int num8 = m[0]; int num6 = 1; while (num6 <= 15) { if (this.c[num6] != 0) { break; } num6++; } int num7 = num6; if (num8 < num6) { num8 = num6; } num5 = 15; while (num5 != 0) { if (this.c[num5] != 0) { break; } num5--; } int num3 = num5; if (num8 > num5) { num8 = num5; } m[0] = num8; int num14 = ((int)1) << num6; while (num6 < num5) { num14 -= this.c[num6]; if (num14 < 0) { return(-3); } num6++; num14 = num14 << 1; } num14 -= this.c[num5]; if (num14 < 0) { return(-3); } this.c[num5] += num14; this.x[1] = num6 = 0; index = 1; int num13 = 2; while (--num5 != 0) { this.x[num13] = num6 += this.c[index]; num13++; index++; } num5 = 0; index = 0; do { num6 = b[bindex + index]; if (num6 != 0) { v[(int)&(this.x[num6])++] = num5; } index++; }while (++num5 < n); n = this.x[num3]; this.x[0] = num5 = 0; index = 0; int num4 = -1; int bits = -num8; this.u[0] = 0; int num11 = 0; int num15 = 0; while (num7 <= num3) { int num = this.c[num7]; while (num-- != 0) { int num2; while (num7 > (bits + num8)) { num4++; bits += num8; num15 = num3 - bits; num15 = (num15 <= num8) ? num15 : num8; if ((num2 = ((int)1) << (num6 = num7 - bits)) > (num + 1)) { num2 -= num + 1; num13 = num7; if (num6 < num15) { while (++num6 < num15) { if ((num2 = num2 << 1) <= this.c[++num13]) { break; } num2 -= this.c[num13]; } } } num15 = ((int)1) << num6; if ((hn[0] + num15) > 0x5a0) { return(-3); } this.u[num4] = num11 = hn[0]; hn[0] += num15; if (num4 != 0) { this.x[num4] = num5; this.r[0] = (sbyte)num6; this.r[1] = (sbyte)num8; num6 = SharedUtils.URShift(num5, bits - num8); this.r[2] = (num11 - this.u[num4 - 1]) - num6; Array.Copy(this.r, 0, hp, (this.u[num4 - 1] + num6) * 3, 3); } else { t[0] = num11; } } this.r[1] = (sbyte)(num7 - bits); if (index >= n) { this.r[0] = 0xc0; } else if (v[index] < s) { this.r[0] = (v[index] >= 0x100) ? ((sbyte)0x60) : ((sbyte)0); this.r[2] = v[index++]; } else { this.r[0] = (sbyte)((e[v[index] - s] + 0x10) + 0x40); this.r[2] = d[v[index++] - s]; } num2 = ((int)1) << (num7 - bits); num6 = SharedUtils.URShift(num5, bits); while (num6 < num15) { Array.Copy(this.r, 0, hp, (num11 + num6) * 3, 3); num6 += num2; } num6 = ((int)1) << (num7 - 1); while ((num5 & num6) != 0) { num5 ^= num6; num6 = SharedUtils.URShift(num6, 1); } num5 ^= num6; for (int i = (((int)1) << bits) - 1; (num5 & i) != this.x[num4]; i = (((int)1) << bits) - 1) { num4--; bits -= num8; } } num7++; } return(((num14 == 0) || (num3 == 1)) ? 0 : -5); }
internal static int DistanceCode(int dist) => ((dist >= 0x100) ? ((int)_dist_code[0x100 + SharedUtils.URShift(dist, 7)]) : ((int)_dist_code[dist]));
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) { int num = 0; int num2 = n; do { c[b[bindex + num]]++; num++; num2--; }while (num2 != 0); if (c[0] == n) { t[0] = -1; m[0] = 0; return(0); } int num3 = m[0]; int i; for (i = 1; i <= 15 && c[i] == 0; i++) { } int j = i; if (num3 < i) { num3 = i; } num2 = 15; while (num2 != 0 && c[num2] == 0) { num2--; } int num4 = num2; if (num3 > num2) { num3 = num2; } m[0] = num3; int num5 = 1 << i; while (i < num2) { if ((num5 -= c[i]) < 0) { return(-3); } i++; num5 <<= 1; } if ((num5 -= c[num2]) < 0) { return(-3); } c[num2] += num5; i = (x[1] = 0); num = 1; int num6 = 2; while (--num2 != 0) { i = (x[num6] = i + c[num]); num6++; num++; } num2 = 0; num = 0; do { if ((i = b[bindex + num]) != 0) { v[x[i]++] = num2; } num++; }while (++num2 < n); n = x[num4]; num2 = (x[0] = 0); num = 0; int num7 = -1; int num8 = -num3; u[0] = 0; int num9 = 0; int num10 = 0; for (; j <= num4; j++) { int num11 = c[j]; while (num11-- != 0) { int num13; while (j > num8 + num3) { num7++; num8 += num3; num10 = num4 - num8; num10 = ((num10 <= num3) ? num10 : num3); if ((num13 = 1 << (i = j - num8)) > num11 + 1) { num13 -= num11 + 1; num6 = j; if (i < num10) { while (++i < num10 && (num13 <<= 1) > c[++num6]) { num13 -= c[num6]; } } } num10 = 1 << i; if (hn[0] + num10 > 1440) { return(-3); } num9 = (u[num7] = hn[0]); hn[0] += num10; if (num7 != 0) { x[num7] = num2; r[0] = (sbyte)i; r[1] = (sbyte)num3; i = SharedUtils.URShift(num2, num8 - num3); r[2] = num9 - u[num7 - 1] - i; Array.Copy(r, 0, hp, (u[num7 - 1] + i) * 3, 3); } else { t[0] = num9; } } r[1] = (sbyte)(j - num8); if (num >= n) { r[0] = 192; } else if (v[num] < s) { r[0] = (sbyte)((v[num] >= 256) ? 96 : 0); r[2] = v[num++]; } else { r[0] = (sbyte)(e[v[num] - s] + 16 + 64); r[2] = d[v[num++] - s]; } num13 = 1 << j - num8; for (i = SharedUtils.URShift(num2, num8); i < num10; i += num13) { Array.Copy(r, 0, hp, (num9 + i) * 3, 3); } i = 1 << j - 1; while ((num2 & i) != 0) { num2 ^= i; i = SharedUtils.URShift(i, 1); } num2 ^= i; int num16 = (1 << num8) - 1; while ((num2 & num16) != x[num7]) { num7--; num8 -= num3; num16 = (1 << num8) - 1; } } } return((num5 != 0 && num4 != 1) ? (-5) : 0); }
internal static int DistanceCode(int dist) { return((int)((dist >= 256) ? ZTree._dist_code[256 + SharedUtils.URShift(dist, 7)] : ZTree._dist_code[dist])); }