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;
}