Coverage Report

Created: 2025-11-15 06:52

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