Coverage Report

Created: 2026-10-28 07:26

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