Coverage Report

Created: 2026-04-01 07:49

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