Coverage Report

Created: 2026-05-24 07:45

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