⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bzlib.c

📁 minibzip2
💻 C
📖 第 1 页 / 共 4 页
字号:
   return progress_out;}/*---------------------------------------------------*/staticBool 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;}/*---------------------------------------------------*/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 (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--*/}/*---------------------------------------------------*/int BZ_API(BZ2_bzCompressEnd)  ( bz_stream *strm ){   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;   if (s->arr1 != NULL) BZFREE(s->arr1);   if (s->arr2 != NULL) BZFREE(s->arr2);   if (s->ftab != NULL) BZFREE(s->ftab);   BZFREE(strm->state);   strm->state = NULL;      return BZ_OK;}/*---------------------------------------------------*//*--- Decompression stuff                         ---*//*---------------------------------------------------*//*---------------------------------------------------*/int BZ_API(BZ2_bzDecompressInit)                      ( bz_stream* strm,                        int        verbosity,                       int        small ){   DState* s;   if (!bz_config_ok()) return BZ_CONFIG_ERROR;   if (strm == NULL) return BZ_PARAM_ERROR;   if (small != 0 && small != 1) return BZ_PARAM_ERROR;   if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;   s = BZALLOC( sizeof(DState) );   if (s == NULL) return BZ_MEM_ERROR;   s->strm                  = strm;   strm->state              = s;   s->state                 = BZ_X_MAGIC_1;   s->bsLive                = 0;   s->bsBuff                = 0;   s->calculatedCombinedCRC = 0;   strm->total_in_lo32      = 0;   strm->total_in_hi32      = 0;   strm->total_out_lo32     = 0;   strm->total_out_hi32     = 0;   s->smallDecompress       = (Bool)small;   s->ll4                   = NULL;   s->ll16                  = NULL;   s->tt                    = NULL;   s->currBlockNo           = 0;   s->verbosity             = verbosity;   return BZ_OK;}/*---------------------------------------------------*/staticvoid unRLE_obuf_to_output_FAST ( DState* s ){   UChar k1;   if (s->blockRandomised) {      while (True) {         /* try to finish existing run */         while (True) {            if (s->strm->avail_out == 0) return;            if (s->state_out_len == 0) break;            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );            s->state_out_len--;            s->strm->next_out++;            s->strm->avail_out--;            s->strm->total_out_lo32++;            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;         }            /* can a new run be started? */         if (s->nblock_used == s->save_nblock+1) return;                           s->state_out_len = 1;         s->state_out_ch = s->k0;         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            s->state_out_len = 2;         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            s->state_out_len = 3;         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         s->state_out_len = ((Int32)k1) + 4;         BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK;          s->k0 ^= BZ_RAND_MASK; s->nblock_used++;      }   } else {      /* restore */      UInt32        c_calculatedBlockCRC = s->calculatedBlockCRC;      UChar         c_state_out_ch       = s->state_out_ch;      Int32         c_state_out_len      = s->state_out_len;      Int32         c_nblock_used        = s->nblock_used;      Int32         c_k0                 = s->k0;      UInt32*       c_tt                 = s->tt;      UInt32        c_tPos               = s->tPos;      char*         cs_next_out          = s->strm->next_out;      unsigned int  cs_avail_out         = s->strm->avail_out;      /* end restore */      UInt32       avail_out_INIT = cs_avail_out;      Int32        s_save_nblockPP = s->save_nblock+1;      unsigned int total_out_lo32_old;      while (True) {         /* try to finish existing run */         if (c_state_out_len > 0) {            while (True) {               if (cs_avail_out == 0) goto return_notr;               if (c_state_out_len == 1) break;               *( (UChar*)(cs_next_out) ) = c_state_out_ch;               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );               c_state_out_len--;               cs_next_out++;               cs_avail_out--;            }            s_state_out_len_eq_one:            {               if (cs_avail_out == 0) {                   c_state_out_len = 1; goto return_notr;               };               *( (UChar*)(cs_next_out) ) = c_state_out_ch;               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );               cs_next_out++;               cs_avail_out--;            }         }            /* can a new run be started? */         if (c_nblock_used == s_save_nblockPP) {            c_state_out_len = 0; goto return_notr;         };            c_state_out_ch = c_k0;         BZ_GET_FAST_C(k1); c_nblock_used++;         if (k1 != c_k0) {             c_k0 = k1; goto s_state_out_len_eq_one;          };         if (c_nblock_used == s_save_nblockPP)             goto s_state_out_len_eq_one;            c_state_out_len = 2;         BZ_GET_FAST_C(k1); c_nblock_used++;         if (c_nblock_used == s_save_nblockPP) continue;         if (k1 != c_k0) { c_k0 = k1; continue; };            c_state_out_len = 3;         BZ_GET_FAST_C(k1); c_nblock_used++;         if (c_nblock_used == s_save_nblockPP) continue;         if (k1 != c_k0) { c_k0 = k1; continue; };            BZ_GET_FAST_C(k1); c_nblock_used++;         c_state_out_len = ((Int32)k1) + 4;         BZ_GET_FAST_C(c_k0); c_nblock_used++;      }      return_notr:      total_out_lo32_old = s->strm->total_out_lo32;      s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);      if (s->strm->total_out_lo32 < total_out_lo32_old)         s->strm->total_out_hi32++;      /* save */      s->calculatedBlockCRC = c_calculatedBlockCRC;      s->state_out_ch       = c_state_out_ch;      s->state_out_len      = c_state_out_len;      s->nblock_used        = c_nblock_used;      s->k0                 = c_k0;      s->tt                 = c_tt;      s->tPos               = c_tPos;      s->strm->next_out     = cs_next_out;      s->strm->avail_out    = cs_avail_out;      /* end save */   }}/*---------------------------------------------------*/__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ){   Int32 nb, na, mid;   nb = 0;   na = 256;   do {      mid = (nb + na) >> 1;      if (indx >= cftab[mid]) nb = mid; else na = mid;   }   while (na - nb != 1);   return nb;}/*---------------------------------------------------*/staticvoid unRLE_obuf_to_output_SMALL ( DState* s ){   UChar k1;   if (s->blockRandomised) {      while (True) {         /* try to finish existing run */         while (True) {            if (s->strm->avail_out == 0) return;            if (s->state_out_len == 0) break;            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );            s->state_out_len--;            s->strm->next_out++;            s->strm->avail_out--;            s->strm->total_out_lo32++;            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;         }            /* can a new run be started? */         if (s->nblock_used == s->save_nblock+1) return;                           s->state_out_len = 1;         s->state_out_ch = s->k0;         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            s->state_out_len = 2;         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            s->state_out_len = 3;         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;          k1 ^= BZ_RAND_MASK; s->nblock_used++;         s->state_out_len = ((Int32)k1) + 4;         BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK;          s->k0 ^= BZ_RAND_MASK; s->nblock_used++;      }   } else {      while (True) {         /* try to finish existing run */         while (True) {            if (s->strm->avail_out == 0) return;            if (s->state_out_len == 0) break;            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );            s->state_out_len--;            s->strm->next_out++;            s->strm->avail_out--;            s->strm->total_out_lo32++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -