Coverage Report

Created: 2025-12-31 06:51

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