Coverage Report

Created: 2025-07-23 06:08

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