Coverage Report

Created: 2026-09-28 07:22

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