Coverage Report

Created: 2026-09-03 06:44

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.99k
{
29
1.99k
   Int32 i;
30
1.99k
   s->nInUse = 0;
31
512k
   for (i = 0; i < 256; i++)
32
510k
      if (s->inUse[i]) {
33
41.5k
         s->seqToUnseq[s->nInUse] = i;
34
41.5k
         s->nInUse++;
35
41.5k
      }
36
1.99k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
72.7M
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
14.4M
   case lll: s->state = lll;                      \
45
19.1M
   while (True) {                                 \
46
19.1M
      if (s->bsLive >= nnn) {                     \
47
14.4M
         UInt32 v;                                \
48
14.4M
         v = (s->bsBuff >>                        \
49
14.4M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
14.4M
         s->bsLive -= nnn;                        \
51
14.4M
         vvv = v;                                 \
52
14.4M
         break;                                   \
53
14.4M
      }                                           \
54
19.1M
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
4.71M
      s->bsBuff                                   \
56
4.71M
         = (s->bsBuff << 8) |                     \
57
4.71M
           ((UInt32)                              \
58
4.71M
              (*((UChar*)(s->strm->next_in))));   \
59
4.71M
      s->bsLive += 8;                             \
60
4.71M
      s->strm->next_in++;                         \
61
4.71M
      s->strm->avail_in--;                        \
62
4.71M
      s->strm->total_in_lo32++;                   \
63
4.71M
      if (s->strm->total_in_lo32 == 0)            \
64
4.71M
         s->strm->total_in_hi32++;                \
65
4.71M
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
45.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.29M
#define GET_MTF_VAL(label1,label2,lval)           \
75
6.29M
{                                                 \
76
6.29M
   if (groupPos == 0) {                           \
77
127k
      groupNo++;                                  \
78
127k
      if (groupNo >= nSelectors)                  \
79
127k
         RETURN(BZ_DATA_ERROR);                   \
80
127k
      groupPos = BZ_G_SIZE;                       \
81
127k
      gSel = s->selector[groupNo];                \
82
127k
      gMinlen = s->minLens[gSel];                 \
83
127k
      gLimit = &(s->limit[gSel][0]);              \
84
127k
      gPerm = &(s->perm[gSel][0]);                \
85
127k
      gBase = &(s->base[gSel][0]);                \
86
127k
   }                                              \
87
6.29M
   groupPos--;                                    \
88
6.29M
   zn = gMinlen;                                  \
89
6.29M
   GET_BITS(label1, zvec, zn);                    \
90
8.36M
   while (1) {                                    \
91
8.36M
      if (zn > 20 /* the longest code */)         \
92
8.36M
         RETURN(BZ_DATA_ERROR);                   \
93
8.36M
      if (zvec <= gLimit[zn]) break;              \
94
8.36M
      zn++;                                       \
95
2.07M
      GET_BIT(label2, zj);                        \
96
2.07M
      zvec = (zvec << 1) | zj;                    \
97
6.29M
   };                                             \
98
6.29M
   if (zvec - gBase[zn] < 0                       \
99
6.29M
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
6.29M
      RETURN(BZ_DATA_ERROR);                      \
101
6.29M
   lval = gPerm[zvec - gBase[zn]];                \
102
6.29M
}
103
104
105
/*---------------------------------------------------*/
106
Int32 BZ2_decompress ( DState* s )
107
3.95k
{
108
3.95k
   UChar      uc;
109
3.95k
   Int32      retVal;
110
3.95k
   Int32      minLen, maxLen;
111
3.95k
   bz_stream* strm = s->strm;
112
113
   /* stuff that needs to be saved/restored */
114
3.95k
   Int32  i;
115
3.95k
   Int32  j;
116
3.95k
   Int32  t;
117
3.95k
   Int32  alphaSize;
118
3.95k
   Int32  nGroups;
119
3.95k
   Int32  nSelectors;
120
3.95k
   Int32  EOB;
121
3.95k
   Int32  groupNo;
122
3.95k
   Int32  groupPos;
123
3.95k
   Int32  nextSym;
124
3.95k
   Int32  nblockMAX;
125
3.95k
   Int32  nblock;
126
3.95k
   Int32  es;
127
3.95k
   Int32  N;
128
3.95k
   Int32  curr;
129
3.95k
   Int32  zt;
130
3.95k
   Int32  zn; 
131
3.95k
   Int32  zvec;
132
3.95k
   Int32  zj;
133
3.95k
   Int32  gSel;
134
3.95k
   Int32  gMinlen;
135
3.95k
   Int32* gLimit;
136
3.95k
   Int32* gBase;
137
3.95k
   Int32* gPerm;
138
139
3.95k
   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.95k
   i           = s->save_i;
169
3.95k
   j           = s->save_j;
170
3.95k
   t           = s->save_t;
171
3.95k
   alphaSize   = s->save_alphaSize;
172
3.95k
   nGroups     = s->save_nGroups;
173
3.95k
   nSelectors  = s->save_nSelectors;
174
3.95k
   EOB         = s->save_EOB;
175
3.95k
   groupNo     = s->save_groupNo;
176
3.95k
   groupPos    = s->save_groupPos;
177
3.95k
   nextSym     = s->save_nextSym;
178
3.95k
   nblockMAX   = s->save_nblockMAX;
179
3.95k
   nblock      = s->save_nblock;
180
3.95k
   es          = s->save_es;
181
3.95k
   N           = s->save_N;
182
3.95k
   curr        = s->save_curr;
183
3.95k
   zt          = s->save_zt;
184
3.95k
   zn          = s->save_zn; 
185
3.95k
   zvec        = s->save_zvec;
186
3.95k
   zj          = s->save_zj;
187
3.95k
   gSel        = s->save_gSel;
188
3.95k
   gMinlen     = s->save_gMinlen;
189
3.95k
   gLimit      = s->save_gLimit;
190
3.95k
   gBase       = s->save_gBase;
191
3.95k
   gPerm       = s->save_gPerm;
192
193
3.95k
   retVal = BZ_OK;
194
195
3.95k
   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.32k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
3.32k
      if (uc == 0x17) goto endhdr_2;
225
2.19k
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
226
2.19k
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
227
2.19k
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
228
2.19k
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
229
2.19k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
230
2.19k
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
231
2.19k
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
232
2.36k
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
233
2.02k
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
234
2.02k
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
235
2.02k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
236
237
2.02k
      s->currBlockNo++;
238
2.02k
      if (s->verbosity >= 2)
239
0
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
240
 
241
2.02k
      s->storedBlockCRC = 0;
242
2.02k
      GET_UCHAR(BZ_X_BCRC_1, uc);
243
2.02k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
2.02k
      GET_UCHAR(BZ_X_BCRC_2, uc);
245
2.02k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
246
2.02k
      GET_UCHAR(BZ_X_BCRC_3, uc);
247
2.02k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
248
2.02k
      GET_UCHAR(BZ_X_BCRC_4, uc);
249
2.02k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
250
251
2.02k
      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
252
253
2.02k
      s->origPtr = 0;
254
2.02k
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
255
2.02k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
2.02k
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
2.02k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
2.02k
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
2.02k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
2.02k
      if (s->origPtr < 0)
262
2.02k
         RETURN(BZ_DATA_ERROR);
263
2.02k
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
2.02k
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
34.4k
      for (i = 0; i < 16; i++) {
268
32.4k
         GET_BIT(BZ_X_MAPPING_1, uc);
269
32.4k
         if (uc == 1) 
270
10.5k
            s->inUse16[i] = True; else 
271
21.9k
            s->inUse16[i] = False;
272
32.4k
      }
273
274
521k
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
34.1k
      for (i = 0; i < 16; i++)
277
32.1k
         if (s->inUse16[i])
278
179k
            for (j = 0; j < 16; j++) {
279
168k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
168k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
168k
            }
282
1.99k
      makeMaps_d ( s );
283
1.99k
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
1.99k
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
1.99k
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
1.99k
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
1.99k
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
1.99k
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
4.79M
      for (i = 0; i < nSelectors; i++) {
292
4.79M
         j = 0;
293
5.59M
         while (True) {
294
5.59M
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
5.59M
            if (uc == 0) break;
296
799k
            j++;
297
799k
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
799k
         }
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.79M
         if (i < BZ_MAX_SELECTORS)
303
3.87M
           s->selectorMtf[i] = j;
304
4.79M
      }
305
1.98k
      if (nSelectors > BZ_MAX_SELECTORS)
306
177
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
1.98k
      {
310
1.98k
         UChar pos[BZ_N_GROUPS], tmp, v;
311
7.83k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
3.77M
         for (i = 0; i < nSelectors; i++) {
314
3.77M
            v = s->selectorMtf[i];
315
3.77M
            tmp = pos[v];
316
4.43M
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
3.77M
            pos[0] = tmp;
318
3.77M
            s->selector[i] = tmp;
319
3.77M
         }
320
1.98k
      }
321
322
      /*--- Now the coding tables ---*/
323
6.73k
      for (t = 0; t < nGroups; t++) {
324
4.93k
         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.7k
               GET_BIT(BZ_X_CODING_3, uc);
331
50.7k
               if (uc == 0) curr++; else curr--;
332
50.7k
            }
333
111k
            s->len[t][i] = curr;
334
111k
         }
335
4.93k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
6.53k
      for (t = 0; t < nGroups; t++) {
339
4.73k
         minLen = 32;
340
4.73k
         maxLen = 0;
341
115k
         for (i = 0; i < alphaSize; i++) {
342
110k
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
110k
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
110k
         }
345
4.73k
         BZ2_hbCreateDecodeTables ( 
346
4.73k
            &(s->limit[t][0]), 
347
4.73k
            &(s->base[t][0]), 
348
4.73k
            &(s->perm[t][0]), 
349
4.73k
            &(s->len[t][0]),
350
4.73k
            minLen, maxLen, alphaSize
351
4.73k
         );
352
4.73k
         s->minLens[t] = minLen;
353
4.73k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
1.80k
      EOB      = s->nInUse+1;
358
1.80k
      nblockMAX = 100000 * s->blockSize100k;
359
1.80k
      groupNo  = -1;
360
1.80k
      groupPos = 0;
361
362
462k
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
1.80k
      {
366
1.80k
         Int32 ii, jj, kk;
367
1.80k
         kk = MTFA_SIZE-1;
368
30.6k
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
489k
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
461k
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
461k
               kk--;
372
461k
            }
373
28.8k
            s->mtfbase[ii] = kk + 1;
374
28.8k
         }
375
1.80k
      }
376
      /*-- end MTF init --*/
377
378
1.80k
      nblock = 0;
379
9.00k
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
6.14M
      while (True) {
382
383
6.14M
         if (nextSym == EOB) break;
384
385
6.13M
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
87.5k
            es = -1;
388
87.5k
            N = 1;
389
240k
            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
240k
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
240k
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
44.3k
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
240k
               N = N * 2;
400
1.20M
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
1.20M
            }
402
240k
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
87.5k
            es++;
405
87.5k
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
87.5k
            s->unzftab[uc] += es;
407
408
87.5k
            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
87.5k
            else
416
45.7M
               while (es > 0) {
417
45.6M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
45.6M
                  s->tt[nblock] = (UInt32)uc;
419
45.6M
                  nblock++;
420
45.6M
                  es--;
421
45.6M
               };
422
423
87.5k
            continue;
424
425
6.05M
         } else {
426
427
6.05M
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
6.05M
            {
431
6.05M
               Int32 ii, jj, kk, pp, lno, off;
432
6.05M
               UInt32 nn;
433
6.05M
               nn = (UInt32)(nextSym - 1);
434
435
6.05M
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
1.39M
                  pp = s->mtfbase[0];
438
1.39M
                  uc = s->mtfa[pp+nn];
439
3.96M
                  while (nn > 3) {
440
2.57M
                     Int32 z = pp+nn;
441
2.57M
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
2.57M
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
2.57M
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
2.57M
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
2.57M
                     nn -= 4;
446
2.57M
                  }
447
3.59M
                  while (nn > 0) { 
448
2.19M
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
2.19M
                  };
450
1.39M
                  s->mtfa[pp] = uc;
451
4.65M
               } else { 
452
                  /* general case */
453
4.65M
                  lno = nn / MTFL_SIZE;
454
4.65M
                  off = nn % MTFL_SIZE;
455
4.65M
                  pp = s->mtfbase[lno] + off;
456
4.65M
                  uc = s->mtfa[pp];
457
32.3M
                  while (pp > s->mtfbase[lno]) { 
458
27.6M
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
27.6M
                  };
460
4.65M
                  s->mtfbase[lno]++;
461
12.3M
                  while (lno > 0) {
462
7.67M
                     s->mtfbase[lno]--;
463
7.67M
                     s->mtfa[s->mtfbase[lno]] 
464
7.67M
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
7.67M
                     lno--;
466
7.67M
                  }
467
4.65M
                  s->mtfbase[0]--;
468
4.65M
                  s->mtfa[s->mtfbase[0]] = uc;
469
4.65M
                  if (s->mtfbase[0] == 0) {
470
1.17k
                     kk = MTFA_SIZE-1;
471
20.0k
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
472
320k
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
473
301k
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
474
301k
                           kk--;
475
301k
                        }
476
18.8k
                        s->mtfbase[ii] = kk + 1;
477
18.8k
                     }
478
1.17k
                  }
479
4.65M
               }
480
6.05M
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
6.05M
            s->unzftab[s->seqToUnseq[uc]]++;
484
6.05M
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
6.05M
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
6.05M
            nblock++;
488
489
6.05M
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
6.05M
            continue;
491
24.2M
         }
492
6.13M
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
1.14k
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
1.14k
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
292k
      for (i = 0; i <= 255; i++) {
503
291k
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
291k
            RETURN(BZ_DATA_ERROR);
505
291k
      }
506
      /* Actually generate cftab. */
507
1.14k
      s->cftab[0] = 0;
508
292k
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
292k
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
294k
      for (i = 0; i <= 256; i++) {
512
292k
         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
292k
      }
517
      /* Check: cftab entries non-descending. */
518
292k
      for (i = 1; i <= 256; i++) {
519
291k
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
291k
      }
523
524
1.14k
      s->state_out_len = 0;
525
1.14k
      s->state_out_ch  = 0;
526
1.14k
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
1.14k
      s->state = BZ_X_OUTPUT;
528
1.14k
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
1.14k
      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.14k
      } 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.14k
         s->tPos = s->tt[s->origPtr] >> 8;
573
1.14k
         s->nblock_used = 0;
574
1.14k
         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.14k
         } else {
579
1.14k
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
1.14k
         }
581
582
1.14k
      }
583
584
1.14k
      RETURN(BZ_OK);
585
586
587
588
1.13k
    endhdr_2:
589
590
1.13k
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
1.13k
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
1.13k
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
1.13k
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
594
1.13k
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
595
1.13k
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
596
1.13k
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
1.13k
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
1.13k
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
1.13k
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
1.13k
      s->storedCombinedCRC = 0;
602
1.13k
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
1.13k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
1.13k
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
1.13k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
1.13k
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
1.13k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
1.13k
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
1.13k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
1.13k
      s->state = BZ_X_IDLE;
612
1.13k
      RETURN(BZ_STREAM_END);
613
614
0
      default: AssertH ( False, 4001 );
615
3.95k
   }
616
617
0
   AssertH ( False, 4002 );
618
619
3.95k
   save_state_and_return:
620
621
3.95k
   s->save_i           = i;
622
3.95k
   s->save_j           = j;
623
3.95k
   s->save_t           = t;
624
3.95k
   s->save_alphaSize   = alphaSize;
625
3.95k
   s->save_nGroups     = nGroups;
626
3.95k
   s->save_nSelectors  = nSelectors;
627
3.95k
   s->save_EOB         = EOB;
628
3.95k
   s->save_groupNo     = groupNo;
629
3.95k
   s->save_groupPos    = groupPos;
630
3.95k
   s->save_nextSym     = nextSym;
631
3.95k
   s->save_nblockMAX   = nblockMAX;
632
3.95k
   s->save_nblock      = nblock;
633
3.95k
   s->save_es          = es;
634
3.95k
   s->save_N           = N;
635
3.95k
   s->save_curr        = curr;
636
3.95k
   s->save_zt          = zt;
637
3.95k
   s->save_zn          = zn;
638
3.95k
   s->save_zvec        = zvec;
639
3.95k
   s->save_zj          = zj;
640
3.95k
   s->save_gSel        = gSel;
641
3.95k
   s->save_gMinlen     = gMinlen;
642
3.95k
   s->save_gLimit      = gLimit;
643
3.95k
   s->save_gBase       = gBase;
644
3.95k
   s->save_gPerm       = gPerm;
645
646
3.95k
   return retVal;   
647
0
}
648
649
650
/*-------------------------------------------------------------*/
651
/*--- end                                      decompress.c ---*/
652
/*-------------------------------------------------------------*/