Coverage Report

Created: 2025-11-16 06:16

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