Coverage Report

Created: 2025-11-16 06:58

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