Coverage Report

Created: 2026-01-22 06:46

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