Coverage Report

Created: 2025-06-04 06:23

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