Coverage Report

Created: 2026-10-08 07:13

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