Coverage Report

Created: 2025-07-23 08:18

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