/// <summary> /// copy as much as possible from the sliding Window to the output area /// </summary> internal int inflate_flush(ZStream z, int r) { int n; int p; int q; // local copies of source and destination pointers p = z.next_out_index; q = ReadPos; // compute number of bytes to copy as far as End of Window n = (int)((q <= WritePos?WritePos:End) - q); if (n > z.avail_out) { n = z.avail_out; } if (n != 0 && r == (int)ZLibResultCode.Z_BUF_ERROR) { r = (int)ZLibResultCode.Z_OK; } // update counters z.avail_out -= n; z.total_out += n; // update check information if (this.needCheck) { z.adler = check = Adler32.GetAdler32Checksum(check, Window, q, n); } // copy as far as End of Window Array.Copy(Window, q, z.next_out, p, n); p += n; q += n; // see if more to copy at beginning of Window if (q == End) { // wrap pointers q = 0; if (WritePos == End) { WritePos = 0; } // compute bytes to copy n = WritePos - q; if (n > z.avail_out) { n = z.avail_out; } if (n != 0 && r == (int)ZLibResultCode.Z_BUF_ERROR) { r = (int)ZLibResultCode.Z_OK; } // update counters z.avail_out -= n; z.total_out += n; // update check information if (this.needCheck) { z.adler = check = Adler32.GetAdler32Checksum(check, Window, q, n); } // copy Array.Copy(Window, q, z.next_out, p, n); p += n; q += n; } // update pointers z.next_out_index = p; ReadPos = q; // done return(r); }