Coverage Report

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