Coverage Report

Created: 2026-06-15 07:03

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