Coverage Report

Created: 2026-10-28 06:34

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