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 51141           Int32 BZ2_decompress ( DState* s )
108             {
109             UChar uc;
110             Int32 retVal;
111             Int32 minLen, maxLen;
112 51141           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 51141 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 51141           i = s->save_i;
170 51141           j = s->save_j;
171 51141           t = s->save_t;
172 51141           alphaSize = s->save_alphaSize;
173 51141           nGroups = s->save_nGroups;
174 51141           nSelectors = s->save_nSelectors;
175 51141           EOB = s->save_EOB;
176 51141           groupNo = s->save_groupNo;
177 51141           groupPos = s->save_groupPos;
178 51141           nextSym = s->save_nextSym;
179 51141           nblockMAX = s->save_nblockMAX;
180 51141           nblock = s->save_nblock;
181 51141           es = s->save_es;
182 51141           N = s->save_N;
183 51141           curr = s->save_curr;
184 51141           zt = s->save_zt;
185 51141           zn = s->save_zn;
186 51141           zvec = s->save_zvec;
187 51141           zj = s->save_zj;
188 51141           gSel = s->save_gSel;
189 51141           gMinlen = s->save_gMinlen;
190 51141           gLimit = s->save_gLimit;
191 51141           gBase = s->save_gBase;
192 51141           gPerm = s->save_gPerm;
193              
194 51141           retVal = BZ_OK;
195              
196 51141           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 9151 100         GET_BIT(BZ_X_SELECTOR_3, uc);
    100          
    50          
296 7750 100         if (uc == 0) break;
297 5490           j++;
298 5490 50         if (j >= nGroups) RETURN(BZ_DATA_ERROR);
299 5490           }
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 7750 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 141 100         GET_BITS(BZ_X_CODING_1, curr, 5);
    100          
    50          
326 7235 100         for (i = 0; i < alphaSize; i++) {
327             while (True) {
328 11679 50         if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
    50          
329 13473 100         GET_BIT(BZ_X_CODING_2, uc);
    100          
    50          
330 11679 100         if (uc == 0) break;
331 5205 100         GET_BIT(BZ_X_CODING_3, uc);
    100          
    50          
332 4525 100         if (uc == 0) curr++; else curr--;
333 4525           }
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 81 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 643           es = -1;
389 643           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 2067 50         if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
398 2067 100         if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
399 981 50         if (nextSym == BZ_RUNB) es = es + (1+1) * N;
400 2067           N = N * 2;
401 4959 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 2067 100         while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
    100          
404              
405 643           es++;
406 643           uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
407 643           s->unzftab[uc] += es;
408              
409 643 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 354165 100         while (es > 0) {
418 353522 50         if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
419 353522           s->tt[nblock] = (UInt32)uc;
420 353522           nblock++;
421 353522           es--;
422             };
423              
424 643           continue;
425              
426             } else {
427              
428 110041 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 110041           nn = (UInt32)(nextSym - 1);
435              
436 110041 100         if (nn < MTFL_SIZE) {
437             /* avoid general-case expense */
438 7027           pp = s->mtfbase[0];
439 7027           uc = s->mtfa[pp+nn];
440 18207 100         while (nn > 3) {
441 11180           Int32 z = pp+nn;
442 11180           s->mtfa[(z) ] = s->mtfa[(z)-1];
443 11180           s->mtfa[(z)-1] = s->mtfa[(z)-2];
444 11180           s->mtfa[(z)-2] = s->mtfa[(z)-3];
445 11180           s->mtfa[(z)-3] = s->mtfa[(z)-4];
446 11180           nn -= 4;
447             }
448 18236 100         while (nn > 0) {
449 11209           s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
450             };
451 7027           s->mtfa[pp] = uc;
452             } else {
453             /* general case */
454 103014           lno = nn / MTFL_SIZE;
455 103014           off = nn % MTFL_SIZE;
456 103014           pp = s->mtfbase[lno] + off;
457 103014           uc = s->mtfa[pp];
458 873990 100         while (pp > s->mtfbase[lno]) {
459 770976           s->mtfa[pp] = s->mtfa[pp-1]; pp--;
460             };
461 103014           s->mtfbase[lno]++;
462 924169 100         while (lno > 0) {
463 821155           s->mtfbase[lno]--;
464 821155           s->mtfa[s->mtfbase[lno]]
465 821155           = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
466 821155           lno--;
467             }
468 103014           s->mtfbase[0]--;
469 103014           s->mtfa[s->mtfbase[0]] = uc;
470 103014 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 110041           s->unzftab[s->seqToUnseq[uc]]++;
485 110041 50         if (s->smallDecompress)
486 0           s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
487 110041           s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]);
488 110041           nblock++;
489              
490 378427 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 110041           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 51141           s->save_i = i;
623 51141           s->save_j = j;
624 51141           s->save_t = t;
625 51141           s->save_alphaSize = alphaSize;
626 51141           s->save_nGroups = nGroups;
627 51141           s->save_nSelectors = nSelectors;
628 51141           s->save_EOB = EOB;
629 51141           s->save_groupNo = groupNo;
630 51141           s->save_groupPos = groupPos;
631 51141           s->save_nextSym = nextSym;
632 51141           s->save_nblockMAX = nblockMAX;
633 51141           s->save_nblock = nblock;
634 51141           s->save_es = es;
635 51141           s->save_N = N;
636 51141           s->save_curr = curr;
637 51141           s->save_zt = zt;
638 51141           s->save_zn = zn;
639 51141           s->save_zvec = zvec;
640 51141           s->save_zj = zj;
641 51141           s->save_gSel = gSel;
642 51141           s->save_gMinlen = gMinlen;
643 51141           s->save_gLimit = gLimit;
644 51141           s->save_gBase = gBase;
645 51141           s->save_gPerm = gPerm;
646              
647 51141           return retVal;
648             }
649              
650              
651             /*-------------------------------------------------------------*/
652             /*--- end decompress.c ---*/
653             /*-------------------------------------------------------------*/