LCOV - code coverage report
Current view: top level - ballet/bzip2 - decompress.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 500 0.0 %
Date: 2026-06-30 05:50:37 Functions: 0 2 0.0 %

          Line data    Source code
       1             : 
       2             : /*-------------------------------------------------------------*/
       3             : /*--- Decompression machinery                               ---*/
       4             : /*---                                          decompress.c ---*/
       5             : /*-------------------------------------------------------------*/
       6             : 
       7             : /* ------------------------------------------------------------------
       8             :    This file is part of bzip2/libbzip2, a program and library for
       9             :    lossless, block-sorting data compression.
      10             : 
      11             :    bzip2/libbzip2 version 1.0.8 of 13 July 2019
      12             :    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
      13             : 
      14             :    Please read the WARNING, DISCLAIMER and PATENTS sections in the 
      15             :    README file.
      16             : 
      17             :    This program is released under the terms of the license contained
      18             :    in the file LICENSE.
      19             :    ------------------------------------------------------------------ */
      20             : 
      21             : 
      22             : #include "bzlib_private.h"
      23             : 
      24             : 
      25             : /*---------------------------------------------------*/
      26             : static
      27             : void makeMaps_d ( DState* s )
      28           0 : {
      29           0 :    Int32 i;
      30           0 :    s->nInUse = 0;
      31           0 :    for (i = 0; i < 256; i++)
      32           0 :       if (s->inUse[i]) {
      33           0 :          s->seqToUnseq[s->nInUse] = i;
      34           0 :          s->nInUse++;
      35           0 :       }
      36           0 : }
      37             : 
      38             : 
      39             : /*---------------------------------------------------*/
      40             : #define RETURN(rrr)                               \
      41           0 :    { retVal = rrr; goto save_state_and_return; };
      42             : 
      43             : #define GET_BITS(lll,vvv,nnn)                     \
      44           0 :    case lll: s->state = lll;                      \
      45           0 :    while (True) {                                 \
      46           0 :       if (s->bsLive >= nnn) {                     \
      47           0 :          UInt32 v;                                \
      48           0 :          v = (s->bsBuff >>                        \
      49           0 :              (s->bsLive-nnn)) & ((1 << nnn)-1);   \
      50           0 :          s->bsLive -= nnn;                        \
      51           0 :          vvv = v;                                 \
      52           0 :          break;                                   \
      53           0 :       }                                           \
      54           0 :       if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
      55           0 :       s->bsBuff                                   \
      56           0 :          = (s->bsBuff << 8) |                     \
      57           0 :            ((UInt32)                              \
      58           0 :               (*((UChar*)(s->strm->next_in))));   \
      59           0 :       s->bsLive += 8;                             \
      60           0 :       s->strm->next_in++;                         \
      61           0 :       s->strm->avail_in--;                        \
      62           0 :       s->strm->total_in_lo32++;                   \
      63           0 :       if (s->strm->total_in_lo32 == 0)            \
      64           0 :          s->strm->total_in_hi32++;                \
      65           0 :    }
      66             : 
      67             : #define GET_UCHAR(lll,uuu)                        \
      68           0 :    GET_BITS(lll,uuu,8)
      69             : 
      70             : #define GET_BIT(lll,uuu)                          \
      71           0 :    GET_BITS(lll,uuu,1)
      72             : 
      73             : /*---------------------------------------------------*/
      74           0 : #define GET_MTF_VAL(label1,label2,lval)           \
      75           0 : {                                                 \
      76           0 :    if (groupPos == 0) {                           \
      77           0 :       groupNo++;                                  \
      78           0 :       if (groupNo >= nSelectors)                  \
      79           0 :          RETURN(BZ_DATA_ERROR);                   \
      80           0 :       groupPos = BZ_G_SIZE;                       \
      81           0 :       gSel = s->selector[groupNo];                \
      82           0 :       gMinlen = s->minLens[gSel];                 \
      83           0 :       gLimit = &(s->limit[gSel][0]);              \
      84           0 :       gPerm = &(s->perm[gSel][0]);                \
      85           0 :       gBase = &(s->base[gSel][0]);                \
      86           0 :    }                                              \
      87           0 :    groupPos--;                                    \
      88           0 :    zn = gMinlen;                                  \
      89           0 :    GET_BITS(label1, zvec, zn);                    \
      90           0 :    while (1) {                                    \
      91           0 :       if (zn > 20 /* the longest code */)         \
      92           0 :          RETURN(BZ_DATA_ERROR);                   \
      93           0 :       if (zvec <= gLimit[zn]) break;              \
      94           0 :       zn++;                                       \
      95           0 :       GET_BIT(label2, zj);                        \
      96           0 :       zvec = (zvec << 1) | zj;                    \
      97           0 :    };                                             \
      98           0 :    if (zvec - gBase[zn] < 0                       \
      99           0 :        || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
     100           0 :       RETURN(BZ_DATA_ERROR);                      \
     101           0 :    lval = gPerm[zvec - gBase[zn]];                \
     102           0 : }
     103             : 
     104             : 
     105             : /*---------------------------------------------------*/
     106             : Int32 BZ2_decompress ( DState* s )
     107           0 : {
     108           0 :    UChar      uc;
     109           0 :    Int32      retVal;
     110           0 :    Int32      minLen, maxLen;
     111           0 :    bz_stream* strm = s->strm;
     112             : 
     113             :    /* stuff that needs to be saved/restored */
     114           0 :    Int32  i;
     115           0 :    Int32  j;
     116           0 :    Int32  t;
     117           0 :    Int32  alphaSize;
     118           0 :    Int32  nGroups;
     119           0 :    Int32  nSelectors;
     120           0 :    Int32  EOB;
     121           0 :    Int32  groupNo;
     122           0 :    Int32  groupPos;
     123           0 :    Int32  nextSym;
     124           0 :    Int32  nblockMAX;
     125           0 :    Int32  nblock;
     126           0 :    Int32  es;
     127           0 :    Int32  N;
     128           0 :    Int32  curr;
     129           0 :    Int32  zt;
     130           0 :    Int32  zn; 
     131           0 :    Int32  zvec;
     132           0 :    Int32  zj;
     133           0 :    Int32  gSel;
     134           0 :    Int32  gMinlen;
     135           0 :    Int32* gLimit;
     136           0 :    Int32* gBase;
     137           0 :    Int32* gPerm;
     138             : 
     139           0 :    if (s->state == BZ_X_MAGIC_1) {
     140             :       /*initialise the save area*/
     141           0 :       s->save_i           = 0;
     142           0 :       s->save_j           = 0;
     143           0 :       s->save_t           = 0;
     144           0 :       s->save_alphaSize   = 0;
     145           0 :       s->save_nGroups     = 0;
     146           0 :       s->save_nSelectors  = 0;
     147           0 :       s->save_EOB         = 0;
     148           0 :       s->save_groupNo     = 0;
     149           0 :       s->save_groupPos    = 0;
     150           0 :       s->save_nextSym     = 0;
     151           0 :       s->save_nblockMAX   = 0;
     152           0 :       s->save_nblock      = 0;
     153           0 :       s->save_es          = 0;
     154           0 :       s->save_N           = 0;
     155           0 :       s->save_curr        = 0;
     156           0 :       s->save_zt          = 0;
     157           0 :       s->save_zn          = 0;
     158           0 :       s->save_zvec        = 0;
     159           0 :       s->save_zj          = 0;
     160           0 :       s->save_gSel        = 0;
     161           0 :       s->save_gMinlen     = 0;
     162           0 :       s->save_gLimit      = NULL;
     163           0 :       s->save_gBase       = NULL;
     164           0 :       s->save_gPerm       = NULL;
     165           0 :    }
     166             : 
     167             :    /*restore from the save area*/
     168           0 :    i           = s->save_i;
     169           0 :    j           = s->save_j;
     170           0 :    t           = s->save_t;
     171           0 :    alphaSize   = s->save_alphaSize;
     172           0 :    nGroups     = s->save_nGroups;
     173           0 :    nSelectors  = s->save_nSelectors;
     174           0 :    EOB         = s->save_EOB;
     175           0 :    groupNo     = s->save_groupNo;
     176           0 :    groupPos    = s->save_groupPos;
     177           0 :    nextSym     = s->save_nextSym;
     178           0 :    nblockMAX   = s->save_nblockMAX;
     179           0 :    nblock      = s->save_nblock;
     180           0 :    es          = s->save_es;
     181           0 :    N           = s->save_N;
     182           0 :    curr        = s->save_curr;
     183           0 :    zt          = s->save_zt;
     184           0 :    zn          = s->save_zn; 
     185           0 :    zvec        = s->save_zvec;
     186           0 :    zj          = s->save_zj;
     187           0 :    gSel        = s->save_gSel;
     188           0 :    gMinlen     = s->save_gMinlen;
     189           0 :    gLimit      = s->save_gLimit;
     190           0 :    gBase       = s->save_gBase;
     191           0 :    gPerm       = s->save_gPerm;
     192             : 
     193           0 :    retVal = BZ_OK;
     194             : 
     195           0 :    switch (s->state) {
     196             : 
     197           0 :       GET_UCHAR(BZ_X_MAGIC_1, uc);
     198           0 :       if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
     199             : 
     200           0 :       GET_UCHAR(BZ_X_MAGIC_2, uc);
     201           0 :       if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
     202             : 
     203           0 :       GET_UCHAR(BZ_X_MAGIC_3, uc)
     204           0 :       if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
     205             : 
     206           0 :       GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
     207           0 :       if (s->blockSize100k < (BZ_HDR_0 + 1) || 
     208           0 :           s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
     209           0 :       s->blockSize100k -= BZ_HDR_0;
     210             : 
     211           0 :       if (s->smallDecompress) {
     212           0 :          s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
     213           0 :          s->ll4  = BZALLOC( 
     214           0 :                       ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
     215           0 :                    );
     216           0 :          if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
     217           0 :       } else {
     218           0 :          s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
     219           0 :          if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
     220           0 :       }
     221             : 
     222           0 :       GET_UCHAR(BZ_X_BLKHDR_1, uc);
     223             : 
     224           0 :       if (uc == 0x17) goto endhdr_2;
     225           0 :       if (uc != 0x31) RETURN(BZ_DATA_ERROR);
     226           0 :       GET_UCHAR(BZ_X_BLKHDR_2, uc);
     227           0 :       if (uc != 0x41) RETURN(BZ_DATA_ERROR);
     228           0 :       GET_UCHAR(BZ_X_BLKHDR_3, uc);
     229           0 :       if (uc != 0x59) RETURN(BZ_DATA_ERROR);
     230           0 :       GET_UCHAR(BZ_X_BLKHDR_4, uc);
     231           0 :       if (uc != 0x26) RETURN(BZ_DATA_ERROR);
     232           0 :       GET_UCHAR(BZ_X_BLKHDR_5, uc);
     233           0 :       if (uc != 0x53) RETURN(BZ_DATA_ERROR);
     234           0 :       GET_UCHAR(BZ_X_BLKHDR_6, uc);
     235           0 :       if (uc != 0x59) RETURN(BZ_DATA_ERROR);
     236             : 
     237           0 :       s->currBlockNo++;
     238           0 :       if (s->verbosity >= 2)
     239           0 :          VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
     240             :  
     241           0 :       s->storedBlockCRC = 0;
     242           0 :       GET_UCHAR(BZ_X_BCRC_1, uc);
     243           0 :       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
     244           0 :       GET_UCHAR(BZ_X_BCRC_2, uc);
     245           0 :       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
     246           0 :       GET_UCHAR(BZ_X_BCRC_3, uc);
     247           0 :       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
     248           0 :       GET_UCHAR(BZ_X_BCRC_4, uc);
     249           0 :       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
     250             : 
     251           0 :       GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
     252             : 
     253           0 :       s->origPtr = 0;
     254           0 :       GET_UCHAR(BZ_X_ORIGPTR_1, uc);
     255           0 :       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
     256           0 :       GET_UCHAR(BZ_X_ORIGPTR_2, uc);
     257           0 :       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
     258           0 :       GET_UCHAR(BZ_X_ORIGPTR_3, uc);
     259           0 :       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
     260             : 
     261           0 :       if (s->origPtr < 0)
     262           0 :          RETURN(BZ_DATA_ERROR);
     263           0 :       if (s->origPtr > 10 + 100000*s->blockSize100k) 
     264           0 :          RETURN(BZ_DATA_ERROR);
     265             : 
     266             :       /*--- Receive the mapping table ---*/
     267           0 :       for (i = 0; i < 16; i++) {
     268           0 :          GET_BIT(BZ_X_MAPPING_1, uc);
     269           0 :          if (uc == 1) 
     270           0 :             s->inUse16[i] = True; else 
     271           0 :             s->inUse16[i] = False;
     272           0 :       }
     273             : 
     274           0 :       for (i = 0; i < 256; i++) s->inUse[i] = False;
     275             : 
     276           0 :       for (i = 0; i < 16; i++)
     277           0 :          if (s->inUse16[i])
     278           0 :             for (j = 0; j < 16; j++) {
     279           0 :                GET_BIT(BZ_X_MAPPING_2, uc);
     280           0 :                if (uc == 1) s->inUse[i * 16 + j] = True;
     281           0 :             }
     282           0 :       makeMaps_d ( s );
     283           0 :       if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
     284           0 :       alphaSize = s->nInUse+2;
     285             : 
     286             :       /*--- Now the selectors ---*/
     287           0 :       GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
     288           0 :       if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
     289           0 :       GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
     290           0 :       if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
     291           0 :       for (i = 0; i < nSelectors; i++) {
     292           0 :          j = 0;
     293           0 :          while (True) {
     294           0 :             GET_BIT(BZ_X_SELECTOR_3, uc);
     295           0 :             if (uc == 0) break;
     296           0 :             j++;
     297           0 :             if (j >= nGroups) RETURN(BZ_DATA_ERROR);
     298           0 :          }
     299             :          /* Having more than BZ_MAX_SELECTORS doesn't make much sense
     300             :             since they will never be used, but some implementations might
     301             :             "round up" the number of selectors, so just ignore those. */
     302           0 :          if (i < BZ_MAX_SELECTORS)
     303           0 :            s->selectorMtf[i] = j;
     304           0 :       }
     305           0 :       if (nSelectors > BZ_MAX_SELECTORS)
     306           0 :         nSelectors = BZ_MAX_SELECTORS;
     307             : 
     308             :       /*--- Undo the MTF values for the selectors. ---*/
     309           0 :       {
     310           0 :          UChar pos[BZ_N_GROUPS], tmp, v;
     311           0 :          for (v = 0; v < nGroups; v++) pos[v] = v;
     312             :    
     313           0 :          for (i = 0; i < nSelectors; i++) {
     314           0 :             v = s->selectorMtf[i];
     315           0 :             tmp = pos[v];
     316           0 :             while (v > 0) { pos[v] = pos[v-1]; v--; }
     317           0 :             pos[0] = tmp;
     318           0 :             s->selector[i] = tmp;
     319           0 :          }
     320           0 :       }
     321             : 
     322             :       /*--- Now the coding tables ---*/
     323           0 :       for (t = 0; t < nGroups; t++) {
     324           0 :          GET_BITS(BZ_X_CODING_1, curr, 5);
     325           0 :          for (i = 0; i < alphaSize; i++) {
     326           0 :             while (True) {
     327           0 :                if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
     328           0 :                GET_BIT(BZ_X_CODING_2, uc);
     329           0 :                if (uc == 0) break;
     330           0 :                GET_BIT(BZ_X_CODING_3, uc);
     331           0 :                if (uc == 0) curr++; else curr--;
     332           0 :             }
     333           0 :             s->len[t][i] = curr;
     334           0 :          }
     335           0 :       }
     336             : 
     337             :       /*--- Create the Huffman decoding tables ---*/
     338           0 :       for (t = 0; t < nGroups; t++) {
     339           0 :          minLen = 32;
     340           0 :          maxLen = 0;
     341           0 :          for (i = 0; i < alphaSize; i++) {
     342           0 :             if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
     343           0 :             if (s->len[t][i] < minLen) minLen = s->len[t][i];
     344           0 :          }
     345           0 :          BZ2_hbCreateDecodeTables ( 
     346           0 :             &(s->limit[t][0]), 
     347           0 :             &(s->base[t][0]), 
     348           0 :             &(s->perm[t][0]), 
     349           0 :             &(s->len[t][0]),
     350           0 :             minLen, maxLen, alphaSize
     351           0 :          );
     352           0 :          s->minLens[t] = minLen;
     353           0 :       }
     354             : 
     355             :       /*--- Now the MTF values ---*/
     356             : 
     357           0 :       EOB      = s->nInUse+1;
     358           0 :       nblockMAX = 100000 * s->blockSize100k;
     359           0 :       groupNo  = -1;
     360           0 :       groupPos = 0;
     361             : 
     362           0 :       for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
     363             : 
     364             :       /*-- MTF init --*/
     365           0 :       {
     366           0 :          Int32 ii, jj, kk;
     367           0 :          kk = MTFA_SIZE-1;
     368           0 :          for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
     369           0 :             for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
     370           0 :                s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
     371           0 :                kk--;
     372           0 :             }
     373           0 :             s->mtfbase[ii] = kk + 1;
     374           0 :          }
     375           0 :       }
     376             :       /*-- end MTF init --*/
     377             : 
     378           0 :       nblock = 0;
     379           0 :       GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
     380             : 
     381           0 :       while (True) {
     382             : 
     383           0 :          if (nextSym == EOB) break;
     384             : 
     385           0 :          if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
     386             : 
     387           0 :             es = -1;
     388           0 :             N = 1;
     389           0 :             do {
     390             :                /* Check that N doesn't get too big, so that es doesn't
     391             :                   go negative.  The maximum value that can be
     392             :                   RUNA/RUNB encoded is equal to the block size (post
     393             :                   the initial RLE), viz, 900k, so bounding N at 2
     394             :                   million should guard against overflow without
     395             :                   rejecting any legitimate inputs. */
     396           0 :                if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
     397           0 :                if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
     398           0 :                if (nextSym == BZ_RUNB) es = es + (1+1) * N;
     399           0 :                N = N * 2;
     400           0 :                GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
     401           0 :             }
     402           0 :                while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
     403             : 
     404           0 :             es++;
     405           0 :             uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
     406           0 :             s->unzftab[uc] += es;
     407             : 
     408           0 :             if (s->smallDecompress)
     409           0 :                while (es > 0) {
     410           0 :                   if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
     411           0 :                   s->ll16[nblock] = (UInt16)uc;
     412           0 :                   nblock++;
     413           0 :                   es--;
     414           0 :                }
     415           0 :             else
     416           0 :                while (es > 0) {
     417           0 :                   if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
     418           0 :                   s->tt[nblock] = (UInt32)uc;
     419           0 :                   nblock++;
     420           0 :                   es--;
     421           0 :                };
     422             : 
     423           0 :             continue;
     424             : 
     425           0 :          } else {
     426             : 
     427           0 :             if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
     428             : 
     429             :             /*-- uc = MTF ( nextSym-1 ) --*/
     430           0 :             {
     431           0 :                Int32 ii, jj, kk, pp, lno, off;
     432           0 :                UInt32 nn;
     433           0 :                nn = (UInt32)(nextSym - 1);
     434             : 
     435           0 :                if (nn < MTFL_SIZE) {
     436             :                   /* avoid general-case expense */
     437           0 :                   pp = s->mtfbase[0];
     438           0 :                   uc = s->mtfa[pp+nn];
     439           0 :                   while (nn > 3) {
     440           0 :                      Int32 z = pp+nn;
     441           0 :                      s->mtfa[(z)  ] = s->mtfa[(z)-1];
     442           0 :                      s->mtfa[(z)-1] = s->mtfa[(z)-2];
     443           0 :                      s->mtfa[(z)-2] = s->mtfa[(z)-3];
     444           0 :                      s->mtfa[(z)-3] = s->mtfa[(z)-4];
     445           0 :                      nn -= 4;
     446           0 :                   }
     447           0 :                   while (nn > 0) { 
     448           0 :                      s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
     449           0 :                   };
     450           0 :                   s->mtfa[pp] = uc;
     451           0 :                } else { 
     452             :                   /* general case */
     453           0 :                   lno = nn / MTFL_SIZE;
     454           0 :                   off = nn % MTFL_SIZE;
     455           0 :                   pp = s->mtfbase[lno] + off;
     456           0 :                   uc = s->mtfa[pp];
     457           0 :                   while (pp > s->mtfbase[lno]) { 
     458           0 :                      s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
     459           0 :                   };
     460           0 :                   s->mtfbase[lno]++;
     461           0 :                   while (lno > 0) {
     462           0 :                      s->mtfbase[lno]--;
     463           0 :                      s->mtfa[s->mtfbase[lno]] 
     464           0 :                         = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
     465           0 :                      lno--;
     466           0 :                   }
     467           0 :                   s->mtfbase[0]--;
     468           0 :                   s->mtfa[s->mtfbase[0]] = uc;
     469           0 :                   if (s->mtfbase[0] == 0) {
     470           0 :                      kk = MTFA_SIZE-1;
     471           0 :                      for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
     472           0 :                         for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
     473           0 :                            s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
     474           0 :                            kk--;
     475           0 :                         }
     476           0 :                         s->mtfbase[ii] = kk + 1;
     477           0 :                      }
     478           0 :                   }
     479           0 :                }
     480           0 :             }
     481             :             /*-- end uc = MTF ( nextSym-1 ) --*/
     482             : 
     483           0 :             s->unzftab[s->seqToUnseq[uc]]++;
     484           0 :             if (s->smallDecompress)
     485           0 :                s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
     486           0 :                s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
     487           0 :             nblock++;
     488             : 
     489           0 :             GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
     490           0 :             continue;
     491           0 :          }
     492           0 :       }
     493             : 
     494             :       /* Now we know what nblock is, we can do a better sanity
     495             :          check on s->origPtr.
     496             :       */
     497           0 :       if (s->origPtr < 0 || s->origPtr >= nblock)
     498           0 :          RETURN(BZ_DATA_ERROR);
     499             : 
     500             :       /*-- Set up cftab to facilitate generation of T^(-1) --*/
     501             :       /* Check: unzftab entries in range. */
     502           0 :       for (i = 0; i <= 255; i++) {
     503           0 :          if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
     504           0 :             RETURN(BZ_DATA_ERROR);
     505           0 :       }
     506             :       /* Actually generate cftab. */
     507           0 :       s->cftab[0] = 0;
     508           0 :       for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
     509           0 :       for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
     510             :       /* Check: cftab entries in range. */
     511           0 :       for (i = 0; i <= 256; i++) {
     512           0 :          if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
     513             :             /* s->cftab[i] can legitimately be == nblock */
     514           0 :             RETURN(BZ_DATA_ERROR);
     515           0 :          }
     516           0 :       }
     517             :       /* Check: cftab entries non-descending. */
     518           0 :       for (i = 1; i <= 256; i++) {
     519           0 :          if (s->cftab[i-1] > s->cftab[i]) {
     520           0 :             RETURN(BZ_DATA_ERROR);
     521           0 :          }
     522           0 :       }
     523             : 
     524           0 :       s->state_out_len = 0;
     525           0 :       s->state_out_ch  = 0;
     526           0 :       BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
     527           0 :       s->state = BZ_X_OUTPUT;
     528           0 :       if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
     529             : 
     530           0 :       if (s->smallDecompress) {
     531             : 
     532             :          /*-- Make a copy of cftab, used in generation of T --*/
     533           0 :          for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
     534             : 
     535             :          /*-- compute the T vector --*/
     536           0 :          for (i = 0; i < nblock; i++) {
     537           0 :             uc = (UChar)(s->ll16[i]);
     538           0 :             SET_LL(i, s->cftabCopy[uc]);
     539           0 :             s->cftabCopy[uc]++;
     540           0 :          }
     541             : 
     542             :          /*-- Compute T^(-1) by pointer reversal on T --*/
     543           0 :          i = s->origPtr;
     544           0 :          j = GET_LL(i);
     545           0 :          do {
     546           0 :             Int32 tmp = GET_LL(j);
     547           0 :             SET_LL(j, i);
     548           0 :             i = j;
     549           0 :             j = tmp;
     550           0 :          }
     551           0 :             while (i != s->origPtr);
     552             : 
     553           0 :          s->tPos = s->origPtr;
     554           0 :          s->nblock_used = 0;
     555           0 :          if (s->blockRandomised) {
     556           0 :             BZ_RAND_INIT_MASK;
     557           0 :             BZ_GET_SMALL(s->k0); s->nblock_used++;
     558           0 :             BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
     559           0 :          } else {
     560           0 :             BZ_GET_SMALL(s->k0); s->nblock_used++;
     561           0 :          }
     562             : 
     563           0 :       } else {
     564             : 
     565             :          /*-- compute the T^(-1) vector --*/
     566           0 :          for (i = 0; i < nblock; i++) {
     567           0 :             uc = (UChar)(s->tt[i] & 0xff);
     568           0 :             s->tt[s->cftab[uc]] |= (i << 8);
     569           0 :             s->cftab[uc]++;
     570           0 :          }
     571             : 
     572           0 :          s->tPos = s->tt[s->origPtr] >> 8;
     573           0 :          s->nblock_used = 0;
     574           0 :          if (s->blockRandomised) {
     575           0 :             BZ_RAND_INIT_MASK;
     576           0 :             BZ_GET_FAST(s->k0); s->nblock_used++;
     577           0 :             BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
     578           0 :          } else {
     579           0 :             BZ_GET_FAST(s->k0); s->nblock_used++;
     580           0 :          }
     581             : 
     582           0 :       }
     583             : 
     584           0 :       RETURN(BZ_OK);
     585             : 
     586             : 
     587             : 
     588           0 :     endhdr_2:
     589             : 
     590           0 :       GET_UCHAR(BZ_X_ENDHDR_2, uc);
     591           0 :       if (uc != 0x72) RETURN(BZ_DATA_ERROR);
     592           0 :       GET_UCHAR(BZ_X_ENDHDR_3, uc);
     593           0 :       if (uc != 0x45) RETURN(BZ_DATA_ERROR);
     594           0 :       GET_UCHAR(BZ_X_ENDHDR_4, uc);
     595           0 :       if (uc != 0x38) RETURN(BZ_DATA_ERROR);
     596           0 :       GET_UCHAR(BZ_X_ENDHDR_5, uc);
     597           0 :       if (uc != 0x50) RETURN(BZ_DATA_ERROR);
     598           0 :       GET_UCHAR(BZ_X_ENDHDR_6, uc);
     599           0 :       if (uc != 0x90) RETURN(BZ_DATA_ERROR);
     600             : 
     601           0 :       s->storedCombinedCRC = 0;
     602           0 :       GET_UCHAR(BZ_X_CCRC_1, uc);
     603           0 :       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
     604           0 :       GET_UCHAR(BZ_X_CCRC_2, uc);
     605           0 :       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
     606           0 :       GET_UCHAR(BZ_X_CCRC_3, uc);
     607           0 :       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
     608           0 :       GET_UCHAR(BZ_X_CCRC_4, uc);
     609           0 :       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
     610             : 
     611           0 :       s->state = BZ_X_IDLE;
     612           0 :       RETURN(BZ_STREAM_END);
     613             : 
     614           0 :       default: AssertH ( False, 4001 );
     615           0 :    }
     616             : 
     617           0 :    AssertH ( False, 4002 );
     618             : 
     619           0 :    save_state_and_return:
     620             : 
     621           0 :    s->save_i           = i;
     622           0 :    s->save_j           = j;
     623           0 :    s->save_t           = t;
     624           0 :    s->save_alphaSize   = alphaSize;
     625           0 :    s->save_nGroups     = nGroups;
     626           0 :    s->save_nSelectors  = nSelectors;
     627           0 :    s->save_EOB         = EOB;
     628           0 :    s->save_groupNo     = groupNo;
     629           0 :    s->save_groupPos    = groupPos;
     630           0 :    s->save_nextSym     = nextSym;
     631           0 :    s->save_nblockMAX   = nblockMAX;
     632           0 :    s->save_nblock      = nblock;
     633           0 :    s->save_es          = es;
     634           0 :    s->save_N           = N;
     635           0 :    s->save_curr        = curr;
     636           0 :    s->save_zt          = zt;
     637           0 :    s->save_zn          = zn;
     638           0 :    s->save_zvec        = zvec;
     639           0 :    s->save_zj          = zj;
     640           0 :    s->save_gSel        = gSel;
     641           0 :    s->save_gMinlen     = gMinlen;
     642           0 :    s->save_gLimit      = gLimit;
     643           0 :    s->save_gBase       = gBase;
     644           0 :    s->save_gPerm       = gPerm;
     645             : 
     646           0 :    return retVal;   
     647           0 : }
     648             : 
     649             : 
     650             : /*-------------------------------------------------------------*/
     651             : /*--- end                                      decompress.c ---*/
     652             : /*-------------------------------------------------------------*/

Generated by: LCOV version 1.14