Coverage Report

Created: 2026-09-14 06:43

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