Coverage Report

Created: 2026-05-30 06:10

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