Coverage Report

Created: 2026-10-28 06:38

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