Coverage Report

Created: 2025-12-14 06:27

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