Coverage Report

Created: 2025-11-24 06:45

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