Coverage Report

Created: 2026-06-16 07:20

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