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

📄 bzlib.c

📁 嵌入式试验箱S3C2410的bootloader源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   return BZ_OK;}#endif /* BZ_NO_COMPRESS *//*---------------------------------------------------*//*--- 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++;	    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 defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)	WATCHDOG_RESET();#endif      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; };

⌨️ 快捷键说明

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