Coverage Report

Created: 2025-12-14 06:19

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