Coverage Report

Created: 2025-06-22 08:04

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