Coverage Report

Created: 2026-06-30 06:04

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