Coverage Report

Created: 2026-10-17 06:25

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