Coverage Report

Created: 2025-10-28 06:10

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