Coverage Report

Created: 2026-05-16 06:53

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