Coverage Report

Created: 2026-01-09 07:11

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