Coverage Report

Created: 2026-08-13 07:32

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