Coverage Report

Created: 2026-05-24 06:14

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