internal ZlibCompressionState Proc(InfBlocks s, ZStream z, ZlibCompressionState r) { int j; // temporary storage // int[] t; // temporary pointer int tindex; // temporary pointer int e; // extra bits or operation var b = 0; // bit buffer var k = 0; // bits in bit buffer var p = 0; // input data pointer int n; // bytes available there int q; // output window write pointer int m; // bytes to end of window or read pointer int f; // pointer to copy strings from // copy input/output information to locals (UPDATE macro restores) p = z.NextInIndex; n = z.AvailIn; b = s.Bitb; k = s.Bitk; q = s.Write; m = q < s.Read ? s.Read - q - 1 : s.End - q; // process input and output based on current state while (true) { switch (this.Mode) { // waiting for "i:"=input, "o:"=output, "x:"=nothing case START: // x: set up for LEN if (m >= 258 && n >= 10) { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; r = Inflate_fast(this.Lbits, this.Dbits, this.Ltree, this.LtreeIndex, this.Dtree, this.DtreeIndex, s, z); p = z.NextInIndex; n = z.AvailIn; b = s.Bitb; k = s.Bitk; q = s.Write; m = q < s.Read ? s.Read - q - 1 : s.End - q; if (r != ZlibCompressionState.ZOK) { this.Mode = r == ZlibCompressionState.ZSTREAMEND ? WASH : BADCODE; break; } } this.Need = this.Lbits; this.Tree = this.Ltree; this.TreeIndex = this.LtreeIndex; this.Mode = LEN; goto case LEN; case LEN: // i: get length/literal/eob next j = this.Need; while (k < j) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } tindex = (this.TreeIndex + (b & InflateMask[j])) * 3; b = SupportClass.URShift(b, this.Tree[tindex + 1]); k -= this.Tree[tindex + 1]; e = this.Tree[tindex]; if (e == 0) { // literal this.Lit = this.Tree[tindex + 2]; this.Mode = LIT; break; } if ((e & 16) != 0) { // length this.GetRenamed = e & 15; this.Len = this.Tree[tindex + 2]; this.Mode = LENEXT; break; } if ((e & 64) == 0) { // next table this.Need = e; this.TreeIndex = (tindex / 3) + this.Tree[tindex + 2]; break; } if ((e & 32) != 0) { // end of block this.Mode = WASH; break; } this.Mode = BADCODE; // invalid code z.Msg = "invalid literal/length code"; r = ZlibCompressionState.ZDATAERROR; s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); case LENEXT: // i: getting length extra (have base) j = this.GetRenamed; while (k < j) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } this.Len += b & InflateMask[j]; b >>= j; k -= j; this.Need = this.Dbits; this.Tree = this.Dtree; this.TreeIndex = this.DtreeIndex; this.Mode = DIST; goto case DIST; case DIST: // i: get distance next j = this.Need; while (k < j) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } tindex = (this.TreeIndex + (b & InflateMask[j])) * 3; b >>= this.Tree[tindex + 1]; k -= this.Tree[tindex + 1]; e = this.Tree[tindex]; if ((e & 16) != 0) { // distance this.GetRenamed = e & 15; this.Dist = this.Tree[tindex + 2]; this.Mode = DISTEXT; break; } if ((e & 64) == 0) { // next table this.Need = e; this.TreeIndex = (tindex / 3) + this.Tree[tindex + 2]; break; } this.Mode = BADCODE; // invalid code z.Msg = "invalid distance code"; r = ZlibCompressionState.ZDATAERROR; s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); case DISTEXT: // i: getting distance extra j = this.GetRenamed; while (k < j) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } this.Dist += b & InflateMask[j]; b >>= j; k -= j; this.Mode = COPY; goto case COPY; case COPY: // o: copying bytes in window, waiting for space f = q - this.Dist; while (f < 0) { // modulo window size-"while" instead f += s.End; // of "if" handles invalid distances } while (this.Len != 0) { if (m == 0) { if (q == s.End && s.Read != 0) { q = 0; m = q < s.Read ? s.Read - q - 1 : s.End - q; } if (m == 0) { s.Write = q; r = s.Inflate_flush(z, r); q = s.Write; m = q < s.Read ? s.Read - q - 1 : s.End - q; if (q == s.End && s.Read != 0) { q = 0; m = q < s.Read ? s.Read - q - 1 : s.End - q; } if (m == 0) { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } } } s.Window[q++] = s.Window[f++]; m--; if (f == s.End) { f = 0; } this.Len--; } this.Mode = START; break; case LIT: // o: got literal, waiting for output space if (m == 0) { if (q == s.End && s.Read != 0) { q = 0; m = q < s.Read ? s.Read - q - 1 : s.End - q; } if (m == 0) { s.Write = q; r = s.Inflate_flush(z, r); q = s.Write; m = q < s.Read ? s.Read - q - 1 : s.End - q; if (q == s.End && s.Read != 0) { q = 0; m = q < s.Read ? s.Read - q - 1 : s.End - q; } if (m == 0) { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } } } r = ZlibCompressionState.ZOK; s.Window[q++] = (byte)this.Lit; m--; this.Mode = START; break; case WASH: // o: got eob, possibly more output if (k > 7) { // return unused byte, if any k -= 8; n++; p--; // can always return one } s.Write = q; r = s.Inflate_flush(z, r); q = s.Write; m = q < s.Read ? s.Read - q - 1 : s.End - q; if (s.Read != s.Write) { s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } this.Mode = END; goto case END; case END: r = ZlibCompressionState.ZSTREAMEND; s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); case BADCODE: // x: got error r = ZlibCompressionState.ZDATAERROR; s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); default: r = ZlibCompressionState.ZSTREAMERROR; s.Bitb = b; s.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; s.Write = q; return(s.Inflate_flush(z, r)); } } }
internal ZlibCompressionState Proc(ZStream z, ZlibCompressionState r) { int t; // temporary storage int b; // bit buffer int k; // bits in bit buffer int p; // input data pointer int n; // bytes available there int q; // output window write pointer int m; // bytes to end of window or read pointer // copy input/output information to locals (UPDATE macro restores) { p = z.NextInIndex; n = z.AvailIn; b = this.Bitb; k = this.Bitk; } { q = this.Write; m = q < this.Read ? this.Read - q - 1 : this.End - q; } // process input based on current state while (true) { switch (this.mode) { case TYPE: while (k < 3) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } t = b & 7; this.last = t & 1; switch (SupportClass.URShift(t, 1)) { case 0: // stored { b = SupportClass.URShift(b, 3); k -= 3; } t = k & 7; // go to byte boundary { b = SupportClass.URShift(b, t); k -= t; } this.mode = LENS; // get length of stored block break; case 1: // fixed { var bl = new int[1]; var bd = new int[1]; var tl = new int[1][]; var td = new int[1][]; _ = InfTree.Inflate_trees_fixed(bl, bd, tl, td); this.codes = new InfCodes(bl[0], bd[0], tl[0], td[0]); } { b = SupportClass.URShift(b, 3); k -= 3; } this.mode = CODES; break; case 2: // dynamic { b = SupportClass.URShift(b, 3); k -= 3; } this.mode = TABLE; break; case 3: // illegal { b = SupportClass.URShift(b, 3); k -= 3; } this.mode = BAD; z.Msg = "invalid block type"; r = ZlibCompressionState.ZDATAERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } break; case LENS: while (k < 32) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } if ((SupportClass.URShift(~b, 16) & 0xffff) != (b & 0xffff)) { this.mode = BAD; z.Msg = "invalid stored block lengths"; r = ZlibCompressionState.ZDATAERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } this.left = b & 0xffff; b = k = 0; // dump bits this.mode = this.left != 0 ? STORED : (this.last != 0 ? DRY : TYPE); break; case STORED: if (n == 0) { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } if (m == 0) { if (q == this.End && this.Read != 0) { q = 0; m = q < this.Read ? this.Read - q - 1 : this.End - q; } if (m == 0) { this.Write = q; r = this.Inflate_flush(z, r); q = this.Write; m = q < this.Read ? this.Read - q - 1 : this.End - q; if (q == this.End && this.Read != 0) { q = 0; m = q < this.Read ? this.Read - q - 1 : this.End - q; } if (m == 0) { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } } } r = ZlibCompressionState.ZOK; t = this.left; if (t > n) { t = n; } if (t > m) { t = m; } Array.Copy(z.INextIn, p, this.Window, q, t); p += t; n -= t; q += t; m -= t; if ((this.left -= t) != 0) { break; } this.mode = this.last != 0 ? DRY : TYPE; break; case TABLE: while (k < 14) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } this.table = t = b & 0x3fff; if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { this.mode = BAD; z.Msg = "too many length or distance symbols"; r = ZlibCompressionState.ZDATAERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); this.blens = new int[t]; { b = SupportClass.URShift(b, 14); k -= 14; } this.index = 0; this.mode = BTREE; goto case BTREE; case BTREE: while (this.index < 4 + SupportClass.URShift(this.table, 10)) { while (k < 3) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } this.blens[Border[this.index++]] = b & 7; { b = SupportClass.URShift(b, 3); k -= 3; } } while (this.index < 19) { this.blens[Border[this.index++]] = 0; } this.bb[0] = 7; t = (int)InfTree.Inflate_trees_bits(this.blens, this.bb, this.tb, this.hufts, z); if (t != (int)ZlibCompressionState.ZOK) { r = (ZlibCompressionState)t; if (r == ZlibCompressionState.ZDATAERROR) { this.blens = null; this.mode = BAD; } this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } this.index = 0; this.mode = DTREE; goto case DTREE; case DTREE: while (true) { t = this.table; if (!(this.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) { break; } int i, j, c; t = this.bb[0]; while (k < t) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } if (this.tb[0] == -1) { // System.err.println("null..."); } t = this.hufts[((this.tb[0] + (b & InflateMask[t])) * 3) + 1]; c = this.hufts[((this.tb[0] + (b & InflateMask[t])) * 3) + 2]; if (c < 16) { b = SupportClass.URShift(b, t); k -= t; this.blens[this.index++] = c; } else { // c == 16..18 i = c == 18 ? 7 : c - 14; j = c == 18 ? 11 : 3; while (k < (t + i)) { if (n != 0) { r = ZlibCompressionState.ZOK; } else { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } n--; b |= (z.INextIn[p++] & 0xff) << k; k += 8; } b = SupportClass.URShift(b, t); k -= t; j += b & InflateMask[i]; b = SupportClass.URShift(b, i); k -= i; i = this.index; t = this.table; if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { this.blens = null; this.mode = BAD; z.Msg = "invalid bit length repeat"; r = ZlibCompressionState.ZDATAERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } c = c == 16 ? this.blens[i - 1] : 0; do { this.blens[i++] = c; }while (--j != 0); this.index = i; } } this.tb[0] = -1; { var bl = new int[1]; var bd = new int[1]; var tl = new int[1]; var td = new int[1]; bl[0] = 9; // must be <= 9 for lookahead assumptions bd[0] = 6; // must be <= 9 for lookahead assumptions t = this.table; t = (int)InfTree.Inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), this.blens, bl, bd, tl, td, this.hufts, z); if (t != (int)ZlibCompressionState.ZOK) { if (t == (int)ZlibCompressionState.ZDATAERROR) { this.blens = null; this.mode = BAD; } r = (ZlibCompressionState)t; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } this.codes = new InfCodes(bl[0], bd[0], this.hufts, tl[0], this.hufts, td[0]); } this.blens = null; this.mode = CODES; goto case CODES; case CODES: this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; if ((r = this.codes.Proc(this, z, r)) != ZlibCompressionState.ZSTREAMEND) { return(this.Inflate_flush(z, r)); } r = ZlibCompressionState.ZOK; InfCodes.Free(); p = z.NextInIndex; n = z.AvailIn; b = this.Bitb; k = this.Bitk; q = this.Write; m = q < this.Read ? this.Read - q - 1 : this.End - q; if (this.last == 0) { this.mode = TYPE; break; } this.mode = DRY; goto case DRY; case DRY: this.Write = q; r = this.Inflate_flush(z, r); q = this.Write; m = q < this.Read ? this.Read - q - 1 : this.End - q; if (this.Read != this.Write) { this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } this.mode = DONE; goto case DONE; case DONE: r = ZlibCompressionState.ZSTREAMEND; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); case BAD: r = ZlibCompressionState.ZDATAERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); default: r = ZlibCompressionState.ZSTREAMERROR; this.Bitb = b; this.Bitk = k; z.AvailIn = n; z.TotalIn += p - z.NextInIndex; z.NextInIndex = p; this.Write = q; return(this.Inflate_flush(z, r)); } } }
internal static ZlibCompressionState 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 var c = new int[BMAX + 1]; // bit length count table 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 var r = new int[3]; // table entry for structure assignment var u = new int[BMAX]; // table stack int w; // bits before this table == (l * h) var x = new int[BMAX + 1]; // bit offsets, then code stack 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(ZlibCompressionState.ZOK); } // 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(ZlibCompressionState.ZDATAERROR); } } if ((y -= c[i]) < 0) { return(ZlibCompressionState.ZDATAERROR); } 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(ZlibCompressionState.ZDATAERROR); // 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] = (byte)j; // bits in this table r[1] = (byte)l; // bits to dump before this table j = SupportClass.URShift(i, w - l); r[2] = 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 entry in r r[1] = (byte)(k - w); if (p >= n) { r[0] = 128 + 64; // out of values--invalid code } else if (v[p] < s) { r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block r[2] = v[p++]; // simple code is just the value } else { r[0] = (byte)(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 = SupportClass.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 = SupportClass.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 ? ZlibCompressionState.ZBUFERROR : ZlibCompressionState.ZOK); }