Coverage Report

Created: 2025-11-16 06:59

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