Coverage Report

Created: 2026-04-29 07:01

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
886
{
29
886
   Int32 i;
30
886
   s->nInUse = 0;
31
227k
   for (i = 0; i < 256; i++)
32
226k
      if (s->inUse[i]) {
33
13.9k
         s->seqToUnseq[s->nInUse] = i;
34
13.9k
         s->nInUse++;
35
13.9k
      }
36
886
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
35.9M
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
10.3M
   case lll: s->state = lll;                      \
45
11.6M
   while (True) {                                 \
46
11.6M
      if (s->bsLive >= nnn) {                     \
47
10.3M
         UInt32 v;                                \
48
10.3M
         v = (s->bsBuff >>                        \
49
10.3M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
10.3M
         s->bsLive -= nnn;                        \
51
10.3M
         vvv = v;                                 \
52
10.3M
         break;                                   \
53
10.3M
      }                                           \
54
11.6M
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
1.32M
      s->bsBuff                                   \
56
1.32M
         = (s->bsBuff << 8) |                     \
57
1.32M
           ((UInt32)                              \
58
1.32M
              (*((UChar*)(s->strm->next_in))));   \
59
1.32M
      s->bsLive += 8;                             \
60
1.32M
      s->strm->next_in++;                         \
61
1.32M
      s->strm->avail_in--;                        \
62
1.32M
      s->strm->total_in_lo32++;                   \
63
1.32M
      if (s->strm->total_in_lo32 == 0)            \
64
1.32M
         s->strm->total_in_hi32++;                \
65
1.32M
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
17.8k
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
10.2M
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
51.7k
#define GET_MTF_VAL(label1,label2,lval)           \
75
51.7k
{                                                 \
76
51.7k
   if (groupPos == 0) {                           \
77
1.51k
      groupNo++;                                  \
78
1.51k
      if (groupNo >= nSelectors)                  \
79
1.51k
         RETURN(BZ_DATA_ERROR);                   \
80
1.48k
      groupPos = BZ_G_SIZE;                       \
81
1.48k
      gSel = s->selector[groupNo];                \
82
1.48k
      gMinlen = s->minLens[gSel];                 \
83
1.48k
      gLimit = &(s->limit[gSel][0]);              \
84
1.48k
      gPerm = &(s->perm[gSel][0]);                \
85
1.48k
      gBase = &(s->base[gSel][0]);                \
86
1.48k
   }                                              \
87
51.7k
   groupPos--;                                    \
88
51.6k
   zn = gMinlen;                                  \
89
51.6k
   GET_BITS(label1, zvec, zn);                    \
90
71.3k
   while (1) {                                    \
91
71.3k
      if (zn > 20 /* the longest code */)         \
92
71.3k
         RETURN(BZ_DATA_ERROR);                   \
93
71.2k
      if (zvec <= gLimit[zn]) break;              \
94
71.2k
      zn++;                                       \
95
19.8k
      GET_BIT(label2, zj);                        \
96
19.8k
      zvec = (zvec << 1) | zj;                    \
97
51.3k
   };                                             \
98
51.3k
   if (zvec - gBase[zn] < 0                       \
99
51.3k
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
51.3k
      RETURN(BZ_DATA_ERROR);                      \
101
51.3k
   lval = gPerm[zvec - gBase[zn]];                \
102
51.3k
}
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.11k
      s->save_i           = 0;
142
1.11k
      s->save_j           = 0;
143
1.11k
      s->save_t           = 0;
144
1.11k
      s->save_alphaSize   = 0;
145
1.11k
      s->save_nGroups     = 0;
146
1.11k
      s->save_nSelectors  = 0;
147
1.11k
      s->save_EOB         = 0;
148
1.11k
      s->save_groupNo     = 0;
149
1.11k
      s->save_groupPos    = 0;
150
1.11k
      s->save_nextSym     = 0;
151
1.11k
      s->save_nblockMAX   = 0;
152
1.11k
      s->save_nblock      = 0;
153
1.11k
      s->save_es          = 0;
154
1.11k
      s->save_N           = 0;
155
1.11k
      s->save_curr        = 0;
156
1.11k
      s->save_zt          = 0;
157
1.11k
      s->save_zn          = 0;
158
1.11k
      s->save_zvec        = 0;
159
1.11k
      s->save_zj          = 0;
160
1.11k
      s->save_gSel        = 0;
161
1.11k
      s->save_gMinlen     = 0;
162
1.11k
      s->save_gLimit      = NULL;
163
1.11k
      s->save_gBase       = NULL;
164
1.11k
      s->save_gPerm       = NULL;
165
1.11k
   }
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.11k
      GET_UCHAR(BZ_X_MAGIC_1, uc);
198
1.11k
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
199
200
1.09k
      GET_UCHAR(BZ_X_MAGIC_2, uc);
201
1.09k
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
202
203
1.09k
      GET_UCHAR(BZ_X_MAGIC_3, uc)
204
1.09k
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
205
206
1.09k
      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
207
1.09k
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
208
1.09k
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
209
1.09k
      s->blockSize100k -= BZ_HDR_0;
210
211
1.09k
      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.08k
      } else {
218
1.08k
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
219
1.08k
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
220
1.08k
      }
221
222
1.18k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
1.17k
      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.02k
      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.02k
      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.00k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
1.00k
      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
998
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
998
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
992
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
992
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
990
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
990
      if (s->origPtr < 0)
262
990
         RETURN(BZ_DATA_ERROR);
263
990
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
938
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
15.8k
      for (i = 0; i < 16; i++) {
268
14.9k
         GET_BIT(BZ_X_MAPPING_1, uc);
269
14.9k
         if (uc == 1) 
270
3.17k
            s->inUse16[i] = True; else 
271
11.7k
            s->inUse16[i] = False;
272
14.9k
      }
273
274
239k
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
15.3k
      for (i = 0; i < 16; i++)
277
14.5k
         if (s->inUse16[i])
278
49.4k
            for (j = 0; j < 16; j++) {
279
46.5k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
46.5k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
46.5k
            }
282
886
      makeMaps_d ( s );
283
886
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
882
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
882
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
882
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
866
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
852
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
317k
      for (i = 0; i < nSelectors; i++) {
292
317k
         j = 0;
293
592k
         while (True) {
294
592k
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
592k
            if (uc == 0) break;
296
275k
            j++;
297
275k
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
275k
         }
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
317k
         if (i < BZ_MAX_SELECTORS)
303
301k
           s->selectorMtf[i] = j;
304
317k
      }
305
794
      if (nSelectors > BZ_MAX_SELECTORS)
306
2
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
794
      {
310
794
         UChar pos[BZ_N_GROUPS], tmp, v;
311
2.73k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
83.9k
         for (i = 0; i < nSelectors; i++) {
314
83.1k
            v = s->selectorMtf[i];
315
83.1k
            tmp = pos[v];
316
145k
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
83.1k
            pos[0] = tmp;
318
83.1k
            s->selector[i] = tmp;
319
83.1k
         }
320
794
      }
321
322
      /*--- Now the coding tables ---*/
323
2.40k
      for (t = 0; t < nGroups; t++) {
324
1.72k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
25.1k
         for (i = 0; i < alphaSize; i++) {
326
4.81M
            while (True) {
327
4.81M
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
4.81M
               GET_BIT(BZ_X_CODING_2, uc);
329
4.81M
               if (uc == 0) break;
330
4.78M
               GET_BIT(BZ_X_CODING_3, uc);
331
4.78M
               if (uc == 0) curr++; else curr--;
332
4.78M
            }
333
23.4k
            s->len[t][i] = curr;
334
23.4k
         }
335
1.69k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
2.23k
      for (t = 0; t < nGroups; t++) {
339
1.54k
         minLen = 32;
340
1.54k
         maxLen = 0;
341
23.6k
         for (i = 0; i < alphaSize; i++) {
342
22.0k
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
22.0k
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
22.0k
         }
345
1.54k
         BZ2_hbCreateDecodeTables ( 
346
1.54k
            &(s->limit[t][0]), 
347
1.54k
            &(s->base[t][0]), 
348
1.54k
            &(s->perm[t][0]), 
349
1.54k
            &(s->len[t][0]),
350
1.54k
            minLen, maxLen, alphaSize
351
1.54k
         );
352
1.54k
         s->minLens[t] = minLen;
353
1.54k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
688
      EOB      = s->nInUse+1;
358
688
      nblockMAX = 100000 * s->blockSize100k;
359
688
      groupNo  = -1;
360
688
      groupPos = 0;
361
362
176k
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
688
      {
366
688
         Int32 ii, jj, kk;
367
688
         kk = MTFA_SIZE-1;
368
11.6k
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
187k
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
176k
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
176k
               kk--;
372
176k
            }
373
11.0k
            s->mtfbase[ii] = kk + 1;
374
11.0k
         }
375
688
      }
376
      /*-- end MTF init --*/
377
378
688
      nblock = 0;
379
3.27k
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
38.0k
      while (True) {
382
383
38.0k
         if (nextSym == EOB) break;
384
385
37.7k
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
8.63k
            es = -1;
388
8.63k
            N = 1;
389
21.9k
            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
21.9k
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
21.9k
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
6.11k
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
21.9k
               N = N * 2;
400
109k
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
109k
            }
402
21.8k
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
8.51k
            es++;
405
8.51k
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
8.51k
            s->unzftab[uc] += es;
407
408
8.51k
            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
8.51k
            else
416
29.2M
               while (es > 0) {
417
29.2M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
29.2M
                  s->tt[nblock] = (UInt32)uc;
419
29.2M
                  nblock++;
420
29.2M
                  es--;
421
29.2M
               };
422
423
8.51k
            continue;
424
425
29.0k
         } else {
426
427
29.0k
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
29.0k
            {
431
29.0k
               Int32 ii, jj, kk, pp, lno, off;
432
29.0k
               UInt32 nn;
433
29.0k
               nn = (UInt32)(nextSym - 1);
434
435
29.0k
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
25.5k
                  pp = s->mtfbase[0];
438
25.5k
                  uc = s->mtfa[pp+nn];
439
48.9k
                  while (nn > 3) {
440
23.4k
                     Int32 z = pp+nn;
441
23.4k
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
23.4k
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
23.4k
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
23.4k
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
23.4k
                     nn -= 4;
446
23.4k
                  }
447
62.6k
                  while (nn > 0) { 
448
37.0k
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
37.0k
                  };
450
25.5k
                  s->mtfa[pp] = uc;
451
25.5k
               } else { 
452
                  /* general case */
453
3.53k
                  lno = nn / MTFL_SIZE;
454
3.53k
                  off = nn % MTFL_SIZE;
455
3.53k
                  pp = s->mtfbase[lno] + off;
456
3.53k
                  uc = s->mtfa[pp];
457
24.3k
                  while (pp > s->mtfbase[lno]) { 
458
20.8k
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
20.8k
                  };
460
3.53k
                  s->mtfbase[lno]++;
461
7.62k
                  while (lno > 0) {
462
4.09k
                     s->mtfbase[lno]--;
463
4.09k
                     s->mtfa[s->mtfbase[lno]] 
464
4.09k
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
4.09k
                     lno--;
466
4.09k
                  }
467
3.53k
                  s->mtfbase[0]--;
468
3.53k
                  s->mtfa[s->mtfbase[0]] = uc;
469
3.53k
                  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
3.53k
               }
480
29.0k
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
29.0k
            s->unzftab[s->seqToUnseq[uc]]++;
484
29.0k
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
29.0k
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
29.0k
            nblock++;
488
489
29.0k
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
28.9k
            continue;
491
116k
         }
492
37.7k
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
352
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
338
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
86.8k
      for (i = 0; i <= 255; i++) {
503
86.5k
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
86.5k
            RETURN(BZ_DATA_ERROR);
505
86.5k
      }
506
      /* Actually generate cftab. */
507
338
      s->cftab[0] = 0;
508
86.8k
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
86.8k
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
87.2k
      for (i = 0; i <= 256; i++) {
512
86.8k
         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
86.8k
      }
517
      /* Check: cftab entries non-descending. */
518
86.8k
      for (i = 1; i <= 256; i++) {
519
86.5k
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
86.5k
      }
523
524
338
      s->state_out_len = 0;
525
338
      s->state_out_ch  = 0;
526
338
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
338
      s->state = BZ_X_OUTPUT;
528
338
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
338
      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
338
      } else {
564
565
         /*-- compute the T^(-1) vector --*/
566
23.7M
         for (i = 0; i < nblock; i++) {
567
23.7M
            uc = (UChar)(s->tt[i] & 0xff);
568
23.7M
            s->tt[s->cftab[uc]] |= (i << 8);
569
23.7M
            s->cftab[uc]++;
570
23.7M
         }
571
572
338
         s->tPos = s->tt[s->origPtr] >> 8;
573
338
         s->nblock_used = 0;
574
338
         if (s->blockRandomised) {
575
114
            BZ_RAND_INIT_MASK;
576
114
            BZ_GET_FAST(s->k0); s->nblock_used++;
577
114
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
578
224
         } else {
579
224
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
224
         }
581
582
338
      }
583
584
338
      RETURN(BZ_OK);
585
586
587
588
146
    endhdr_2:
589
590
146
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
144
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
142
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
142
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
594
140
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
595
140
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
596
136
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
136
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
134
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
128
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
124
      s->storedCombinedCRC = 0;
602
124
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
122
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
122
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
120
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
120
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
120
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
120
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
118
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
118
      s->state = BZ_X_IDLE;
612
118
      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
/*-------------------------------------------------------------*/