File Coverage

decompress.c
Criterion Covered Total %
statement 306 347 88.1
branch 363 502 72.3
condition n/a
subroutine n/a
pod n/a
total 669 849 78.8


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