Coverage Report

Created: 2025-11-09 06:28

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