Coverage Report

Created: 2025-08-11 08:01

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