Coverage Report

Created: 2026-06-10 06:36

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