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

📄 bzlib.c

📁 minibzip2
💻 C
📖 第 1 页 / 共 4 页
字号:
            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); 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); 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); s->nblock_used++;         if (s->nblock_used == s->save_nblock+1) continue;         if (k1 != s->k0) { s->k0 = k1; continue; };            BZ_GET_SMALL(k1); s->nblock_used++;         s->state_out_len = ((Int32)k1) + 4;         BZ_GET_SMALL(s->k0); s->nblock_used++;      }   }}/*---------------------------------------------------*/int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ){   DState* 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;   while (True) {      if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;      if (s->state == BZ_X_OUTPUT) {         if (s->smallDecompress)            unRLE_obuf_to_output_SMALL ( s ); else            unRLE_obuf_to_output_FAST  ( s );         if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {            BZ_FINALISE_CRC ( s->calculatedBlockCRC );            if (s->verbosity >= 3)                VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC,                           s->calculatedBlockCRC );            if (s->verbosity >= 2) VPrintf0 ( "]" );            if (s->calculatedBlockCRC != s->storedBlockCRC)               return BZ_DATA_ERROR;            s->calculatedCombinedCRC                = (s->calculatedCombinedCRC << 1) |                     (s->calculatedCombinedCRC >> 31);            s->calculatedCombinedCRC ^= s->calculatedBlockCRC;            s->state = BZ_X_BLKHDR_1;         } else {            return BZ_OK;         }      }      if (s->state >= BZ_X_MAGIC_1) {         Int32 r = BZ2_decompress ( s );         if (r == BZ_STREAM_END) {            if (s->verbosity >= 3)               VPrintf2 ( "\n    combined CRCs: stored = 0x%x, computed = 0x%x",                           s->storedCombinedCRC, s->calculatedCombinedCRC );            if (s->calculatedCombinedCRC != s->storedCombinedCRC)               return BZ_DATA_ERROR;            return r;         }         if (s->state != BZ_X_OUTPUT) return r;      }   }   AssertH ( 0, 6001 );   return 0;  /*NOTREACHED*/}/*---------------------------------------------------*/int BZ_API(BZ2_bzDecompressEnd)  ( bz_stream *strm ){   DState* 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->tt   != NULL) BZFREE(s->tt);   if (s->ll16 != NULL) BZFREE(s->ll16);   if (s->ll4  != NULL) BZFREE(s->ll4);   BZFREE(strm->state);   strm->state = NULL;   return BZ_OK;}#ifndef BZ_NO_STDIO/*---------------------------------------------------*//*--- File I/O stuff                              ---*//*---------------------------------------------------*/#define BZ_SETERR(eee)                    \{                                         \   if (bzerror != NULL) *bzerror = eee;   \   if (bzf != NULL) bzf->lastErr = eee;   \}typedef    struct {      FILE*     handle;      Char      buf[BZ_MAX_UNUSED];      Int32     bufN;      Bool      writing;      bz_stream strm;      Int32     lastErr;      Bool      initialisedOk;   }   bzFile;/*---------------------------------------------*/static Bool myfeof ( FILE* f ){   Int32 c = fgetc ( f );   if (c == EOF) return True;   ungetc ( c, f );   return False;}/*---------------------------------------------------*/BZFILE* BZ_API(BZ2_bzWriteOpen)                     ( int*  bzerror,                            FILE* f,                       int   blockSize100k,                       int   verbosity,                      int   workFactor ){   Int32   ret;   bzFile* bzf = NULL;   BZ_SETERR(BZ_OK);   if (f == NULL ||       (blockSize100k < 1 || blockSize100k > 9) ||       (workFactor < 0 || workFactor > 250) ||       (verbosity < 0 || verbosity > 4))      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };   if (ferror(f))      { BZ_SETERR(BZ_IO_ERROR); return NULL; };   bzf = malloc ( sizeof(bzFile) );   if (bzf == NULL)      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };   BZ_SETERR(BZ_OK);   bzf->initialisedOk = False;   bzf->bufN          = 0;   bzf->handle        = f;   bzf->writing       = True;   bzf->strm.bzalloc  = NULL;   bzf->strm.bzfree   = NULL;   bzf->strm.opaque   = NULL;   if (workFactor == 0) workFactor = 30;   ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k,                               verbosity, workFactor );   if (ret != BZ_OK)      { BZ_SETERR(ret); free(bzf); return NULL; };   bzf->strm.avail_in = 0;   bzf->initialisedOk = True;   return bzf;   }/*---------------------------------------------------*/void BZ_API(BZ2_bzWrite)             ( int*    bzerror,                BZFILE* b,                void*   buf,                int     len ){   Int32 n, n2, ret;   bzFile* bzf = (bzFile*)b;   BZ_SETERR(BZ_OK);   if (bzf == NULL || buf == NULL || len < 0)      { BZ_SETERR(BZ_PARAM_ERROR); return; };   if (!(bzf->writing))      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };   if (ferror(bzf->handle))      { BZ_SETERR(BZ_IO_ERROR); return; };   if (len == 0)      { BZ_SETERR(BZ_OK); return; };   bzf->strm.avail_in = len;   bzf->strm.next_in  = buf;   while (True) {      bzf->strm.avail_out = BZ_MAX_UNUSED;      bzf->strm.next_out = bzf->buf;      ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );      if (ret != BZ_RUN_OK)         { BZ_SETERR(ret); return; };      if (bzf->strm.avail_out < BZ_MAX_UNUSED) {         n = BZ_MAX_UNUSED - bzf->strm.avail_out;         n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),                        n, bzf->handle );         if (n != n2 || ferror(bzf->handle))            { BZ_SETERR(BZ_IO_ERROR); return; };      }      if (bzf->strm.avail_in == 0)         { BZ_SETERR(BZ_OK); return; };   }}/*---------------------------------------------------*/void BZ_API(BZ2_bzWriteClose)                  ( int*          bzerror,                     BZFILE*       b,                     int           abandon,                    unsigned int* nbytes_in,                    unsigned int* nbytes_out ){   BZ2_bzWriteClose64 ( bzerror, b, abandon,                         nbytes_in, NULL, nbytes_out, NULL );}void BZ_API(BZ2_bzWriteClose64)                  ( int*          bzerror,                     BZFILE*       b,                     int           abandon,                    unsigned int* nbytes_in_lo32,                    unsigned int* nbytes_in_hi32,                    unsigned int* nbytes_out_lo32,                    unsigned int* nbytes_out_hi32 ){   Int32   n, n2, ret;   bzFile* bzf = (bzFile*)b;   if (bzf == NULL)      { BZ_SETERR(BZ_OK); return; };   if (!(bzf->writing))      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };   if (ferror(bzf->handle))      { BZ_SETERR(BZ_IO_ERROR); return; };   if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;   if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;   if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;   if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;   if ((!abandon) && bzf->lastErr == BZ_OK) {      while (True) {         bzf->strm.avail_out = BZ_MAX_UNUSED;         bzf->strm.next_out = bzf->buf;         ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );         if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)            { BZ_SETERR(ret); return; };         if (bzf->strm.avail_out < BZ_MAX_UNUSED) {            n = BZ_MAX_UNUSED - bzf->strm.avail_out;            n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),                           n, bzf->handle );            if (n != n2 || ferror(bzf->handle))               { BZ_SETERR(BZ_IO_ERROR); return; };         }         if (ret == BZ_STREAM_END) break;      }   }   if ( !abandon && !ferror ( bzf->handle ) ) {      fflush ( bzf->handle );      if (ferror(bzf->handle))         { BZ_SETERR(BZ_IO_ERROR); return; };   }   if (nbytes_in_lo32 != NULL)      *nbytes_in_lo32 = bzf->strm.total_in_lo32;   if (nbytes_in_hi32 != NULL)      *nbytes_in_hi32 = bzf->strm.total_in_hi32;   if (nbytes_out_lo32 != NULL)      *nbytes_out_lo32 = bzf->strm.total_out_lo32;   if (nbytes_out_hi32 != NULL)      *nbytes_out_hi32 = bzf->strm.total_out_hi32;   BZ_SETERR(BZ_OK);   BZ2_bzCompressEnd ( &(bzf->strm) );   free ( bzf );}/*---------------------------------------------------*/BZFILE* BZ_API(BZ2_bzReadOpen)                    ( int*  bzerror,                      FILE* f,                      int   verbosity,                     int   small,                     void* unused,                     int   nUnused ){   bzFile* bzf = NULL;   int     ret;   BZ_SETERR(BZ_OK);   if (f == NULL ||        (small != 0 && small != 1) ||       (verbosity < 0 || verbosity > 4) ||       (unused == NULL && nUnused != 0) ||       (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };   if (ferror(f))      { BZ_SETERR(BZ_IO_ERROR); return NULL; };   bzf = malloc ( sizeof(bzFile) );   if (bzf == NULL)       { BZ_SETERR(BZ_MEM_ERROR); return NULL; };   BZ_SETERR(BZ_OK);   bzf->initialisedOk = False;   bzf->handle        = f;   bzf->bufN          = 0;   bzf->writing       = False;   bzf->strm.bzalloc  = NULL;   bzf->strm.bzfree   = NULL;   bzf->strm.opaque   = NULL;      while (nUnused > 0) {      bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;      unused = ((void*)( 1 + ((UChar*)(unused))  ));      nUnused--;   }   ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );   if (ret != BZ_OK)      { BZ_SETERR(ret); free(bzf); return NULL; };   bzf->strm.avail_in = bzf->bufN;   bzf->strm.next_in  = bzf->buf;   bzf->initialisedOk = True;   return bzf;   }/*---------------------------------------------------*/void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ){   bzFile* bzf = (bzFile*)b;   BZ_SETERR(BZ_OK);   if (bzf == NULL)      { BZ_SETERR(BZ_OK); return; };   if (bzf->writing)      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };   if (bzf->initialisedOk)      (void)BZ2_bzDecompressEnd ( &(bzf->strm) );   free ( bzf );}/*---------------------------------------------------*/int BZ_API(BZ2_bzRead)            ( int*    bzerror,              BZFILE* b,              void*   buf,              int     len ){   Int32   n, ret;   bzFile* bzf = (bzFile*)b;   BZ_SETERR(BZ_OK);   if (bzf == NULL || buf == NULL || len < 0)      { BZ_SETERR(BZ_PARAM_ERROR); return 0; };   if (bzf->writing)      { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };

⌨️ 快捷键说明

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