Coverage Report

Created: 2026-02-26 06:40

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