Coverage Report

Created: 2026-09-14 07:37

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