Coverage Report

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