Coverage Report

Created: 2025-11-16 07:22

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.42k
{
29
1.42k
   Int32 i;
30
1.42k
   s->nInUse = 0;
31
367k
   for (i = 0; i < 256; i++)
32
365k
      if (s->inUse[i]) {
33
18.7k
         s->seqToUnseq[s->nInUse] = i;
34
18.7k
         s->nInUse++;
35
18.7k
      }
36
1.42k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
302M
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
34.1M
   case lll: s->state = lll;                      \
45
39.9M
   while (True) {                                 \
46
39.9M
      if (s->bsLive >= nnn) {                     \
47
34.1M
         UInt32 v;                                \
48
34.1M
         v = (s->bsBuff >>                        \
49
34.1M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
34.1M
         s->bsLive -= nnn;                        \
51
34.1M
         vvv = v;                                 \
52
34.1M
         break;                                   \
53
34.1M
      }                                           \
54
39.9M
      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.4k
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
27.4M
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
6.64M
#define GET_MTF_VAL(label1,label2,lval)           \
75
6.64M
{                                                 \
76
6.64M
   if (groupPos == 0) {                           \
77
133k
      groupNo++;                                  \
78
133k
      if (groupNo >= nSelectors)                  \
79
133k
         RETURN(BZ_DATA_ERROR);                   \
80
133k
      groupPos = BZ_G_SIZE;                       \
81
133k
      gSel = s->selector[groupNo];                \
82
133k
      gMinlen = s->minLens[gSel];                 \
83
133k
      gLimit = &(s->limit[gSel][0]);              \
84
133k
      gPerm = &(s->perm[gSel][0]);                \
85
133k
      gBase = &(s->base[gSel][0]);                \
86
133k
   }                                              \
87
6.64M
   groupPos--;                                    \
88
6.64M
   zn = gMinlen;                                  \
89
6.64M
   GET_BITS(label1, zvec, zn);                    \
90
6.87M
   while (1) {                                    \
91
6.87M
      if (zn > 20 /* the longest code */)         \
92
6.87M
         RETURN(BZ_DATA_ERROR);                   \
93
6.87M
      if (zvec <= gLimit[zn]) break;              \
94
6.87M
      zn++;                                       \
95
233k
      GET_BIT(label2, zj);                        \
96
233k
      zvec = (zvec << 1) | zj;                    \
97
6.64M
   };                                             \
98
6.64M
   if (zvec - gBase[zn] < 0                       \
99
6.64M
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
6.64M
      RETURN(BZ_DATA_ERROR);                      \
101
6.64M
   lval = gPerm[zvec - gBase[zn]];                \
102
6.64M
}
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.57k
      s->save_i           = 0;
142
1.57k
      s->save_j           = 0;
143
1.57k
      s->save_t           = 0;
144
1.57k
      s->save_alphaSize   = 0;
145
1.57k
      s->save_nGroups     = 0;
146
1.57k
      s->save_nSelectors  = 0;
147
1.57k
      s->save_EOB         = 0;
148
1.57k
      s->save_groupNo     = 0;
149
1.57k
      s->save_groupPos    = 0;
150
1.57k
      s->save_nextSym     = 0;
151
1.57k
      s->save_nblockMAX   = 0;
152
1.57k
      s->save_nblock      = 0;
153
1.57k
      s->save_es          = 0;
154
1.57k
      s->save_N           = 0;
155
1.57k
      s->save_curr        = 0;
156
1.57k
      s->save_zt          = 0;
157
1.57k
      s->save_zn          = 0;
158
1.57k
      s->save_zvec        = 0;
159
1.57k
      s->save_zj          = 0;
160
1.57k
      s->save_gSel        = 0;
161
1.57k
      s->save_gMinlen     = 0;
162
1.57k
      s->save_gLimit      = NULL;
163
1.57k
      s->save_gBase       = NULL;
164
1.57k
      s->save_gPerm       = NULL;
165
1.57k
   }
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.57k
      GET_UCHAR(BZ_X_MAGIC_1, uc);
198
1.57k
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
199
200
1.57k
      GET_UCHAR(BZ_X_MAGIC_2, uc);
201
1.57k
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
202
203
1.56k
      GET_UCHAR(BZ_X_MAGIC_3, uc)
204
1.56k
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
205
206
1.56k
      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
207
1.56k
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
208
1.56k
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
209
1.55k
      s->blockSize100k -= BZ_HDR_0;
210
211
1.55k
      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.55k
      } else {
218
1.55k
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
219
1.55k
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
220
1.55k
      }
221
222
1.55k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
1.55k
      if (uc == 0x17) goto endhdr_2;
225
1.51k
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
226
1.50k
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
227
1.50k
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
228
1.50k
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
229
1.50k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
230
1.50k
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
231
1.50k
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
232
1.49k
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
233
1.49k
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
234
1.49k
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
235
1.49k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
236
237
1.48k
      s->currBlockNo++;
238
1.48k
      if (s->verbosity >= 2)
239
0
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
240
 
241
1.48k
      s->storedBlockCRC = 0;
242
1.48k
      GET_UCHAR(BZ_X_BCRC_1, uc);
243
1.48k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
1.48k
      GET_UCHAR(BZ_X_BCRC_2, uc);
245
1.48k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
246
1.48k
      GET_UCHAR(BZ_X_BCRC_3, uc);
247
1.48k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
248
1.48k
      GET_UCHAR(BZ_X_BCRC_4, uc);
249
1.48k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
250
251
1.48k
      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
252
253
1.48k
      s->origPtr = 0;
254
1.48k
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
255
1.48k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
1.48k
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
1.48k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
1.48k
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
1.48k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
1.48k
      if (s->origPtr < 0)
262
1.48k
         RETURN(BZ_DATA_ERROR);
263
1.48k
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
1.45k
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
24.7k
      for (i = 0; i < 16; i++) {
268
23.2k
         GET_BIT(BZ_X_MAPPING_1, uc);
269
23.2k
         if (uc == 1) 
270
4.59k
            s->inUse16[i] = True; else 
271
18.6k
            s->inUse16[i] = False;
272
23.2k
      }
273
274
372k
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
24.4k
      for (i = 0; i < 16; i++)
277
22.9k
         if (s->inUse16[i])
278
75.5k
            for (j = 0; j < 16; j++) {
279
71.1k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
71.1k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
71.1k
            }
282
1.42k
      makeMaps_d ( s );
283
1.42k
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
1.42k
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
1.42k
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
1.42k
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
1.42k
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
1.41k
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
901k
      for (i = 0; i < nSelectors; i++) {
292
899k
         j = 0;
293
1.44M
         while (True) {
294
1.44M
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
1.44M
            if (uc == 0) break;
296
540k
            j++;
297
540k
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
540k
         }
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
899k
         if (i < BZ_MAX_SELECTORS)
303
854k
           s->selectorMtf[i] = j;
304
899k
      }
305
1.36k
      if (nSelectors > BZ_MAX_SELECTORS)
306
13
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
1.36k
      {
310
1.36k
         UChar pos[BZ_N_GROUPS], tmp, v;
311
4.83k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
539k
         for (i = 0; i < nSelectors; i++) {
314
538k
            v = s->selectorMtf[i];
315
538k
            tmp = pos[v];
316
913k
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
538k
            pos[0] = tmp;
318
538k
            s->selector[i] = tmp;
319
538k
         }
320
1.36k
      }
321
322
      /*--- Now the coding tables ---*/
323
4.61k
      for (t = 0; t < nGroups; t++) {
324
3.32k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
72.5k
         for (i = 0; i < alphaSize; i++) {
326
12.8M
            while (True) {
327
12.8M
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
12.8M
               GET_BIT(BZ_X_CODING_2, uc);
329
12.8M
               if (uc == 0) break;
330
12.8M
               GET_BIT(BZ_X_CODING_3, uc);
331
12.8M
               if (uc == 0) curr++; else curr--;
332
12.8M
            }
333
69.2k
            s->len[t][i] = curr;
334
69.2k
         }
335
3.31k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
4.44k
      for (t = 0; t < nGroups; t++) {
339
3.14k
         minLen = 32;
340
3.14k
         maxLen = 0;
341
67.5k
         for (i = 0; i < alphaSize; i++) {
342
64.4k
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
64.4k
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
64.4k
         }
345
3.14k
         BZ2_hbCreateDecodeTables ( 
346
3.14k
            &(s->limit[t][0]), 
347
3.14k
            &(s->base[t][0]), 
348
3.14k
            &(s->perm[t][0]), 
349
3.14k
            &(s->len[t][0]),
350
3.14k
            minLen, maxLen, alphaSize
351
3.14k
         );
352
3.14k
         s->minLens[t] = minLen;
353
3.14k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
1.29k
      EOB      = s->nInUse+1;
358
1.29k
      nblockMAX = 100000 * s->blockSize100k;
359
1.29k
      groupNo  = -1;
360
1.29k
      groupPos = 0;
361
362
333k
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
1.29k
      {
366
1.29k
         Int32 ii, jj, kk;
367
1.29k
         kk = MTFA_SIZE-1;
368
22.0k
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
353k
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
332k
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
332k
               kk--;
372
332k
            }
373
20.7k
            s->mtfbase[ii] = kk + 1;
374
20.7k
         }
375
1.29k
      }
376
      /*-- end MTF init --*/
377
378
1.29k
      nblock = 0;
379
6.38k
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
6.47M
      while (True) {
382
383
6.47M
         if (nextSym == EOB) break;
384
385
6.46M
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
216k
            es = -1;
388
216k
            N = 1;
389
387k
            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
387k
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
387k
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
101k
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
387k
               N = N * 2;
400
1.93M
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
1.93M
            }
402
387k
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
216k
            es++;
405
216k
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
216k
            s->unzftab[uc] += es;
407
408
216k
            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
216k
            else
416
262M
               while (es > 0) {
417
262M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
262M
                  s->tt[nblock] = (UInt32)uc;
419
262M
                  nblock++;
420
262M
                  es--;
421
262M
               };
422
423
216k
            continue;
424
425
6.25M
         } else {
426
427
6.25M
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
6.25M
            {
431
6.25M
               Int32 ii, jj, kk, pp, lno, off;
432
6.25M
               UInt32 nn;
433
6.25M
               nn = (UInt32)(nextSym - 1);
434
435
6.25M
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
1.04M
                  pp = s->mtfbase[0];
438
1.04M
                  uc = s->mtfa[pp+nn];
439
2.28M
                  while (nn > 3) {
440
1.24M
                     Int32 z = pp+nn;
441
1.24M
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
1.24M
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
1.24M
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
1.24M
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
1.24M
                     nn -= 4;
446
1.24M
                  }
447
2.51M
                  while (nn > 0) { 
448
1.47M
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
1.47M
                  };
450
1.04M
                  s->mtfa[pp] = uc;
451
5.21M
               } else { 
452
                  /* general case */
453
5.21M
                  lno = nn / MTFL_SIZE;
454
5.21M
                  off = nn % MTFL_SIZE;
455
5.21M
                  pp = s->mtfbase[lno] + off;
456
5.21M
                  uc = s->mtfa[pp];
457
34.5M
                  while (pp > s->mtfbase[lno]) { 
458
29.3M
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
29.3M
                  };
460
5.21M
                  s->mtfbase[lno]++;
461
20.9M
                  while (lno > 0) {
462
15.7M
                     s->mtfbase[lno]--;
463
15.7M
                     s->mtfa[s->mtfbase[lno]] 
464
15.7M
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
15.7M
                     lno--;
466
15.7M
                  }
467
5.21M
                  s->mtfbase[0]--;
468
5.21M
                  s->mtfa[s->mtfbase[0]] = uc;
469
5.21M
                  if (s->mtfbase[0] == 0) {
470
1.34k
                     kk = MTFA_SIZE-1;
471
22.7k
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
472
364k
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
473
343k
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
474
343k
                           kk--;
475
343k
                        }
476
21.4k
                        s->mtfbase[ii] = kk + 1;
477
21.4k
                     }
478
1.34k
                  }
479
5.21M
               }
480
6.25M
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
6.25M
            s->unzftab[s->seqToUnseq[uc]]++;
484
6.25M
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
6.25M
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
6.25M
            nblock++;
488
489
6.25M
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
6.25M
            continue;
491
25.0M
         }
492
6.46M
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
1.04k
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
1.01k
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
261k
      for (i = 0; i <= 255; i++) {
503
260k
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
260k
            RETURN(BZ_DATA_ERROR);
505
260k
      }
506
      /* Actually generate cftab. */
507
1.01k
      s->cftab[0] = 0;
508
261k
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
261k
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
262k
      for (i = 0; i <= 256; i++) {
512
261k
         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
261k
      }
517
      /* Check: cftab entries non-descending. */
518
261k
      for (i = 1; i <= 256; i++) {
519
260k
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
260k
      }
523
524
1.01k
      s->state_out_len = 0;
525
1.01k
      s->state_out_ch  = 0;
526
1.01k
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
1.01k
      s->state = BZ_X_OUTPUT;
528
1.01k
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
1.01k
      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.01k
      } else {
564
565
         /*-- compute the T^(-1) vector --*/
566
256M
         for (i = 0; i < nblock; i++) {
567
256M
            uc = (UChar)(s->tt[i] & 0xff);
568
256M
            s->tt[s->cftab[uc]] |= (i << 8);
569
256M
            s->cftab[uc]++;
570
256M
         }
571
572
1.01k
         s->tPos = s->tt[s->origPtr] >> 8;
573
1.01k
         s->nblock_used = 0;
574
1.01k
         if (s->blockRandomised) {
575
422
            BZ_RAND_INIT_MASK;
576
422
            BZ_GET_FAST(s->k0); s->nblock_used++;
577
422
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
578
597
         } else {
579
597
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
597
         }
581
582
1.01k
      }
583
584
1.01k
      RETURN(BZ_OK);
585
586
587
588
43
    endhdr_2:
589
590
43
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
42
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
38
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
37
      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
34
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
33
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
32
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
31
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
30
      s->storedCombinedCRC = 0;
602
30
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
29
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
29
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
28
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
28
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
27
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
27
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
26
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
26
      s->state = BZ_X_IDLE;
612
26
      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
/*-------------------------------------------------------------*/