Coverage Report

Created: 2026-07-14 07:09

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