Coverage Report

Created: 2026-01-20 07:37

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