Coverage Report

Created: 2025-09-27 06:41

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