Coverage Report

Created: 2026-10-17 07:07

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