modules/libbz2/src/decompress.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/modules/libbz2/src/decompress.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,626 @@
     1.4 +
     1.5 +/*-------------------------------------------------------------*/
     1.6 +/*--- Decompression machinery                               ---*/
     1.7 +/*---                                          decompress.c ---*/
     1.8 +/*-------------------------------------------------------------*/
     1.9 +
    1.10 +/* ------------------------------------------------------------------
    1.11 +   This file is part of bzip2/libbzip2, a program and library for
    1.12 +   lossless, block-sorting data compression.
    1.13 +
    1.14 +   bzip2/libbzip2 version 1.0.4 of 20 December 2006
    1.15 +   Copyright (C) 1996-2006 Julian Seward <jseward@bzip.org>
    1.16 +
    1.17 +   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
    1.18 +   README file.
    1.19 +
    1.20 +   This program is released under the terms of the license contained
    1.21 +   in the file LICENSE.
    1.22 +   ------------------------------------------------------------------ */
    1.23 +
    1.24 +
    1.25 +#include "bzlib_private.h"
    1.26 +
    1.27 +
    1.28 +/*---------------------------------------------------*/
    1.29 +static
    1.30 +void makeMaps_d ( DState* s )
    1.31 +{
    1.32 +   Int32 i;
    1.33 +   s->nInUse = 0;
    1.34 +   for (i = 0; i < 256; i++)
    1.35 +      if (s->inUse[i]) {
    1.36 +         s->seqToUnseq[s->nInUse] = i;
    1.37 +         s->nInUse++;
    1.38 +      }
    1.39 +}
    1.40 +
    1.41 +
    1.42 +/*---------------------------------------------------*/
    1.43 +#define RETURN(rrr)                               \
    1.44 +   { retVal = rrr; goto save_state_and_return; };
    1.45 +
    1.46 +#define GET_BITS(lll,vvv,nnn)                     \
    1.47 +   case lll: s->state = lll;                      \
    1.48 +   while (True) {                                 \
    1.49 +      if (s->bsLive >= nnn) {                     \
    1.50 +         UInt32 v;                                \
    1.51 +         v = (s->bsBuff >>                        \
    1.52 +             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
    1.53 +         s->bsLive -= nnn;                        \
    1.54 +         vvv = v;                                 \
    1.55 +         break;                                   \
    1.56 +      }                                           \
    1.57 +      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
    1.58 +      s->bsBuff                                   \
    1.59 +         = (s->bsBuff << 8) |                     \
    1.60 +           ((UInt32)                              \
    1.61 +              (*((UChar*)(s->strm->next_in))));   \
    1.62 +      s->bsLive += 8;                             \
    1.63 +      s->strm->next_in++;                         \
    1.64 +      s->strm->avail_in--;                        \
    1.65 +      s->strm->total_in_lo32++;                   \
    1.66 +      if (s->strm->total_in_lo32 == 0)            \
    1.67 +         s->strm->total_in_hi32++;                \
    1.68 +   }
    1.69 +
    1.70 +#define GET_UCHAR(lll,uuu)                        \
    1.71 +   GET_BITS(lll,uuu,8)
    1.72 +
    1.73 +#define GET_BIT(lll,uuu)                          \
    1.74 +   GET_BITS(lll,uuu,1)
    1.75 +
    1.76 +/*---------------------------------------------------*/
    1.77 +#define GET_MTF_VAL(label1,label2,lval)           \
    1.78 +{                                                 \
    1.79 +   if (groupPos == 0) {                           \
    1.80 +      groupNo++;                                  \
    1.81 +      if (groupNo >= nSelectors)                  \
    1.82 +         RETURN(BZ_DATA_ERROR);                   \
    1.83 +      groupPos = BZ_G_SIZE;                       \
    1.84 +      gSel = s->selector[groupNo];                \
    1.85 +      gMinlen = s->minLens[gSel];                 \
    1.86 +      gLimit = &(s->limit[gSel][0]);              \
    1.87 +      gPerm = &(s->perm[gSel][0]);                \
    1.88 +      gBase = &(s->base[gSel][0]);                \
    1.89 +   }                                              \
    1.90 +   groupPos--;                                    \
    1.91 +   zn = gMinlen;                                  \
    1.92 +   GET_BITS(label1, zvec, zn);                    \
    1.93 +   while (1) {                                    \
    1.94 +      if (zn > 20 /* the longest code */)         \
    1.95 +         RETURN(BZ_DATA_ERROR);                   \
    1.96 +      if (zvec <= gLimit[zn]) break;              \
    1.97 +      zn++;                                       \
    1.98 +      GET_BIT(label2, zj);                        \
    1.99 +      zvec = (zvec << 1) | zj;                    \
   1.100 +   };                                             \
   1.101 +   if (zvec - gBase[zn] < 0                       \
   1.102 +       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
   1.103 +      RETURN(BZ_DATA_ERROR);                      \
   1.104 +   lval = gPerm[zvec - gBase[zn]];                \
   1.105 +}
   1.106 +
   1.107 +
   1.108 +/*---------------------------------------------------*/
   1.109 +Int32 BZ2_decompress ( DState* s )
   1.110 +{
   1.111 +   UChar      uc;
   1.112 +   Int32      retVal;
   1.113 +   Int32      minLen, maxLen;
   1.114 +   bz_stream* strm = s->strm;
   1.115 +
   1.116 +   /* stuff that needs to be saved/restored */
   1.117 +   Int32  i;
   1.118 +   Int32  j;
   1.119 +   Int32  t;
   1.120 +   Int32  alphaSize;
   1.121 +   Int32  nGroups;
   1.122 +   Int32  nSelectors;
   1.123 +   Int32  EOB;
   1.124 +   Int32  groupNo;
   1.125 +   Int32  groupPos;
   1.126 +   Int32  nextSym;
   1.127 +   Int32  nblockMAX;
   1.128 +   Int32  nblock;
   1.129 +   Int32  es;
   1.130 +   Int32  N;
   1.131 +   Int32  curr;
   1.132 +   Int32  zt;
   1.133 +   Int32  zn; 
   1.134 +   Int32  zvec;
   1.135 +   Int32  zj;
   1.136 +   Int32  gSel;
   1.137 +   Int32  gMinlen;
   1.138 +   Int32* gLimit;
   1.139 +   Int32* gBase;
   1.140 +   Int32* gPerm;
   1.141 +
   1.142 +   if (s->state == BZ_X_MAGIC_1) {
   1.143 +      /*initialise the save area*/
   1.144 +      s->save_i           = 0;
   1.145 +      s->save_j           = 0;
   1.146 +      s->save_t           = 0;
   1.147 +      s->save_alphaSize   = 0;
   1.148 +      s->save_nGroups     = 0;
   1.149 +      s->save_nSelectors  = 0;
   1.150 +      s->save_EOB         = 0;
   1.151 +      s->save_groupNo     = 0;
   1.152 +      s->save_groupPos    = 0;
   1.153 +      s->save_nextSym     = 0;
   1.154 +      s->save_nblockMAX   = 0;
   1.155 +      s->save_nblock      = 0;
   1.156 +      s->save_es          = 0;
   1.157 +      s->save_N           = 0;
   1.158 +      s->save_curr        = 0;
   1.159 +      s->save_zt          = 0;
   1.160 +      s->save_zn          = 0;
   1.161 +      s->save_zvec        = 0;
   1.162 +      s->save_zj          = 0;
   1.163 +      s->save_gSel        = 0;
   1.164 +      s->save_gMinlen     = 0;
   1.165 +      s->save_gLimit      = NULL;
   1.166 +      s->save_gBase       = NULL;
   1.167 +      s->save_gPerm       = NULL;
   1.168 +   }
   1.169 +
   1.170 +   /*restore from the save area*/
   1.171 +   i           = s->save_i;
   1.172 +   j           = s->save_j;
   1.173 +   t           = s->save_t;
   1.174 +   alphaSize   = s->save_alphaSize;
   1.175 +   nGroups     = s->save_nGroups;
   1.176 +   nSelectors  = s->save_nSelectors;
   1.177 +   EOB         = s->save_EOB;
   1.178 +   groupNo     = s->save_groupNo;
   1.179 +   groupPos    = s->save_groupPos;
   1.180 +   nextSym     = s->save_nextSym;
   1.181 +   nblockMAX   = s->save_nblockMAX;
   1.182 +   nblock      = s->save_nblock;
   1.183 +   es          = s->save_es;
   1.184 +   N           = s->save_N;
   1.185 +   curr        = s->save_curr;
   1.186 +   zt          = s->save_zt;
   1.187 +   zn          = s->save_zn; 
   1.188 +   zvec        = s->save_zvec;
   1.189 +   zj          = s->save_zj;
   1.190 +   gSel        = s->save_gSel;
   1.191 +   gMinlen     = s->save_gMinlen;
   1.192 +   gLimit      = s->save_gLimit;
   1.193 +   gBase       = s->save_gBase;
   1.194 +   gPerm       = s->save_gPerm;
   1.195 +
   1.196 +   retVal = BZ_OK;
   1.197 +
   1.198 +   switch (s->state) {
   1.199 +
   1.200 +      GET_UCHAR(BZ_X_MAGIC_1, uc);
   1.201 +      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
   1.202 +
   1.203 +      GET_UCHAR(BZ_X_MAGIC_2, uc);
   1.204 +      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
   1.205 +
   1.206 +      GET_UCHAR(BZ_X_MAGIC_3, uc)
   1.207 +      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
   1.208 +
   1.209 +      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
   1.210 +      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
   1.211 +          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
   1.212 +      s->blockSize100k -= BZ_HDR_0;
   1.213 +
   1.214 +      if (s->smallDecompress) {
   1.215 +         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
   1.216 +         s->ll4  = BZALLOC( 
   1.217 +                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
   1.218 +                   );
   1.219 +         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
   1.220 +      } else {
   1.221 +         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
   1.222 +         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
   1.223 +      }
   1.224 +
   1.225 +      GET_UCHAR(BZ_X_BLKHDR_1, uc);
   1.226 +
   1.227 +      if (uc == 0x17) goto endhdr_2;
   1.228 +      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
   1.229 +      GET_UCHAR(BZ_X_BLKHDR_2, uc);
   1.230 +      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
   1.231 +      GET_UCHAR(BZ_X_BLKHDR_3, uc);
   1.232 +      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
   1.233 +      GET_UCHAR(BZ_X_BLKHDR_4, uc);
   1.234 +      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
   1.235 +      GET_UCHAR(BZ_X_BLKHDR_5, uc);
   1.236 +      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
   1.237 +      GET_UCHAR(BZ_X_BLKHDR_6, uc);
   1.238 +      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
   1.239 +
   1.240 +      s->currBlockNo++;
   1.241 +      if (s->verbosity >= 2)
   1.242 +         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
   1.243 + 
   1.244 +      s->storedBlockCRC = 0;
   1.245 +      GET_UCHAR(BZ_X_BCRC_1, uc);
   1.246 +      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
   1.247 +      GET_UCHAR(BZ_X_BCRC_2, uc);
   1.248 +      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
   1.249 +      GET_UCHAR(BZ_X_BCRC_3, uc);
   1.250 +      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
   1.251 +      GET_UCHAR(BZ_X_BCRC_4, uc);
   1.252 +      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
   1.253 +
   1.254 +      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
   1.255 +
   1.256 +      s->origPtr = 0;
   1.257 +      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
   1.258 +      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
   1.259 +      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
   1.260 +      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
   1.261 +      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
   1.262 +      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
   1.263 +
   1.264 +      if (s->origPtr < 0)
   1.265 +         RETURN(BZ_DATA_ERROR);
   1.266 +      if (s->origPtr > 10 + 100000*s->blockSize100k) 
   1.267 +         RETURN(BZ_DATA_ERROR);
   1.268 +
   1.269 +      /*--- Receive the mapping table ---*/
   1.270 +      for (i = 0; i < 16; i++) {
   1.271 +         GET_BIT(BZ_X_MAPPING_1, uc);
   1.272 +         if (uc == 1) 
   1.273 +            s->inUse16[i] = True; else 
   1.274 +            s->inUse16[i] = False;
   1.275 +      }
   1.276 +
   1.277 +      for (i = 0; i < 256; i++) s->inUse[i] = False;
   1.278 +
   1.279 +      for (i = 0; i < 16; i++)
   1.280 +         if (s->inUse16[i])
   1.281 +            for (j = 0; j < 16; j++) {
   1.282 +               GET_BIT(BZ_X_MAPPING_2, uc);
   1.283 +               if (uc == 1) s->inUse[i * 16 + j] = True;
   1.284 +            }
   1.285 +      makeMaps_d ( s );
   1.286 +      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
   1.287 +      alphaSize = s->nInUse+2;
   1.288 +
   1.289 +      /*--- Now the selectors ---*/
   1.290 +      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
   1.291 +      if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
   1.292 +      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
   1.293 +      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
   1.294 +      for (i = 0; i < nSelectors; i++) {
   1.295 +         j = 0;
   1.296 +         while (True) {
   1.297 +            GET_BIT(BZ_X_SELECTOR_3, uc);
   1.298 +            if (uc == 0) break;
   1.299 +            j++;
   1.300 +            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
   1.301 +         }
   1.302 +         s->selectorMtf[i] = j;
   1.303 +      }
   1.304 +
   1.305 +      /*--- Undo the MTF values for the selectors. ---*/
   1.306 +      {
   1.307 +         UChar pos[BZ_N_GROUPS], tmp, v;
   1.308 +         for (v = 0; v < nGroups; v++) pos[v] = v;
   1.309 +   
   1.310 +         for (i = 0; i < nSelectors; i++) {
   1.311 +            v = s->selectorMtf[i];
   1.312 +            tmp = pos[v];
   1.313 +            while (v > 0) { pos[v] = pos[v-1]; v--; }
   1.314 +            pos[0] = tmp;
   1.315 +            s->selector[i] = tmp;
   1.316 +         }
   1.317 +      }
   1.318 +
   1.319 +      /*--- Now the coding tables ---*/
   1.320 +      for (t = 0; t < nGroups; t++) {
   1.321 +         GET_BITS(BZ_X_CODING_1, curr, 5);
   1.322 +         for (i = 0; i < alphaSize; i++) {
   1.323 +            while (True) {
   1.324 +               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
   1.325 +               GET_BIT(BZ_X_CODING_2, uc);
   1.326 +               if (uc == 0) break;
   1.327 +               GET_BIT(BZ_X_CODING_3, uc);
   1.328 +               if (uc == 0) curr++; else curr--;
   1.329 +            }
   1.330 +            s->len[t][i] = curr;
   1.331 +         }
   1.332 +      }
   1.333 +
   1.334 +      /*--- Create the Huffman decoding tables ---*/
   1.335 +      for (t = 0; t < nGroups; t++) {
   1.336 +         minLen = 32;
   1.337 +         maxLen = 0;
   1.338 +         for (i = 0; i < alphaSize; i++) {
   1.339 +            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
   1.340 +            if (s->len[t][i] < minLen) minLen = s->len[t][i];
   1.341 +         }
   1.342 +         BZ2_hbCreateDecodeTables ( 
   1.343 +            &(s->limit[t][0]), 
   1.344 +            &(s->base[t][0]), 
   1.345 +            &(s->perm[t][0]), 
   1.346 +            &(s->len[t][0]),
   1.347 +            minLen, maxLen, alphaSize
   1.348 +         );
   1.349 +         s->minLens[t] = minLen;
   1.350 +      }
   1.351 +
   1.352 +      /*--- Now the MTF values ---*/
   1.353 +
   1.354 +      EOB      = s->nInUse+1;
   1.355 +      nblockMAX = 100000 * s->blockSize100k;
   1.356 +      groupNo  = -1;
   1.357 +      groupPos = 0;
   1.358 +
   1.359 +      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
   1.360 +
   1.361 +      /*-- MTF init --*/
   1.362 +      {
   1.363 +         Int32 ii, jj, kk;
   1.364 +         kk = MTFA_SIZE-1;
   1.365 +         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
   1.366 +            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
   1.367 +               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
   1.368 +               kk--;
   1.369 +            }
   1.370 +            s->mtfbase[ii] = kk + 1;
   1.371 +         }
   1.372 +      }
   1.373 +      /*-- end MTF init --*/
   1.374 +
   1.375 +      nblock = 0;
   1.376 +      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
   1.377 +
   1.378 +      while (True) {
   1.379 +
   1.380 +         if (nextSym == EOB) break;
   1.381 +
   1.382 +         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
   1.383 +
   1.384 +            es = -1;
   1.385 +            N = 1;
   1.386 +            do {
   1.387 +               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
   1.388 +               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
   1.389 +               N = N * 2;
   1.390 +               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
   1.391 +            }
   1.392 +               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
   1.393 +
   1.394 +            es++;
   1.395 +            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
   1.396 +            s->unzftab[uc] += es;
   1.397 +
   1.398 +            if (s->smallDecompress)
   1.399 +               while (es > 0) {
   1.400 +                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
   1.401 +                  s->ll16[nblock] = (UInt16)uc;
   1.402 +                  nblock++;
   1.403 +                  es--;
   1.404 +               }
   1.405 +            else
   1.406 +               while (es > 0) {
   1.407 +                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
   1.408 +                  s->tt[nblock] = (UInt32)uc;
   1.409 +                  nblock++;
   1.410 +                  es--;
   1.411 +               };
   1.412 +
   1.413 +            continue;
   1.414 +
   1.415 +         } else {
   1.416 +
   1.417 +            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
   1.418 +
   1.419 +            /*-- uc = MTF ( nextSym-1 ) --*/
   1.420 +            {
   1.421 +               Int32 ii, jj, kk, pp, lno, off;
   1.422 +               UInt32 nn;
   1.423 +               nn = (UInt32)(nextSym - 1);
   1.424 +
   1.425 +               if (nn < MTFL_SIZE) {
   1.426 +                  /* avoid general-case expense */
   1.427 +                  pp = s->mtfbase[0];
   1.428 +                  uc = s->mtfa[pp+nn];
   1.429 +                  while (nn > 3) {
   1.430 +                     Int32 z = pp+nn;
   1.431 +                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
   1.432 +                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
   1.433 +                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
   1.434 +                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
   1.435 +                     nn -= 4;
   1.436 +                  }
   1.437 +                  while (nn > 0) { 
   1.438 +                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
   1.439 +                  };
   1.440 +                  s->mtfa[pp] = uc;
   1.441 +               } else { 
   1.442 +                  /* general case */
   1.443 +                  lno = nn / MTFL_SIZE;
   1.444 +                  off = nn % MTFL_SIZE;
   1.445 +                  pp = s->mtfbase[lno] + off;
   1.446 +                  uc = s->mtfa[pp];
   1.447 +                  while (pp > s->mtfbase[lno]) { 
   1.448 +                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
   1.449 +                  };
   1.450 +                  s->mtfbase[lno]++;
   1.451 +                  while (lno > 0) {
   1.452 +                     s->mtfbase[lno]--;
   1.453 +                     s->mtfa[s->mtfbase[lno]] 
   1.454 +                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
   1.455 +                     lno--;
   1.456 +                  }
   1.457 +                  s->mtfbase[0]--;
   1.458 +                  s->mtfa[s->mtfbase[0]] = uc;
   1.459 +                  if (s->mtfbase[0] == 0) {
   1.460 +                     kk = MTFA_SIZE-1;
   1.461 +                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
   1.462 +                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
   1.463 +                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
   1.464 +                           kk--;
   1.465 +                        }
   1.466 +                        s->mtfbase[ii] = kk + 1;
   1.467 +                     }
   1.468 +                  }
   1.469 +               }
   1.470 +            }
   1.471 +            /*-- end uc = MTF ( nextSym-1 ) --*/
   1.472 +
   1.473 +            s->unzftab[s->seqToUnseq[uc]]++;
   1.474 +            if (s->smallDecompress)
   1.475 +               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
   1.476 +               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
   1.477 +            nblock++;
   1.478 +
   1.479 +            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
   1.480 +            continue;
   1.481 +         }
   1.482 +      }
   1.483 +
   1.484 +      /* Now we know what nblock is, we can do a better sanity
   1.485 +         check on s->origPtr.
   1.486 +      */
   1.487 +      if (s->origPtr < 0 || s->origPtr >= nblock)
   1.488 +         RETURN(BZ_DATA_ERROR);
   1.489 +
   1.490 +      /*-- Set up cftab to facilitate generation of T^(-1) --*/
   1.491 +      s->cftab[0] = 0;
   1.492 +      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
   1.493 +      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
   1.494 +      for (i = 0; i <= 256; i++) {
   1.495 +         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
   1.496 +            /* s->cftab[i] can legitimately be == nblock */
   1.497 +            RETURN(BZ_DATA_ERROR);
   1.498 +         }
   1.499 +      }
   1.500 +
   1.501 +      s->state_out_len = 0;
   1.502 +      s->state_out_ch  = 0;
   1.503 +      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
   1.504 +      s->state = BZ_X_OUTPUT;
   1.505 +      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
   1.506 +
   1.507 +      if (s->smallDecompress) {
   1.508 +
   1.509 +         /*-- Make a copy of cftab, used in generation of T --*/
   1.510 +         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
   1.511 +
   1.512 +         /*-- compute the T vector --*/
   1.513 +         for (i = 0; i < nblock; i++) {
   1.514 +            uc = (UChar)(s->ll16[i]);
   1.515 +            SET_LL(i, s->cftabCopy[uc]);
   1.516 +            s->cftabCopy[uc]++;
   1.517 +         }
   1.518 +
   1.519 +         /*-- Compute T^(-1) by pointer reversal on T --*/
   1.520 +         i = s->origPtr;
   1.521 +         j = GET_LL(i);
   1.522 +         do {
   1.523 +            Int32 tmp = GET_LL(j);
   1.524 +            SET_LL(j, i);
   1.525 +            i = j;
   1.526 +            j = tmp;
   1.527 +         }
   1.528 +            while (i != s->origPtr);
   1.529 +
   1.530 +         s->tPos = s->origPtr;
   1.531 +         s->nblock_used = 0;
   1.532 +         if (s->blockRandomised) {
   1.533 +            BZ_RAND_INIT_MASK;
   1.534 +            BZ_GET_SMALL(s->k0); s->nblock_used++;
   1.535 +            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
   1.536 +         } else {
   1.537 +            BZ_GET_SMALL(s->k0); s->nblock_used++;
   1.538 +         }
   1.539 +
   1.540 +      } else {
   1.541 +
   1.542 +         /*-- compute the T^(-1) vector --*/
   1.543 +         for (i = 0; i < nblock; i++) {
   1.544 +            uc = (UChar)(s->tt[i] & 0xff);
   1.545 +            s->tt[s->cftab[uc]] |= (i << 8);
   1.546 +            s->cftab[uc]++;
   1.547 +         }
   1.548 +
   1.549 +         s->tPos = s->tt[s->origPtr] >> 8;
   1.550 +         s->nblock_used = 0;
   1.551 +         if (s->blockRandomised) {
   1.552 +            BZ_RAND_INIT_MASK;
   1.553 +            BZ_GET_FAST(s->k0); s->nblock_used++;
   1.554 +            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
   1.555 +         } else {
   1.556 +            BZ_GET_FAST(s->k0); s->nblock_used++;
   1.557 +         }
   1.558 +
   1.559 +      }
   1.560 +
   1.561 +      RETURN(BZ_OK);
   1.562 +
   1.563 +
   1.564 +
   1.565 +    endhdr_2:
   1.566 +
   1.567 +      GET_UCHAR(BZ_X_ENDHDR_2, uc);
   1.568 +      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
   1.569 +      GET_UCHAR(BZ_X_ENDHDR_3, uc);
   1.570 +      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
   1.571 +      GET_UCHAR(BZ_X_ENDHDR_4, uc);
   1.572 +      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
   1.573 +      GET_UCHAR(BZ_X_ENDHDR_5, uc);
   1.574 +      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
   1.575 +      GET_UCHAR(BZ_X_ENDHDR_6, uc);
   1.576 +      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
   1.577 +
   1.578 +      s->storedCombinedCRC = 0;
   1.579 +      GET_UCHAR(BZ_X_CCRC_1, uc);
   1.580 +      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
   1.581 +      GET_UCHAR(BZ_X_CCRC_2, uc);
   1.582 +      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
   1.583 +      GET_UCHAR(BZ_X_CCRC_3, uc);
   1.584 +      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
   1.585 +      GET_UCHAR(BZ_X_CCRC_4, uc);
   1.586 +      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
   1.587 +
   1.588 +      s->state = BZ_X_IDLE;
   1.589 +      RETURN(BZ_STREAM_END);
   1.590 +
   1.591 +      default: AssertH ( False, 4001 );
   1.592 +   }
   1.593 +
   1.594 +   AssertH ( False, 4002 );
   1.595 +
   1.596 +   save_state_and_return:
   1.597 +
   1.598 +   s->save_i           = i;
   1.599 +   s->save_j           = j;
   1.600 +   s->save_t           = t;
   1.601 +   s->save_alphaSize   = alphaSize;
   1.602 +   s->save_nGroups     = nGroups;
   1.603 +   s->save_nSelectors  = nSelectors;
   1.604 +   s->save_EOB         = EOB;
   1.605 +   s->save_groupNo     = groupNo;
   1.606 +   s->save_groupPos    = groupPos;
   1.607 +   s->save_nextSym     = nextSym;
   1.608 +   s->save_nblockMAX   = nblockMAX;
   1.609 +   s->save_nblock      = nblock;
   1.610 +   s->save_es          = es;
   1.611 +   s->save_N           = N;
   1.612 +   s->save_curr        = curr;
   1.613 +   s->save_zt          = zt;
   1.614 +   s->save_zn          = zn;
   1.615 +   s->save_zvec        = zvec;
   1.616 +   s->save_zj          = zj;
   1.617 +   s->save_gSel        = gSel;
   1.618 +   s->save_gMinlen     = gMinlen;
   1.619 +   s->save_gLimit      = gLimit;
   1.620 +   s->save_gBase       = gBase;
   1.621 +   s->save_gPerm       = gPerm;
   1.622 +
   1.623 +   return retVal;   
   1.624 +}
   1.625 +
   1.626 +
   1.627 +/*-------------------------------------------------------------*/
   1.628 +/*--- end                                      decompress.c ---*/
   1.629 +/*-------------------------------------------------------------*/

mercurial