Coverage Report

Created: 2026-09-14 07:18

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