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

📄 bzlib.c

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 C
📖 第 1 页 / 共 3 页
字号:
   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++;            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; };

⌨️ 快捷键说明

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