Coverage Report

Created: 2025-12-31 07:53

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