Coverage Report

Created: 2026-06-30 07:12

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