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