Coverage Report

Created: 2026-07-30 06:52

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