Coverage Report

Created: 2026-08-31 06:59

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