Coverage Report

Created: 2025-07-18 06:28

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