Coverage Report

Created: 2026-07-10 07:15

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