Coverage Report

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