Coverage Report

Created: 2026-11-12 06:35

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