Coverage Report

Created: 2026-02-14 06:51

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