Coverage Report

Created: 2025-07-11 07:02

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