Coverage Report

Created: 2025-03-15 06:58

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