Coverage Report

Created: 2025-10-10 07:05

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