Coverage Report

Created: 2022-11-03 06:34

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