Coverage Report

Created: 2026-08-14 07:22

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