Coverage Report

Created: 2026-06-30 06:05

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
50.6k
         s->seqToUnseq[s->nInUse] = i;
34
50.6k
         s->nInUse++;
35
50.6k
      }
36
1.01k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
1.71M
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
1.04M
   case lll: s->state = lll;                      \
45
1.25M
   while (True) {                                 \
46
1.25M
      if (s->bsLive >= nnn) {                     \
47
1.04M
         UInt32 v;                                \
48
1.04M
         v = (s->bsBuff >>                        \
49
1.04M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
1.04M
         s->bsLive -= nnn;                        \
51
1.04M
         vvv = v;                                 \
52
1.04M
         break;                                   \
53
1.04M
      }                                           \
54
1.25M
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
208k
      s->bsBuff                                   \
56
208k
         = (s->bsBuff << 8) |                     \
57
208k
           ((UInt32)                              \
58
208k
              (*((UChar*)(s->strm->next_in))));   \
59
208k
      s->bsLive += 8;                             \
60
208k
      s->strm->next_in++;                         \
61
208k
      s->strm->avail_in--;                        \
62
208k
      s->strm->total_in_lo32++;                   \
63
208k
      if (s->strm->total_in_lo32 == 0)            \
64
208k
         s->strm->total_in_hi32++;                \
65
208k
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
26.4k
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
849k
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
163k
#define GET_MTF_VAL(label1,label2,lval)           \
75
163k
{                                                 \
76
163k
   if (groupPos == 0) {                           \
77
3.90k
      groupNo++;                                  \
78
3.90k
      if (groupNo >= nSelectors)                  \
79
3.90k
         RETURN(BZ_DATA_ERROR);                   \
80
3.90k
      groupPos = BZ_G_SIZE;                       \
81
3.90k
      gSel = s->selector[groupNo];                \
82
3.90k
      gMinlen = s->minLens[gSel];                 \
83
3.90k
      gLimit = &(s->limit[gSel][0]);              \
84
3.90k
      gPerm = &(s->perm[gSel][0]);                \
85
3.90k
      gBase = &(s->base[gSel][0]);                \
86
3.90k
   }                                              \
87
163k
   groupPos--;                                    \
88
163k
   zn = gMinlen;                                  \
89
163k
   GET_BITS(label1, zvec, zn);                    \
90
543k
   while (1) {                                    \
91
543k
      if (zn > 20 /* the longest code */)         \
92
543k
         RETURN(BZ_DATA_ERROR);                   \
93
543k
      if (zvec <= gLimit[zn]) break;              \
94
543k
      zn++;                                       \
95
380k
      GET_BIT(label2, zj);                        \
96
380k
      zvec = (zvec << 1) | zj;                    \
97
380k
   };                                             \
98
163k
   if (zvec - gBase[zn] < 0                       \
99
163k
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
163k
      RETURN(BZ_DATA_ERROR);                      \
101
163k
   lval = gPerm[zvec - gBase[zn]];                \
102
163k
}
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.09k
            s->inUse16[i] = True; else 
271
8.20k
            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
137k
            for (j = 0; j < 16; j++) {
279
129k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
129k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
129k
            }
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.92k
      for (i = 0; i < nSelectors; i++) {
292
3.90k
         j = 0;
293
7.86k
         while (True) {
294
7.86k
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
7.86k
            if (uc == 0) break;
296
3.95k
            j++;
297
3.95k
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
3.95k
         }
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.90k
         if (i < BZ_MAX_SELECTORS)
303
3.90k
           s->selectorMtf[i] = j;
304
3.90k
      }
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.37k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
4.92k
         for (i = 0; i < nSelectors; i++) {
314
3.90k
            v = s->selectorMtf[i];
315
3.90k
            tmp = pos[v];
316
7.86k
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
3.90k
            pos[0] = tmp;
318
3.90k
            s->selector[i] = tmp;
319
3.90k
         }
320
1.01k
      }
321
322
      /*--- Now the coding tables ---*/
323
3.37k
      for (t = 0; t < nGroups; t++) {
324
2.35k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
171k
         for (i = 0; i < alphaSize; i++) {
326
242k
            while (True) {
327
242k
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
242k
               GET_BIT(BZ_X_CODING_2, uc);
329
242k
               if (uc == 0) break;
330
73.0k
               GET_BIT(BZ_X_CODING_3, uc);
331
73.0k
               if (uc == 0) curr++; else curr--;
332
73.0k
            }
333
169k
            s->len[t][i] = curr;
334
169k
         }
335
2.35k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
3.37k
      for (t = 0; t < nGroups; t++) {
339
2.35k
         minLen = 32;
340
2.35k
         maxLen = 0;
341
171k
         for (i = 0; i < alphaSize; i++) {
342
169k
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
169k
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
169k
         }
345
2.35k
         BZ2_hbCreateDecodeTables ( 
346
2.35k
            &(s->limit[t][0]), 
347
2.35k
            &(s->base[t][0]), 
348
2.35k
            &(s->perm[t][0]), 
349
2.35k
            &(s->len[t][0]),
350
2.35k
            minLen, maxLen, alphaSize
351
2.35k
         );
352
2.35k
         s->minLens[t] = minLen;
353
2.35k
      }
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
156k
      while (True) {
382
383
156k
         if (nextSym == EOB) break;
384
385
155k
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
25.8k
            es = -1;
388
25.8k
            N = 1;
389
32.8k
            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
32.8k
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
32.8k
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
4.84k
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
32.8k
               N = N * 2;
400
164k
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
164k
            }
402
32.8k
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
25.8k
            es++;
405
25.8k
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
25.8k
            s->unzftab[uc] += es;
407
408
25.8k
            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
25.8k
            else
416
129k
               while (es > 0) {
417
103k
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
103k
                  s->tt[nblock] = (UInt32)uc;
419
103k
                  nblock++;
420
103k
                  es--;
421
103k
               };
422
423
25.8k
            continue;
424
425
129k
         } else {
426
427
129k
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
129k
            {
431
129k
               Int32 ii, jj, kk, pp, lno, off;
432
129k
               UInt32 nn;
433
129k
               nn = (UInt32)(nextSym - 1);
434
435
129k
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
31.4k
                  pp = s->mtfbase[0];
438
31.4k
                  uc = s->mtfa[pp+nn];
439
55.0k
                  while (nn > 3) {
440
23.6k
                     Int32 z = pp+nn;
441
23.6k
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
23.6k
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
23.6k
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
23.6k
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
23.6k
                     nn -= 4;
446
23.6k
                  }
447
76.7k
                  while (nn > 0) { 
448
45.3k
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
45.3k
                  };
450
31.4k
                  s->mtfa[pp] = uc;
451
98.1k
               } else { 
452
                  /* general case */
453
98.1k
                  lno = nn / MTFL_SIZE;
454
98.1k
                  off = nn % MTFL_SIZE;
455
98.1k
                  pp = s->mtfbase[lno] + off;
456
98.1k
                  uc = s->mtfa[pp];
457
826k
                  while (pp > s->mtfbase[lno]) { 
458
728k
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
728k
                  };
460
98.1k
                  s->mtfbase[lno]++;
461
773k
                  while (lno > 0) {
462
675k
                     s->mtfbase[lno]--;
463
675k
                     s->mtfa[s->mtfbase[lno]] 
464
675k
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
675k
                     lno--;
466
675k
                  }
467
98.1k
                  s->mtfbase[0]--;
468
98.1k
                  s->mtfa[s->mtfbase[0]] = uc;
469
98.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
98.1k
               }
480
129k
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
129k
            s->unzftab[s->seqToUnseq[uc]]++;
484
129k
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
129k
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
129k
            nblock++;
488
489
129k
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
129k
            continue;
491
518k
         }
492
155k
      }
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
234k
         for (i = 0; i < nblock; i++) {
567
233k
            uc = (UChar)(s->tt[i] & 0xff);
568
233k
            s->tt[s->cftab[uc]] |= (i << 8);
569
233k
            s->cftab[uc]++;
570
233k
         }
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
/*-------------------------------------------------------------*/