System.util.zlib.Deflate.deflate_stored C# (CSharp) Method

deflate_stored() private method

private deflate_stored ( int flush ) : int
flush int
return int
        internal int deflate_stored(int flush){
            // Stored blocks are limited to 0xffff bytes, pending_buf is limited
            // to pending_buf_size, and each stored block has a 5 byte header:

            int max_block_size = 0xffff;
            int max_start;

            if(max_block_size > pending_buf_size - 5) {
                max_block_size = pending_buf_size - 5;
            }

            // Copy as much as possible from input to output:
            while(true){
                // Fill the window as much as possible:
                if(lookahead<=1){
                    fill_window();
                    if(lookahead==0 && flush==Z_NO_FLUSH) return NeedMore;
                    if(lookahead==0) break; // flush the current block
                }

                strstart+=lookahead;
                lookahead=0;

                // Emit a stored block if pending_buf will be full:
                max_start=block_start+max_block_size;
                if(strstart==0|| strstart>=max_start) {
                    // strstart == 0 is possible when wraparound on 16-bit machine
                    lookahead = (int)(strstart-max_start);
                    strstart = (int)max_start;
      
                    flush_block_only(false);
                    if(strm.avail_out==0) return NeedMore;

                }

                // Flush if we may have to slide, otherwise block_start may become
                // negative and the data will be gone:
                if(strstart-block_start >= w_size-MIN_LOOKAHEAD) {
                    flush_block_only(false);
                    if(strm.avail_out==0) return NeedMore;
                }
            }

            flush_block_only(flush == Z_FINISH);
            if(strm.avail_out==0)
                return (flush == Z_FINISH) ? FinishStarted : NeedMore;

            return flush == Z_FINISH ? FinishDone : BlockDone;
        }