Coverage Report

Created: 2026-04-01 06:12

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