Coverage Report

Created: 2026-10-13 06:09

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