Coverage Report

Created: 2025-12-03 07:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bzip2/decompress.c
Line
Count
Source
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.6 of 6 September 2010
12
   Copyright (C) 1996-2010 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
1.37k
{
29
1.37k
   Int32 i;
30
1.37k
   s->nInUse = 0;
31
352k
   for (i = 0; i < 256; i++)
32
350k
      if (s->inUse[i]) {
33
17.9k
         s->seqToUnseq[s->nInUse] = i;
34
17.9k
         s->nInUse++;
35
17.9k
      }
36
1.37k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
294M
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
41.2M
   case lll: s->state = lll;                      \
45
48.2M
   while (True) {                                 \
46
48.2M
      if (s->bsLive >= nnn) {                     \
47
41.2M
         UInt32 v;                                \
48
41.2M
         v = (s->bsBuff >>                        \
49
41.2M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
41.2M
         s->bsLive -= nnn;                        \
51
41.2M
         vvv = v;                                 \
52
41.2M
         break;                                   \
53
41.2M
      }                                           \
54
48.2M
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
6.95M
      s->bsBuff                                   \
56
6.95M
         = (s->bsBuff << 8) |                     \
57
6.95M
           ((UInt32)                              \
58
6.95M
              (*((UChar*)(s->strm->next_in))));   \
59
6.95M
      s->bsLive += 8;                             \
60
6.95M
      s->strm->next_in++;                         \
61
6.95M
      s->strm->avail_in--;                        \
62
6.95M
      s->strm->total_in_lo32++;                   \
63
6.95M
      if (s->strm->total_in_lo32 == 0)            \
64
6.95M
         s->strm->total_in_hi32++;                \
65
6.95M
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
23.2k
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
34.6M
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
6.58M
#define GET_MTF_VAL(label1,label2,lval)           \
75
6.58M
{                                                 \
76
6.58M
   if (groupPos == 0) {                           \
77
132k
      groupNo++;                                  \
78
132k
      if (groupNo >= nSelectors)                  \
79
132k
         RETURN(BZ_DATA_ERROR);                   \
80
132k
      groupPos = BZ_G_SIZE;                       \
81
132k
      gSel = s->selector[groupNo];                \
82
132k
      gMinlen = s->minLens[gSel];                 \
83
132k
      gLimit = &(s->limit[gSel][0]);              \
84
132k
      gPerm = &(s->perm[gSel][0]);                \
85
132k
      gBase = &(s->base[gSel][0]);                \
86
132k
   }                                              \
87
6.58M
   groupPos--;                                    \
88
6.58M
   zn = gMinlen;                                  \
89
6.58M
   GET_BITS(label1, zvec, zn);                    \
90
6.86M
   while (1) {                                    \
91
6.86M
      if (zn > 20 /* the longest code */)         \
92
6.86M
         RETURN(BZ_DATA_ERROR);                   \
93
6.86M
      if (zvec <= gLimit[zn]) break;              \
94
6.86M
      zn++;                                       \
95
285k
      GET_BIT(label2, zj);                        \
96
284k
      zvec = (zvec << 1) | zj;                    \
97
6.58M
   };                                             \
98
6.58M
   if (zvec - gBase[zn] < 0                       \
99
6.58M
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
6.58M
      RETURN(BZ_DATA_ERROR);                      \
101
6.58M
   lval = gPerm[zvec - gBase[zn]];                \
102
6.58M
}
103
104
105
/*---------------------------------------------------*/
106
Int32 BZ2_decompress ( DState* s )
107
6.14k
{
108
6.14k
   UChar      uc;
109
6.14k
   Int32      retVal;
110
6.14k
   Int32      minLen, maxLen;
111
6.14k
   bz_stream* strm = s->strm;
112
113
   /* stuff that needs to be saved/restored */
114
6.14k
   Int32  i;
115
6.14k
   Int32  j;
116
6.14k
   Int32  t;
117
6.14k
   Int32  alphaSize;
118
6.14k
   Int32  nGroups;
119
6.14k
   Int32  nSelectors;
120
6.14k
   Int32  EOB;
121
6.14k
   Int32  groupNo;
122
6.14k
   Int32  groupPos;
123
6.14k
   Int32  nextSym;
124
6.14k
   Int32  nblockMAX;
125
6.14k
   Int32  nblock;
126
6.14k
   Int32  es;
127
6.14k
   Int32  N;
128
6.14k
   Int32  curr;
129
6.14k
   Int32  zt;
130
6.14k
   Int32  zn; 
131
6.14k
   Int32  zvec;
132
6.14k
   Int32  zj;
133
6.14k
   Int32  gSel;
134
6.14k
   Int32  gMinlen;
135
6.14k
   Int32* gLimit;
136
6.14k
   Int32* gBase;
137
6.14k
   Int32* gPerm;
138
139
6.14k
   if (s->state == BZ_X_MAGIC_1) {
140
      /*initialise the save area*/
141
1.48k
      s->save_i           = 0;
142
1.48k
      s->save_j           = 0;
143
1.48k
      s->save_t           = 0;
144
1.48k
      s->save_alphaSize   = 0;
145
1.48k
      s->save_nGroups     = 0;
146
1.48k
      s->save_nSelectors  = 0;
147
1.48k
      s->save_EOB         = 0;
148
1.48k
      s->save_groupNo     = 0;
149
1.48k
      s->save_groupPos    = 0;
150
1.48k
      s->save_nextSym     = 0;
151
1.48k
      s->save_nblockMAX   = 0;
152
1.48k
      s->save_nblock      = 0;
153
1.48k
      s->save_es          = 0;
154
1.48k
      s->save_N           = 0;
155
1.48k
      s->save_curr        = 0;
156
1.48k
      s->save_zt          = 0;
157
1.48k
      s->save_zn          = 0;
158
1.48k
      s->save_zvec        = 0;
159
1.48k
      s->save_zj          = 0;
160
1.48k
      s->save_gSel        = 0;
161
1.48k
      s->save_gMinlen     = 0;
162
1.48k
      s->save_gLimit      = NULL;
163
1.48k
      s->save_gBase       = NULL;
164
1.48k
      s->save_gPerm       = NULL;
165
1.48k
   }
166
167
   /*restore from the save area*/
168
6.14k
   i           = s->save_i;
169
6.14k
   j           = s->save_j;
170
6.14k
   t           = s->save_t;
171
6.14k
   alphaSize   = s->save_alphaSize;
172
6.14k
   nGroups     = s->save_nGroups;
173
6.14k
   nSelectors  = s->save_nSelectors;
174
6.14k
   EOB         = s->save_EOB;
175
6.14k
   groupNo     = s->save_groupNo;
176
6.14k
   groupPos    = s->save_groupPos;
177
6.14k
   nextSym     = s->save_nextSym;
178
6.14k
   nblockMAX   = s->save_nblockMAX;
179
6.14k
   nblock      = s->save_nblock;
180
6.14k
   es          = s->save_es;
181
6.14k
   N           = s->save_N;
182
6.14k
   curr        = s->save_curr;
183
6.14k
   zt          = s->save_zt;
184
6.14k
   zn          = s->save_zn; 
185
6.14k
   zvec        = s->save_zvec;
186
6.14k
   zj          = s->save_zj;
187
6.14k
   gSel        = s->save_gSel;
188
6.14k
   gMinlen     = s->save_gMinlen;
189
6.14k
   gLimit      = s->save_gLimit;
190
6.14k
   gBase       = s->save_gBase;
191
6.14k
   gPerm       = s->save_gPerm;
192
193
6.14k
   retVal = BZ_OK;
194
195
6.14k
   switch (s->state) {
196
197
1.48k
      GET_UCHAR(BZ_X_MAGIC_1, uc);
198
1.48k
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
199
200
1.48k
      GET_UCHAR(BZ_X_MAGIC_2, uc);
201
1.48k
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
202
203
1.47k
      GET_UCHAR(BZ_X_MAGIC_3, uc)
204
1.47k
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
205
206
1.47k
      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
207
1.47k
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
208
1.47k
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
209
1.47k
      s->blockSize100k -= BZ_HDR_0;
210
211
1.47k
      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
1.47k
      } else {
218
1.47k
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
219
1.47k
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
220
1.47k
      }
221
222
1.47k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
1.47k
      if (uc == 0x17) goto endhdr_2;
225
1.44k
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
226
1.43k
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
227
1.43k
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
228
1.43k
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
229
1.43k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
230
1.43k
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
231
1.43k
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
232
1.43k
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
233
1.43k
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
234
1.43k
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
235
1.42k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
236
237
1.42k
      s->currBlockNo++;
238
1.42k
      if (s->verbosity >= 2)
239
0
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
240
 
241
1.42k
      s->storedBlockCRC = 0;
242
1.42k
      GET_UCHAR(BZ_X_BCRC_1, uc);
243
1.42k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
1.42k
      GET_UCHAR(BZ_X_BCRC_2, uc);
245
1.42k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
246
1.42k
      GET_UCHAR(BZ_X_BCRC_3, uc);
247
1.42k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
248
1.42k
      GET_UCHAR(BZ_X_BCRC_4, uc);
249
1.42k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
250
251
1.42k
      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
252
253
1.42k
      s->origPtr = 0;
254
1.42k
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
255
1.42k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
1.42k
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
1.42k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
1.42k
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
1.42k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
1.42k
      if (s->origPtr < 0)
262
1.42k
         RETURN(BZ_DATA_ERROR);
263
1.42k
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
1.39k
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
23.7k
      for (i = 0; i < 16; i++) {
268
22.3k
         GET_BIT(BZ_X_MAPPING_1, uc);
269
22.3k
         if (uc == 1) 
270
4.33k
            s->inUse16[i] = True; else 
271
17.9k
            s->inUse16[i] = False;
272
22.3k
      }
273
274
357k
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
23.4k
      for (i = 0; i < 16; i++)
277
22.0k
         if (s->inUse16[i])
278
71.2k
            for (j = 0; j < 16; j++) {
279
67.0k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
67.0k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
67.0k
            }
282
1.37k
      makeMaps_d ( s );
283
1.37k
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
1.37k
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
1.37k
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
1.37k
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
1.36k
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
1.35k
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
905k
      for (i = 0; i < nSelectors; i++) {
292
904k
         j = 0;
293
1.43M
         while (True) {
294
1.43M
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
1.43M
            if (uc == 0) break;
296
532k
            j++;
297
532k
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
532k
         }
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
904k
         if (i < BZ_MAX_SELECTORS)
303
860k
           s->selectorMtf[i] = j;
304
904k
      }
305
1.30k
      if (nSelectors > BZ_MAX_SELECTORS)
306
12
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
1.30k
      {
310
1.30k
         UChar pos[BZ_N_GROUPS], tmp, v;
311
4.58k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
553k
         for (i = 0; i < nSelectors; i++) {
314
552k
            v = s->selectorMtf[i];
315
552k
            tmp = pos[v];
316
924k
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
552k
            pos[0] = tmp;
318
552k
            s->selector[i] = tmp;
319
552k
         }
320
1.30k
      }
321
322
      /*--- Now the coding tables ---*/
323
4.36k
      for (t = 0; t < nGroups; t++) {
324
3.13k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
69.4k
         for (i = 0; i < alphaSize; i++) {
326
16.4M
            while (True) {
327
16.4M
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
16.4M
               GET_BIT(BZ_X_CODING_2, uc);
329
16.4M
               if (uc == 0) break;
330
16.3M
               GET_BIT(BZ_X_CODING_3, uc);
331
16.3M
               if (uc == 0) curr++; else curr--;
332
16.3M
            }
333
66.2k
            s->len[t][i] = curr;
334
66.2k
         }
335
3.12k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
4.19k
      for (t = 0; t < nGroups; t++) {
339
2.95k
         minLen = 32;
340
2.95k
         maxLen = 0;
341
64.5k
         for (i = 0; i < alphaSize; i++) {
342
61.5k
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
61.5k
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
61.5k
         }
345
2.95k
         BZ2_hbCreateDecodeTables ( 
346
2.95k
            &(s->limit[t][0]), 
347
2.95k
            &(s->base[t][0]), 
348
2.95k
            &(s->perm[t][0]), 
349
2.95k
            &(s->len[t][0]),
350
2.95k
            minLen, maxLen, alphaSize
351
2.95k
         );
352
2.95k
         s->minLens[t] = minLen;
353
2.95k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
1.23k
      EOB      = s->nInUse+1;
358
1.23k
      nblockMAX = 100000 * s->blockSize100k;
359
1.23k
      groupNo  = -1;
360
1.23k
      groupPos = 0;
361
362
317k
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
1.23k
      {
366
1.23k
         Int32 ii, jj, kk;
367
1.23k
         kk = MTFA_SIZE-1;
368
20.9k
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
335k
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
316k
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
316k
               kk--;
372
316k
            }
373
19.7k
            s->mtfbase[ii] = kk + 1;
374
19.7k
         }
375
1.23k
      }
376
      /*-- end MTF init --*/
377
378
1.23k
      nblock = 0;
379
6.08k
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
6.42M
      while (True) {
382
383
6.42M
         if (nextSym == EOB) break;
384
385
6.42M
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
232k
            es = -1;
388
232k
            N = 1;
389
395k
            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
395k
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
395k
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
103k
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
395k
               N = N * 2;
400
1.97M
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
1.97M
            }
402
395k
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
232k
            es++;
405
232k
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
232k
            s->unzftab[uc] += es;
407
408
232k
            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
232k
            else
416
250M
               while (es > 0) {
417
250M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
250M
                  s->tt[nblock] = (UInt32)uc;
419
250M
                  nblock++;
420
250M
                  es--;
421
250M
               };
422
423
232k
            continue;
424
425
6.18M
         } else {
426
427
6.18M
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
6.18M
            {
431
6.18M
               Int32 ii, jj, kk, pp, lno, off;
432
6.18M
               UInt32 nn;
433
6.18M
               nn = (UInt32)(nextSym - 1);
434
435
6.18M
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
1.15M
                  pp = s->mtfbase[0];
438
1.15M
                  uc = s->mtfa[pp+nn];
439
2.57M
                  while (nn > 3) {
440
1.41M
                     Int32 z = pp+nn;
441
1.41M
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
1.41M
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
1.41M
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
1.41M
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
1.41M
                     nn -= 4;
446
1.41M
                  }
447
2.84M
                  while (nn > 0) { 
448
1.68M
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
1.68M
                  };
450
1.15M
                  s->mtfa[pp] = uc;
451
5.03M
               } else { 
452
                  /* general case */
453
5.03M
                  lno = nn / MTFL_SIZE;
454
5.03M
                  off = nn % MTFL_SIZE;
455
5.03M
                  pp = s->mtfbase[lno] + off;
456
5.03M
                  uc = s->mtfa[pp];
457
34.6M
                  while (pp > s->mtfbase[lno]) { 
458
29.6M
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
29.6M
                  };
460
5.03M
                  s->mtfbase[lno]++;
461
19.9M
                  while (lno > 0) {
462
14.9M
                     s->mtfbase[lno]--;
463
14.9M
                     s->mtfa[s->mtfbase[lno]] 
464
14.9M
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
14.9M
                     lno--;
466
14.9M
                  }
467
5.03M
                  s->mtfbase[0]--;
468
5.03M
                  s->mtfa[s->mtfbase[0]] = uc;
469
5.03M
                  if (s->mtfbase[0] == 0) {
470
1.29k
                     kk = MTFA_SIZE-1;
471
21.9k
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
472
351k
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
473
330k
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
474
330k
                           kk--;
475
330k
                        }
476
20.6k
                        s->mtfbase[ii] = kk + 1;
477
20.6k
                     }
478
1.29k
                  }
479
5.03M
               }
480
6.18M
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
6.18M
            s->unzftab[s->seqToUnseq[uc]]++;
484
6.18M
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
6.18M
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
6.18M
            nblock++;
488
489
6.18M
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
6.18M
            continue;
491
24.7M
         }
492
6.42M
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
975
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
962
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
247k
      for (i = 0; i <= 255; i++) {
503
246k
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
246k
            RETURN(BZ_DATA_ERROR);
505
246k
      }
506
      /* Actually generate cftab. */
507
962
      s->cftab[0] = 0;
508
247k
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
247k
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
248k
      for (i = 0; i <= 256; i++) {
512
247k
         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
247k
      }
517
      /* Check: cftab entries non-descending. */
518
247k
      for (i = 1; i <= 256; i++) {
519
246k
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
246k
      }
523
524
962
      s->state_out_len = 0;
525
962
      s->state_out_ch  = 0;
526
962
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
962
      s->state = BZ_X_OUTPUT;
528
962
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
962
      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
962
      } else {
564
565
         /*-- compute the T^(-1) vector --*/
566
243M
         for (i = 0; i < nblock; i++) {
567
243M
            uc = (UChar)(s->tt[i] & 0xff);
568
243M
            s->tt[s->cftab[uc]] |= (i << 8);
569
243M
            s->cftab[uc]++;
570
243M
         }
571
572
962
         s->tPos = s->tt[s->origPtr] >> 8;
573
962
         s->nblock_used = 0;
574
962
         if (s->blockRandomised) {
575
403
            BZ_RAND_INIT_MASK;
576
403
            BZ_GET_FAST(s->k0); s->nblock_used++;
577
403
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
578
559
         } else {
579
559
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
559
         }
581
582
962
      }
583
584
962
      RETURN(BZ_OK);
585
586
587
588
29
    endhdr_2:
589
590
29
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
28
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
27
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
26
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
594
25
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
595
24
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
596
23
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
22
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
21
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
20
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
19
      s->storedCombinedCRC = 0;
602
19
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
18
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
18
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
17
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
17
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
16
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
16
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
15
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
15
      s->state = BZ_X_IDLE;
612
15
      RETURN(BZ_STREAM_END);
613
614
0
      default: AssertH ( False, 4001 );
615
6.14k
   }
616
617
0
   AssertH ( False, 4002 );
618
619
6.14k
   save_state_and_return:
620
621
6.14k
   s->save_i           = i;
622
6.14k
   s->save_j           = j;
623
6.14k
   s->save_t           = t;
624
6.14k
   s->save_alphaSize   = alphaSize;
625
6.14k
   s->save_nGroups     = nGroups;
626
6.14k
   s->save_nSelectors  = nSelectors;
627
6.14k
   s->save_EOB         = EOB;
628
6.14k
   s->save_groupNo     = groupNo;
629
6.14k
   s->save_groupPos    = groupPos;
630
6.14k
   s->save_nextSym     = nextSym;
631
6.14k
   s->save_nblockMAX   = nblockMAX;
632
6.14k
   s->save_nblock      = nblock;
633
6.14k
   s->save_es          = es;
634
6.14k
   s->save_N           = N;
635
6.14k
   s->save_curr        = curr;
636
6.14k
   s->save_zt          = zt;
637
6.14k
   s->save_zn          = zn;
638
6.14k
   s->save_zvec        = zvec;
639
6.14k
   s->save_zj          = zj;
640
6.14k
   s->save_gSel        = gSel;
641
6.14k
   s->save_gMinlen     = gMinlen;
642
6.14k
   s->save_gLimit      = gLimit;
643
6.14k
   s->save_gBase       = gBase;
644
6.14k
   s->save_gPerm       = gPerm;
645
646
6.14k
   return retVal;   
647
0
}
648
649
650
/*-------------------------------------------------------------*/
651
/*--- end                                      decompress.c ---*/
652
/*-------------------------------------------------------------*/