Coverage Report

Created: 2025-09-13 06:41

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