Coverage Report

Created: 2026-03-12 06:35

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