Coverage Report

Created: 2026-09-06 07:31

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