Coverage Report

Created: 2026-07-16 07:04

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