Coverage Report

Created: 2026-07-16 06:56

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