Coverage Report

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