Coverage Report

Created: 2022-11-03 06:32

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