/*---------------------------------------------------*/ int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) { Bool progress; EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; preswitch: switch (s->mode) { case BZ_M_IDLE: return BZ_SEQUENCE_ERROR; case BZ_M_RUNNING: if (action == BZ_RUN) { progress = handle_compress ( strm ); return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; } else if (action == BZ_FLUSH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FLUSHING; goto preswitch; } else if (action == BZ_FINISH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FINISHING; goto preswitch; } else return BZ_PARAM_ERROR; case BZ_M_FLUSHING: if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (!progress) return BZ_SEQUENCE_ERROR; //rsc added if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FLUSH_OK; s->mode = BZ_M_RUNNING; return BZ_RUN_OK; case BZ_M_FINISHING: if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (!progress) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FINISH_OK; s->mode = BZ_M_IDLE; return BZ_STREAM_END; } return BZ_OK; /*--not reached--*/ }
/*---------------------------------------------------*/ static int BZ2_bzCompress(bz_stream *strm, int action) { /*Bool progress;*/ EState* s; s = strm->state; switch (s->mode) { case BZ_M_RUNNING: if (action == BZ_RUN) { /*progress =*/ handle_compress(strm); /*return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;*/ return BZ_RUN_OK; } #ifdef FLUSH_IS_UNUSED else if (action == BZ_FLUSH) { //#s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FLUSHING; goto case_BZ_M_FLUSHING; } #endif else /*if (action == BZ_FINISH)*/ { //#s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FINISHING; goto case_BZ_M_FINISHING; } #ifdef FLUSH_IS_UNUSED case_BZ_M_FLUSHING: case BZ_M_FLUSHING: /*if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR;*/ /*progress =*/ handle_compress(strm); if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FLUSH_OK; s->mode = BZ_M_RUNNING; return BZ_RUN_OK; #endif case_BZ_M_FINISHING: /*case BZ_M_FINISHING:*/ default: /*if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR;*/ /*progress =*/ handle_compress(strm); /*if (!progress) return BZ_SEQUENCE_ERROR;*/ //#if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) //# return BZ_FINISH_OK; if (s->strm->avail_in > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FINISH_OK; /*s->mode = BZ_M_IDLE;*/ return BZ_STREAM_END; } /* return BZ_OK; --not reached--*/ }
/*---------------------------------------------------*/ static void /*Bool*/ handle_compress(bz_stream *strm) { /*Bool progress_in = False;*/ /*Bool progress_out = False;*/ EState* s = strm->state; while (1) { if (s->state == BZ_S_OUTPUT) { /*progress_out |=*/ copy_output_until_stop(s); if (s->state_out_pos < s->numZ) break; if (s->mode == BZ_M_FINISHING //# && s->avail_in_expect == 0 && s->strm->avail_in == 0 && isempty_RL(s)) break; prepare_new_block(s); s->state = BZ_S_INPUT; #ifdef FLUSH_IS_UNUSED if (s->mode == BZ_M_FLUSHING && s->avail_in_expect == 0 && isempty_RL(s)) break; #endif } if (s->state == BZ_S_INPUT) { /*progress_in |=*/ copy_input_until_stop(s); //#if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { if (s->mode != BZ_M_RUNNING && s->strm->avail_in == 0) { flush_RL(s); BZ2_compressBlock(s, (s->mode == BZ_M_FINISHING)); s->state = BZ_S_OUTPUT; } else if (s->nblock >= s->nblockMAX) { BZ2_compressBlock(s, 0); s->state = BZ_S_OUTPUT; } else if (s->strm->avail_in == 0) { break; } } } /*return progress_in || progress_out;*/ }
/*---------------------------------------------------*/ static Bool handle_compress ( bz_stream* strm ) { Bool progress_in = False; Bool progress_out = False; EState* s = strm->state; while (True) { if (s->state == BZ_S_OUTPUT) { progress_out |= copy_output_until_stop ( s ); if (s->state_out_pos < s->numZ) break; if (s->mode == BZ_M_FINISHING && s->avail_in_expect == 0 && isempty_RL(s)) break; prepare_new_block ( s ); s->state = BZ_S_INPUT; if (s->mode == BZ_M_FLUSHING && s->avail_in_expect == 0 && isempty_RL(s)) break; } if (s->state == BZ_S_INPUT) { progress_in |= copy_input_until_stop ( s ); if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { flush_RL ( s ); BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); s->state = BZ_S_OUTPUT; } else if (s->nblock >= s->nblockMAX) { BZ2_compressBlock ( s, False ); s->state = BZ_S_OUTPUT; } else if (s->strm->avail_in == 0) { break; } } } return progress_in || progress_out; }