Coverage Report

Created: 2026-02-09 06:05

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