xref: /rk3399_rockchip-uboot/lib/bzip2/bzlib_decompress.c (revision f071c501901281ae2de7a372ec12270dce91c426)
1*f071c501SMasahiro Yamada #include <config.h>
2*f071c501SMasahiro Yamada #include <common.h>
3*f071c501SMasahiro Yamada #include <watchdog.h>
4*f071c501SMasahiro Yamada 
5*f071c501SMasahiro Yamada /*-------------------------------------------------------------*/
6*f071c501SMasahiro Yamada /*--- Decompression machinery                               ---*/
7*f071c501SMasahiro Yamada /*---                                          decompress.c ---*/
8*f071c501SMasahiro Yamada /*-------------------------------------------------------------*/
9*f071c501SMasahiro Yamada 
10*f071c501SMasahiro Yamada /*--
11*f071c501SMasahiro Yamada   This file is a part of bzip2 and/or libbzip2, a program and
12*f071c501SMasahiro Yamada   library for lossless, block-sorting data compression.
13*f071c501SMasahiro Yamada 
14*f071c501SMasahiro Yamada   Copyright (C) 1996-2002 Julian R Seward.  All rights reserved.
15*f071c501SMasahiro Yamada 
16*f071c501SMasahiro Yamada   Redistribution and use in source and binary forms, with or without
17*f071c501SMasahiro Yamada   modification, are permitted provided that the following conditions
18*f071c501SMasahiro Yamada   are met:
19*f071c501SMasahiro Yamada 
20*f071c501SMasahiro Yamada   1. Redistributions of source code must retain the above copyright
21*f071c501SMasahiro Yamada      notice, this list of conditions and the following disclaimer.
22*f071c501SMasahiro Yamada 
23*f071c501SMasahiro Yamada   2. The origin of this software must not be misrepresented; you must
24*f071c501SMasahiro Yamada      not claim that you wrote the original software.  If you use this
25*f071c501SMasahiro Yamada      software in a product, an acknowledgment in the product
26*f071c501SMasahiro Yamada      documentation would be appreciated but is not required.
27*f071c501SMasahiro Yamada 
28*f071c501SMasahiro Yamada   3. Altered source versions must be plainly marked as such, and must
29*f071c501SMasahiro Yamada      not be misrepresented as being the original software.
30*f071c501SMasahiro Yamada 
31*f071c501SMasahiro Yamada   4. The name of the author may not be used to endorse or promote
32*f071c501SMasahiro Yamada      products derived from this software without specific prior written
33*f071c501SMasahiro Yamada      permission.
34*f071c501SMasahiro Yamada 
35*f071c501SMasahiro Yamada   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
36*f071c501SMasahiro Yamada   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
37*f071c501SMasahiro Yamada   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38*f071c501SMasahiro Yamada   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
39*f071c501SMasahiro Yamada   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40*f071c501SMasahiro Yamada   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
41*f071c501SMasahiro Yamada   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
42*f071c501SMasahiro Yamada   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
43*f071c501SMasahiro Yamada   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44*f071c501SMasahiro Yamada   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45*f071c501SMasahiro Yamada   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46*f071c501SMasahiro Yamada 
47*f071c501SMasahiro Yamada   Julian Seward, Cambridge, UK.
48*f071c501SMasahiro Yamada   jseward@acm.org
49*f071c501SMasahiro Yamada   bzip2/libbzip2 version 1.0 of 21 March 2000
50*f071c501SMasahiro Yamada 
51*f071c501SMasahiro Yamada   This program is based on (at least) the work of:
52*f071c501SMasahiro Yamada      Mike Burrows
53*f071c501SMasahiro Yamada      David Wheeler
54*f071c501SMasahiro Yamada      Peter Fenwick
55*f071c501SMasahiro Yamada      Alistair Moffat
56*f071c501SMasahiro Yamada      Radford Neal
57*f071c501SMasahiro Yamada      Ian H. Witten
58*f071c501SMasahiro Yamada      Robert Sedgewick
59*f071c501SMasahiro Yamada      Jon L. Bentley
60*f071c501SMasahiro Yamada 
61*f071c501SMasahiro Yamada   For more information on these sources, see the manual.
62*f071c501SMasahiro Yamada --*/
63*f071c501SMasahiro Yamada 
64*f071c501SMasahiro Yamada 
65*f071c501SMasahiro Yamada #include "bzlib_private.h"
66*f071c501SMasahiro Yamada 
67*f071c501SMasahiro Yamada 
68*f071c501SMasahiro Yamada /*---------------------------------------------------*/
69*f071c501SMasahiro Yamada static
makeMaps_d(DState * s)70*f071c501SMasahiro Yamada void makeMaps_d ( DState* s )
71*f071c501SMasahiro Yamada {
72*f071c501SMasahiro Yamada    Int32 i;
73*f071c501SMasahiro Yamada    s->nInUse = 0;
74*f071c501SMasahiro Yamada    for (i = 0; i < 256; i++)
75*f071c501SMasahiro Yamada       if (s->inUse[i]) {
76*f071c501SMasahiro Yamada 	 s->seqToUnseq[s->nInUse] = i;
77*f071c501SMasahiro Yamada 	 s->nInUse++;
78*f071c501SMasahiro Yamada       }
79*f071c501SMasahiro Yamada }
80*f071c501SMasahiro Yamada 
81*f071c501SMasahiro Yamada 
82*f071c501SMasahiro Yamada /*---------------------------------------------------*/
83*f071c501SMasahiro Yamada #define RETURN(rrr)                               \
84*f071c501SMasahiro Yamada    { retVal = rrr; goto save_state_and_return; };
85*f071c501SMasahiro Yamada 
86*f071c501SMasahiro Yamada #define GET_BITS(lll,vvv,nnn)                     \
87*f071c501SMasahiro Yamada    case lll: s->state = lll;                      \
88*f071c501SMasahiro Yamada    while (True) {                                 \
89*f071c501SMasahiro Yamada       if (s->bsLive >= nnn) {                     \
90*f071c501SMasahiro Yamada 	 UInt32 v;                                \
91*f071c501SMasahiro Yamada 	 v = (s->bsBuff >>                        \
92*f071c501SMasahiro Yamada 	     (s->bsLive-nnn)) & ((1 << nnn)-1);   \
93*f071c501SMasahiro Yamada 	 s->bsLive -= nnn;                        \
94*f071c501SMasahiro Yamada 	 vvv = v;                                 \
95*f071c501SMasahiro Yamada 	 break;                                   \
96*f071c501SMasahiro Yamada       }                                           \
97*f071c501SMasahiro Yamada       if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
98*f071c501SMasahiro Yamada       s->bsBuff                                   \
99*f071c501SMasahiro Yamada 	 = (s->bsBuff << 8) |                     \
100*f071c501SMasahiro Yamada 	   ((UInt32)                              \
101*f071c501SMasahiro Yamada 	      (*((UChar*)(s->strm->next_in))));   \
102*f071c501SMasahiro Yamada       s->bsLive += 8;                             \
103*f071c501SMasahiro Yamada       s->strm->next_in++;                         \
104*f071c501SMasahiro Yamada       s->strm->avail_in--;                        \
105*f071c501SMasahiro Yamada       s->strm->total_in_lo32++;                   \
106*f071c501SMasahiro Yamada       if (s->strm->total_in_lo32 == 0)            \
107*f071c501SMasahiro Yamada 	 s->strm->total_in_hi32++;                \
108*f071c501SMasahiro Yamada    }
109*f071c501SMasahiro Yamada 
110*f071c501SMasahiro Yamada #define GET_UCHAR(lll,uuu)                        \
111*f071c501SMasahiro Yamada    GET_BITS(lll,uuu,8)
112*f071c501SMasahiro Yamada 
113*f071c501SMasahiro Yamada #define GET_BIT(lll,uuu)                          \
114*f071c501SMasahiro Yamada    GET_BITS(lll,uuu,1)
115*f071c501SMasahiro Yamada 
116*f071c501SMasahiro Yamada /*---------------------------------------------------*/
117*f071c501SMasahiro Yamada #define GET_MTF_VAL(label1,label2,lval)           \
118*f071c501SMasahiro Yamada {                                                 \
119*f071c501SMasahiro Yamada    if (groupPos == 0) {                           \
120*f071c501SMasahiro Yamada       groupNo++;                                  \
121*f071c501SMasahiro Yamada       if (groupNo >= nSelectors)                  \
122*f071c501SMasahiro Yamada 	 RETURN(BZ_DATA_ERROR);                   \
123*f071c501SMasahiro Yamada       groupPos = BZ_G_SIZE;                       \
124*f071c501SMasahiro Yamada       gSel = s->selector[groupNo];                \
125*f071c501SMasahiro Yamada       gMinlen = s->minLens[gSel];                 \
126*f071c501SMasahiro Yamada       gLimit = &(s->limit[gSel][0]);              \
127*f071c501SMasahiro Yamada       gPerm = &(s->perm[gSel][0]);                \
128*f071c501SMasahiro Yamada       gBase = &(s->base[gSel][0]);                \
129*f071c501SMasahiro Yamada    }                                              \
130*f071c501SMasahiro Yamada    groupPos--;                                    \
131*f071c501SMasahiro Yamada    zn = gMinlen;                                  \
132*f071c501SMasahiro Yamada    GET_BITS(label1, zvec, zn);                    \
133*f071c501SMasahiro Yamada    while (1) {                                    \
134*f071c501SMasahiro Yamada       if (zn > 20 /* the longest code */)         \
135*f071c501SMasahiro Yamada 	 RETURN(BZ_DATA_ERROR);                   \
136*f071c501SMasahiro Yamada       if (zvec <= gLimit[zn]) break;              \
137*f071c501SMasahiro Yamada       zn++;                                       \
138*f071c501SMasahiro Yamada       GET_BIT(label2, zj);                        \
139*f071c501SMasahiro Yamada       zvec = (zvec << 1) | zj;                    \
140*f071c501SMasahiro Yamada    };                                             \
141*f071c501SMasahiro Yamada    if (zvec - gBase[zn] < 0                       \
142*f071c501SMasahiro Yamada        || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
143*f071c501SMasahiro Yamada       RETURN(BZ_DATA_ERROR);                      \
144*f071c501SMasahiro Yamada    lval = gPerm[zvec - gBase[zn]];                \
145*f071c501SMasahiro Yamada }
146*f071c501SMasahiro Yamada 
147*f071c501SMasahiro Yamada 
148*f071c501SMasahiro Yamada /*---------------------------------------------------*/
BZ2_decompress(DState * s)149*f071c501SMasahiro Yamada Int32 BZ2_decompress ( DState* s )
150*f071c501SMasahiro Yamada {
151*f071c501SMasahiro Yamada    UChar      uc;
152*f071c501SMasahiro Yamada    Int32      retVal;
153*f071c501SMasahiro Yamada    Int32      minLen, maxLen;
154*f071c501SMasahiro Yamada    bz_stream* strm = s->strm;
155*f071c501SMasahiro Yamada 
156*f071c501SMasahiro Yamada    /* stuff that needs to be saved/restored */
157*f071c501SMasahiro Yamada    Int32  i;
158*f071c501SMasahiro Yamada    Int32  j;
159*f071c501SMasahiro Yamada    Int32  t;
160*f071c501SMasahiro Yamada    Int32  alphaSize;
161*f071c501SMasahiro Yamada    Int32  nGroups;
162*f071c501SMasahiro Yamada    Int32  nSelectors;
163*f071c501SMasahiro Yamada    Int32  EOB;
164*f071c501SMasahiro Yamada    Int32  groupNo;
165*f071c501SMasahiro Yamada    Int32  groupPos;
166*f071c501SMasahiro Yamada    Int32  nextSym;
167*f071c501SMasahiro Yamada    Int32  nblockMAX;
168*f071c501SMasahiro Yamada    Int32  nblock;
169*f071c501SMasahiro Yamada    Int32  es;
170*f071c501SMasahiro Yamada    Int32  N;
171*f071c501SMasahiro Yamada    Int32  curr;
172*f071c501SMasahiro Yamada    Int32  zt;
173*f071c501SMasahiro Yamada    Int32  zn;
174*f071c501SMasahiro Yamada    Int32  zvec;
175*f071c501SMasahiro Yamada    Int32  zj;
176*f071c501SMasahiro Yamada    Int32  gSel;
177*f071c501SMasahiro Yamada    Int32  gMinlen;
178*f071c501SMasahiro Yamada    Int32* gLimit;
179*f071c501SMasahiro Yamada    Int32* gBase;
180*f071c501SMasahiro Yamada    Int32* gPerm;
181*f071c501SMasahiro Yamada 
182*f071c501SMasahiro Yamada    if (s->state == BZ_X_MAGIC_1) {
183*f071c501SMasahiro Yamada       /*initialise the save area*/
184*f071c501SMasahiro Yamada       s->save_i           = 0;
185*f071c501SMasahiro Yamada       s->save_j           = 0;
186*f071c501SMasahiro Yamada       s->save_t           = 0;
187*f071c501SMasahiro Yamada       s->save_alphaSize   = 0;
188*f071c501SMasahiro Yamada       s->save_nGroups     = 0;
189*f071c501SMasahiro Yamada       s->save_nSelectors  = 0;
190*f071c501SMasahiro Yamada       s->save_EOB         = 0;
191*f071c501SMasahiro Yamada       s->save_groupNo     = 0;
192*f071c501SMasahiro Yamada       s->save_groupPos    = 0;
193*f071c501SMasahiro Yamada       s->save_nextSym     = 0;
194*f071c501SMasahiro Yamada       s->save_nblockMAX   = 0;
195*f071c501SMasahiro Yamada       s->save_nblock      = 0;
196*f071c501SMasahiro Yamada       s->save_es          = 0;
197*f071c501SMasahiro Yamada       s->save_N           = 0;
198*f071c501SMasahiro Yamada       s->save_curr        = 0;
199*f071c501SMasahiro Yamada       s->save_zt          = 0;
200*f071c501SMasahiro Yamada       s->save_zn          = 0;
201*f071c501SMasahiro Yamada       s->save_zvec        = 0;
202*f071c501SMasahiro Yamada       s->save_zj          = 0;
203*f071c501SMasahiro Yamada       s->save_gSel        = 0;
204*f071c501SMasahiro Yamada       s->save_gMinlen     = 0;
205*f071c501SMasahiro Yamada       s->save_gLimit      = NULL;
206*f071c501SMasahiro Yamada       s->save_gBase       = NULL;
207*f071c501SMasahiro Yamada       s->save_gPerm       = NULL;
208*f071c501SMasahiro Yamada    }
209*f071c501SMasahiro Yamada 
210*f071c501SMasahiro Yamada    /*restore from the save area*/
211*f071c501SMasahiro Yamada    i           = s->save_i;
212*f071c501SMasahiro Yamada    j           = s->save_j;
213*f071c501SMasahiro Yamada    t           = s->save_t;
214*f071c501SMasahiro Yamada    alphaSize   = s->save_alphaSize;
215*f071c501SMasahiro Yamada    nGroups     = s->save_nGroups;
216*f071c501SMasahiro Yamada    nSelectors  = s->save_nSelectors;
217*f071c501SMasahiro Yamada    EOB         = s->save_EOB;
218*f071c501SMasahiro Yamada    groupNo     = s->save_groupNo;
219*f071c501SMasahiro Yamada    groupPos    = s->save_groupPos;
220*f071c501SMasahiro Yamada    nextSym     = s->save_nextSym;
221*f071c501SMasahiro Yamada    nblockMAX   = s->save_nblockMAX;
222*f071c501SMasahiro Yamada    nblock      = s->save_nblock;
223*f071c501SMasahiro Yamada    es          = s->save_es;
224*f071c501SMasahiro Yamada    N           = s->save_N;
225*f071c501SMasahiro Yamada    curr        = s->save_curr;
226*f071c501SMasahiro Yamada    zt          = s->save_zt;
227*f071c501SMasahiro Yamada    zn          = s->save_zn;
228*f071c501SMasahiro Yamada    zvec        = s->save_zvec;
229*f071c501SMasahiro Yamada    zj          = s->save_zj;
230*f071c501SMasahiro Yamada    gSel        = s->save_gSel;
231*f071c501SMasahiro Yamada    gMinlen     = s->save_gMinlen;
232*f071c501SMasahiro Yamada    gLimit      = s->save_gLimit;
233*f071c501SMasahiro Yamada    gBase       = s->save_gBase;
234*f071c501SMasahiro Yamada    gPerm       = s->save_gPerm;
235*f071c501SMasahiro Yamada 
236*f071c501SMasahiro Yamada    retVal = BZ_OK;
237*f071c501SMasahiro Yamada 
238*f071c501SMasahiro Yamada    switch (s->state) {
239*f071c501SMasahiro Yamada 
240*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_MAGIC_1, uc);
241*f071c501SMasahiro Yamada       if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
242*f071c501SMasahiro Yamada 
243*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_MAGIC_2, uc);
244*f071c501SMasahiro Yamada       if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
245*f071c501SMasahiro Yamada 
246*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_MAGIC_3, uc)
247*f071c501SMasahiro Yamada       if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
248*f071c501SMasahiro Yamada 
249*f071c501SMasahiro Yamada       GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
250*f071c501SMasahiro Yamada       if (s->blockSize100k < (BZ_HDR_0 + 1) ||
251*f071c501SMasahiro Yamada 	  s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
252*f071c501SMasahiro Yamada       s->blockSize100k -= BZ_HDR_0;
253*f071c501SMasahiro Yamada 
254*f071c501SMasahiro Yamada       if (s->smallDecompress) {
255*f071c501SMasahiro Yamada 	 s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
256*f071c501SMasahiro Yamada 	 s->ll4  = BZALLOC(
257*f071c501SMasahiro Yamada 		      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
258*f071c501SMasahiro Yamada 		   );
259*f071c501SMasahiro Yamada 	 if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
260*f071c501SMasahiro Yamada       } else {
261*f071c501SMasahiro Yamada 	 s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
262*f071c501SMasahiro Yamada 	 if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
263*f071c501SMasahiro Yamada       }
264*f071c501SMasahiro Yamada 
265*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_1, uc);
266*f071c501SMasahiro Yamada 
267*f071c501SMasahiro Yamada       if (uc == 0x17) goto endhdr_2;
268*f071c501SMasahiro Yamada       if (uc != 0x31) RETURN(BZ_DATA_ERROR);
269*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_2, uc);
270*f071c501SMasahiro Yamada       if (uc != 0x41) RETURN(BZ_DATA_ERROR);
271*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_3, uc);
272*f071c501SMasahiro Yamada       if (uc != 0x59) RETURN(BZ_DATA_ERROR);
273*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_4, uc);
274*f071c501SMasahiro Yamada       if (uc != 0x26) RETURN(BZ_DATA_ERROR);
275*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_5, uc);
276*f071c501SMasahiro Yamada       if (uc != 0x53) RETURN(BZ_DATA_ERROR);
277*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BLKHDR_6, uc);
278*f071c501SMasahiro Yamada       if (uc != 0x59) RETURN(BZ_DATA_ERROR);
279*f071c501SMasahiro Yamada 
280*f071c501SMasahiro Yamada       s->currBlockNo++;
281*f071c501SMasahiro Yamada       if (s->verbosity >= 2)
282*f071c501SMasahiro Yamada 	 VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
283*f071c501SMasahiro Yamada 
284*f071c501SMasahiro Yamada       s->storedBlockCRC = 0;
285*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BCRC_1, uc);
286*f071c501SMasahiro Yamada       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
287*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BCRC_2, uc);
288*f071c501SMasahiro Yamada       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
289*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BCRC_3, uc);
290*f071c501SMasahiro Yamada       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
291*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_BCRC_4, uc);
292*f071c501SMasahiro Yamada       s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
293*f071c501SMasahiro Yamada 
294*f071c501SMasahiro Yamada       GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
295*f071c501SMasahiro Yamada 
296*f071c501SMasahiro Yamada       s->origPtr = 0;
297*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ORIGPTR_1, uc);
298*f071c501SMasahiro Yamada       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
299*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ORIGPTR_2, uc);
300*f071c501SMasahiro Yamada       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
301*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ORIGPTR_3, uc);
302*f071c501SMasahiro Yamada       s->origPtr = (s->origPtr << 8) | ((Int32)uc);
303*f071c501SMasahiro Yamada 
304*f071c501SMasahiro Yamada       if (s->origPtr < 0)
305*f071c501SMasahiro Yamada 	 RETURN(BZ_DATA_ERROR);
306*f071c501SMasahiro Yamada       if (s->origPtr > 10 + 100000*s->blockSize100k)
307*f071c501SMasahiro Yamada 	 RETURN(BZ_DATA_ERROR);
308*f071c501SMasahiro Yamada 
309*f071c501SMasahiro Yamada       /*--- Receive the mapping table ---*/
310*f071c501SMasahiro Yamada       for (i = 0; i < 16; i++) {
311*f071c501SMasahiro Yamada 	 GET_BIT(BZ_X_MAPPING_1, uc);
312*f071c501SMasahiro Yamada 	 if (uc == 1)
313*f071c501SMasahiro Yamada 	    s->inUse16[i] = True; else
314*f071c501SMasahiro Yamada 	    s->inUse16[i] = False;
315*f071c501SMasahiro Yamada       }
316*f071c501SMasahiro Yamada 
317*f071c501SMasahiro Yamada       for (i = 0; i < 256; i++) s->inUse[i] = False;
318*f071c501SMasahiro Yamada 
319*f071c501SMasahiro Yamada       for (i = 0; i < 16; i++)
320*f071c501SMasahiro Yamada 	 if (s->inUse16[i])
321*f071c501SMasahiro Yamada 	    for (j = 0; j < 16; j++) {
322*f071c501SMasahiro Yamada 	       GET_BIT(BZ_X_MAPPING_2, uc);
323*f071c501SMasahiro Yamada 	       if (uc == 1) s->inUse[i * 16 + j] = True;
324*f071c501SMasahiro Yamada 	    }
325*f071c501SMasahiro Yamada       makeMaps_d ( s );
326*f071c501SMasahiro Yamada       if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
327*f071c501SMasahiro Yamada       alphaSize = s->nInUse+2;
328*f071c501SMasahiro Yamada 
329*f071c501SMasahiro Yamada       /*--- Now the selectors ---*/
330*f071c501SMasahiro Yamada       GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
331*f071c501SMasahiro Yamada       if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
332*f071c501SMasahiro Yamada       GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
333*f071c501SMasahiro Yamada       if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
334*f071c501SMasahiro Yamada       for (i = 0; i < nSelectors; i++) {
335*f071c501SMasahiro Yamada 	 j = 0;
336*f071c501SMasahiro Yamada 	 while (True) {
337*f071c501SMasahiro Yamada 	    GET_BIT(BZ_X_SELECTOR_3, uc);
338*f071c501SMasahiro Yamada 	    if (uc == 0) break;
339*f071c501SMasahiro Yamada 	    j++;
340*f071c501SMasahiro Yamada 	    if (j >= nGroups) RETURN(BZ_DATA_ERROR);
341*f071c501SMasahiro Yamada 	 }
342*f071c501SMasahiro Yamada 	 s->selectorMtf[i] = j;
343*f071c501SMasahiro Yamada       }
344*f071c501SMasahiro Yamada 
345*f071c501SMasahiro Yamada       /*--- Undo the MTF values for the selectors. ---*/
346*f071c501SMasahiro Yamada       {
347*f071c501SMasahiro Yamada 	 UChar pos[BZ_N_GROUPS], tmp, v;
348*f071c501SMasahiro Yamada 	 for (v = 0; v < nGroups; v++) pos[v] = v;
349*f071c501SMasahiro Yamada 
350*f071c501SMasahiro Yamada 	 for (i = 0; i < nSelectors; i++) {
351*f071c501SMasahiro Yamada 	    v = s->selectorMtf[i];
352*f071c501SMasahiro Yamada 	    tmp = pos[v];
353*f071c501SMasahiro Yamada 	    while (v > 0) { pos[v] = pos[v-1]; v--; }
354*f071c501SMasahiro Yamada 	    pos[0] = tmp;
355*f071c501SMasahiro Yamada 	    s->selector[i] = tmp;
356*f071c501SMasahiro Yamada 	 }
357*f071c501SMasahiro Yamada       }
358*f071c501SMasahiro Yamada 
359*f071c501SMasahiro Yamada       /*--- Now the coding tables ---*/
360*f071c501SMasahiro Yamada       for (t = 0; t < nGroups; t++) {
361*f071c501SMasahiro Yamada 	 GET_BITS(BZ_X_CODING_1, curr, 5);
362*f071c501SMasahiro Yamada 	 for (i = 0; i < alphaSize; i++) {
363*f071c501SMasahiro Yamada 	    while (True) {
364*f071c501SMasahiro Yamada 	       if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
365*f071c501SMasahiro Yamada 	       GET_BIT(BZ_X_CODING_2, uc);
366*f071c501SMasahiro Yamada 	       if (uc == 0) break;
367*f071c501SMasahiro Yamada 	       GET_BIT(BZ_X_CODING_3, uc);
368*f071c501SMasahiro Yamada 	       if (uc == 0) curr++; else curr--;
369*f071c501SMasahiro Yamada 	    }
370*f071c501SMasahiro Yamada 	    s->len[t][i] = curr;
371*f071c501SMasahiro Yamada 	 }
372*f071c501SMasahiro Yamada       }
373*f071c501SMasahiro Yamada 
374*f071c501SMasahiro Yamada       /*--- Create the Huffman decoding tables ---*/
375*f071c501SMasahiro Yamada       for (t = 0; t < nGroups; t++) {
376*f071c501SMasahiro Yamada 	 minLen = 32;
377*f071c501SMasahiro Yamada 	 maxLen = 0;
378*f071c501SMasahiro Yamada 	 for (i = 0; i < alphaSize; i++) {
379*f071c501SMasahiro Yamada 	    if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
380*f071c501SMasahiro Yamada 	    if (s->len[t][i] < minLen) minLen = s->len[t][i];
381*f071c501SMasahiro Yamada 	 }
382*f071c501SMasahiro Yamada 	 BZ2_hbCreateDecodeTables (
383*f071c501SMasahiro Yamada 	    &(s->limit[t][0]),
384*f071c501SMasahiro Yamada 	    &(s->base[t][0]),
385*f071c501SMasahiro Yamada 	    &(s->perm[t][0]),
386*f071c501SMasahiro Yamada 	    &(s->len[t][0]),
387*f071c501SMasahiro Yamada 	    minLen, maxLen, alphaSize
388*f071c501SMasahiro Yamada 	 );
389*f071c501SMasahiro Yamada 	 s->minLens[t] = minLen;
390*f071c501SMasahiro Yamada       }
391*f071c501SMasahiro Yamada 
392*f071c501SMasahiro Yamada       /*--- Now the MTF values ---*/
393*f071c501SMasahiro Yamada 
394*f071c501SMasahiro Yamada       EOB      = s->nInUse+1;
395*f071c501SMasahiro Yamada       nblockMAX = 100000 * s->blockSize100k;
396*f071c501SMasahiro Yamada       groupNo  = -1;
397*f071c501SMasahiro Yamada       groupPos = 0;
398*f071c501SMasahiro Yamada 
399*f071c501SMasahiro Yamada       for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
400*f071c501SMasahiro Yamada 
401*f071c501SMasahiro Yamada       /*-- MTF init --*/
402*f071c501SMasahiro Yamada       {
403*f071c501SMasahiro Yamada 	 Int32 ii, jj, kk;
404*f071c501SMasahiro Yamada 	 kk = MTFA_SIZE-1;
405*f071c501SMasahiro Yamada 	 for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
406*f071c501SMasahiro Yamada 	    for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
407*f071c501SMasahiro Yamada 	       s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
408*f071c501SMasahiro Yamada 	       kk--;
409*f071c501SMasahiro Yamada 	    }
410*f071c501SMasahiro Yamada 	    s->mtfbase[ii] = kk + 1;
411*f071c501SMasahiro Yamada 	 }
412*f071c501SMasahiro Yamada       }
413*f071c501SMasahiro Yamada       /*-- end MTF init --*/
414*f071c501SMasahiro Yamada 
415*f071c501SMasahiro Yamada       nblock = 0;
416*f071c501SMasahiro Yamada       GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
417*f071c501SMasahiro Yamada 
418*f071c501SMasahiro Yamada       while (True) {
419*f071c501SMasahiro Yamada 
420*f071c501SMasahiro Yamada #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
421*f071c501SMasahiro Yamada 	WATCHDOG_RESET();
422*f071c501SMasahiro Yamada #endif
423*f071c501SMasahiro Yamada 	 if (nextSym == EOB) break;
424*f071c501SMasahiro Yamada 
425*f071c501SMasahiro Yamada 	 if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
426*f071c501SMasahiro Yamada 
427*f071c501SMasahiro Yamada 	    es = -1;
428*f071c501SMasahiro Yamada 	    N = 1;
429*f071c501SMasahiro Yamada 	    do {
430*f071c501SMasahiro Yamada 	       if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
431*f071c501SMasahiro Yamada 	       if (nextSym == BZ_RUNB) es = es + (1+1) * N;
432*f071c501SMasahiro Yamada 	       N = N * 2;
433*f071c501SMasahiro Yamada 	       GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
434*f071c501SMasahiro Yamada 	    }
435*f071c501SMasahiro Yamada 	       while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
436*f071c501SMasahiro Yamada 
437*f071c501SMasahiro Yamada 	    es++;
438*f071c501SMasahiro Yamada 	    uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
439*f071c501SMasahiro Yamada 	    s->unzftab[uc] += es;
440*f071c501SMasahiro Yamada 
441*f071c501SMasahiro Yamada 	    if (s->smallDecompress)
442*f071c501SMasahiro Yamada 	       while (es > 0) {
443*f071c501SMasahiro Yamada 		  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
444*f071c501SMasahiro Yamada 		  s->ll16[nblock] = (UInt16)uc;
445*f071c501SMasahiro Yamada 		  nblock++;
446*f071c501SMasahiro Yamada 		  es--;
447*f071c501SMasahiro Yamada 	       }
448*f071c501SMasahiro Yamada 	    else
449*f071c501SMasahiro Yamada 	       while (es > 0) {
450*f071c501SMasahiro Yamada 		  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
451*f071c501SMasahiro Yamada 		  s->tt[nblock] = (UInt32)uc;
452*f071c501SMasahiro Yamada 		  nblock++;
453*f071c501SMasahiro Yamada 		  es--;
454*f071c501SMasahiro Yamada 	       };
455*f071c501SMasahiro Yamada 
456*f071c501SMasahiro Yamada 	    continue;
457*f071c501SMasahiro Yamada 
458*f071c501SMasahiro Yamada 	 } else {
459*f071c501SMasahiro Yamada 
460*f071c501SMasahiro Yamada 	    if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
461*f071c501SMasahiro Yamada 
462*f071c501SMasahiro Yamada 	    /*-- uc = MTF ( nextSym-1 ) --*/
463*f071c501SMasahiro Yamada 	    {
464*f071c501SMasahiro Yamada 	       Int32 ii, jj, kk, pp, lno, off;
465*f071c501SMasahiro Yamada 	       UInt32 nn;
466*f071c501SMasahiro Yamada 	       nn = (UInt32)(nextSym - 1);
467*f071c501SMasahiro Yamada 
468*f071c501SMasahiro Yamada 	       if (nn < MTFL_SIZE) {
469*f071c501SMasahiro Yamada 		  /* avoid general-case expense */
470*f071c501SMasahiro Yamada 		  pp = s->mtfbase[0];
471*f071c501SMasahiro Yamada 		  uc = s->mtfa[pp+nn];
472*f071c501SMasahiro Yamada 		  while (nn > 3) {
473*f071c501SMasahiro Yamada 		     Int32 z = pp+nn;
474*f071c501SMasahiro Yamada 		     s->mtfa[(z)  ] = s->mtfa[(z)-1];
475*f071c501SMasahiro Yamada 		     s->mtfa[(z)-1] = s->mtfa[(z)-2];
476*f071c501SMasahiro Yamada 		     s->mtfa[(z)-2] = s->mtfa[(z)-3];
477*f071c501SMasahiro Yamada 		     s->mtfa[(z)-3] = s->mtfa[(z)-4];
478*f071c501SMasahiro Yamada 		     nn -= 4;
479*f071c501SMasahiro Yamada 		  }
480*f071c501SMasahiro Yamada 		  while (nn > 0) {
481*f071c501SMasahiro Yamada 		     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
482*f071c501SMasahiro Yamada 		  };
483*f071c501SMasahiro Yamada 		  s->mtfa[pp] = uc;
484*f071c501SMasahiro Yamada 	       } else {
485*f071c501SMasahiro Yamada 		  /* general case */
486*f071c501SMasahiro Yamada 		  lno = nn / MTFL_SIZE;
487*f071c501SMasahiro Yamada 		  off = nn % MTFL_SIZE;
488*f071c501SMasahiro Yamada 		  pp = s->mtfbase[lno] + off;
489*f071c501SMasahiro Yamada 		  uc = s->mtfa[pp];
490*f071c501SMasahiro Yamada 		  while (pp > s->mtfbase[lno]) {
491*f071c501SMasahiro Yamada 		     s->mtfa[pp] = s->mtfa[pp-1]; pp--;
492*f071c501SMasahiro Yamada 		  };
493*f071c501SMasahiro Yamada 		  s->mtfbase[lno]++;
494*f071c501SMasahiro Yamada 		  while (lno > 0) {
495*f071c501SMasahiro Yamada 		     s->mtfbase[lno]--;
496*f071c501SMasahiro Yamada 		     s->mtfa[s->mtfbase[lno]]
497*f071c501SMasahiro Yamada 			= s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
498*f071c501SMasahiro Yamada 		     lno--;
499*f071c501SMasahiro Yamada 		  }
500*f071c501SMasahiro Yamada 		  s->mtfbase[0]--;
501*f071c501SMasahiro Yamada 		  s->mtfa[s->mtfbase[0]] = uc;
502*f071c501SMasahiro Yamada 		  if (s->mtfbase[0] == 0) {
503*f071c501SMasahiro Yamada 		     kk = MTFA_SIZE-1;
504*f071c501SMasahiro Yamada 		     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
505*f071c501SMasahiro Yamada #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
506*f071c501SMasahiro Yamada 			WATCHDOG_RESET();
507*f071c501SMasahiro Yamada #endif
508*f071c501SMasahiro Yamada 			for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
509*f071c501SMasahiro Yamada 			   s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
510*f071c501SMasahiro Yamada 			   kk--;
511*f071c501SMasahiro Yamada 			}
512*f071c501SMasahiro Yamada 			s->mtfbase[ii] = kk + 1;
513*f071c501SMasahiro Yamada 		     }
514*f071c501SMasahiro Yamada 		  }
515*f071c501SMasahiro Yamada 	       }
516*f071c501SMasahiro Yamada 	    }
517*f071c501SMasahiro Yamada 	    /*-- end uc = MTF ( nextSym-1 ) --*/
518*f071c501SMasahiro Yamada 
519*f071c501SMasahiro Yamada 	    s->unzftab[s->seqToUnseq[uc]]++;
520*f071c501SMasahiro Yamada 	    if (s->smallDecompress)
521*f071c501SMasahiro Yamada 	       s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
522*f071c501SMasahiro Yamada 	       s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
523*f071c501SMasahiro Yamada 	    nblock++;
524*f071c501SMasahiro Yamada 
525*f071c501SMasahiro Yamada 	    GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
526*f071c501SMasahiro Yamada 	    continue;
527*f071c501SMasahiro Yamada 	 }
528*f071c501SMasahiro Yamada       }
529*f071c501SMasahiro Yamada 
530*f071c501SMasahiro Yamada       /* Now we know what nblock is, we can do a better sanity
531*f071c501SMasahiro Yamada 	 check on s->origPtr.
532*f071c501SMasahiro Yamada       */
533*f071c501SMasahiro Yamada       if (s->origPtr < 0 || s->origPtr >= nblock)
534*f071c501SMasahiro Yamada 	 RETURN(BZ_DATA_ERROR);
535*f071c501SMasahiro Yamada 
536*f071c501SMasahiro Yamada       s->state_out_len = 0;
537*f071c501SMasahiro Yamada       s->state_out_ch  = 0;
538*f071c501SMasahiro Yamada       BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
539*f071c501SMasahiro Yamada       s->state = BZ_X_OUTPUT;
540*f071c501SMasahiro Yamada       if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
541*f071c501SMasahiro Yamada 
542*f071c501SMasahiro Yamada       /*-- Set up cftab to facilitate generation of T^(-1) --*/
543*f071c501SMasahiro Yamada       s->cftab[0] = 0;
544*f071c501SMasahiro Yamada       for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
545*f071c501SMasahiro Yamada       for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
546*f071c501SMasahiro Yamada 
547*f071c501SMasahiro Yamada       if (s->smallDecompress) {
548*f071c501SMasahiro Yamada 
549*f071c501SMasahiro Yamada 	 /*-- Make a copy of cftab, used in generation of T --*/
550*f071c501SMasahiro Yamada 	 for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
551*f071c501SMasahiro Yamada 
552*f071c501SMasahiro Yamada 	 /*-- compute the T vector --*/
553*f071c501SMasahiro Yamada 	 for (i = 0; i < nblock; i++) {
554*f071c501SMasahiro Yamada 	    uc = (UChar)(s->ll16[i]);
555*f071c501SMasahiro Yamada 	    SET_LL(i, s->cftabCopy[uc]);
556*f071c501SMasahiro Yamada 	    s->cftabCopy[uc]++;
557*f071c501SMasahiro Yamada 	 }
558*f071c501SMasahiro Yamada 
559*f071c501SMasahiro Yamada 	 /*-- Compute T^(-1) by pointer reversal on T --*/
560*f071c501SMasahiro Yamada 	 i = s->origPtr;
561*f071c501SMasahiro Yamada 	 j = GET_LL(i);
562*f071c501SMasahiro Yamada 	 do {
563*f071c501SMasahiro Yamada 	    Int32 tmp = GET_LL(j);
564*f071c501SMasahiro Yamada 	    SET_LL(j, i);
565*f071c501SMasahiro Yamada 	    i = j;
566*f071c501SMasahiro Yamada 	    j = tmp;
567*f071c501SMasahiro Yamada 	 }
568*f071c501SMasahiro Yamada 	    while (i != s->origPtr);
569*f071c501SMasahiro Yamada 
570*f071c501SMasahiro Yamada #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
571*f071c501SMasahiro Yamada 	WATCHDOG_RESET();
572*f071c501SMasahiro Yamada #endif
573*f071c501SMasahiro Yamada 	 s->tPos = s->origPtr;
574*f071c501SMasahiro Yamada 	 s->nblock_used = 0;
575*f071c501SMasahiro Yamada 	 if (s->blockRandomised) {
576*f071c501SMasahiro Yamada 	    BZ_RAND_INIT_MASK;
577*f071c501SMasahiro Yamada 	    BZ_GET_SMALL(s->k0); s->nblock_used++;
578*f071c501SMasahiro Yamada 	    BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
579*f071c501SMasahiro Yamada 	 } else {
580*f071c501SMasahiro Yamada 	    BZ_GET_SMALL(s->k0); s->nblock_used++;
581*f071c501SMasahiro Yamada 	 }
582*f071c501SMasahiro Yamada 
583*f071c501SMasahiro Yamada       } else {
584*f071c501SMasahiro Yamada 
585*f071c501SMasahiro Yamada #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
586*f071c501SMasahiro Yamada 	WATCHDOG_RESET();
587*f071c501SMasahiro Yamada #endif
588*f071c501SMasahiro Yamada 	 /*-- compute the T^(-1) vector --*/
589*f071c501SMasahiro Yamada 	 for (i = 0; i < nblock; i++) {
590*f071c501SMasahiro Yamada 	    uc = (UChar)(s->tt[i] & 0xff);
591*f071c501SMasahiro Yamada 	    s->tt[s->cftab[uc]] |= (i << 8);
592*f071c501SMasahiro Yamada 	    s->cftab[uc]++;
593*f071c501SMasahiro Yamada 	 }
594*f071c501SMasahiro Yamada 
595*f071c501SMasahiro Yamada 	 s->tPos = s->tt[s->origPtr] >> 8;
596*f071c501SMasahiro Yamada 	 s->nblock_used = 0;
597*f071c501SMasahiro Yamada 	 if (s->blockRandomised) {
598*f071c501SMasahiro Yamada 	    BZ_RAND_INIT_MASK;
599*f071c501SMasahiro Yamada 	    BZ_GET_FAST(s->k0); s->nblock_used++;
600*f071c501SMasahiro Yamada 	    BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
601*f071c501SMasahiro Yamada 	 } else {
602*f071c501SMasahiro Yamada 	    BZ_GET_FAST(s->k0); s->nblock_used++;
603*f071c501SMasahiro Yamada 	 }
604*f071c501SMasahiro Yamada 
605*f071c501SMasahiro Yamada       }
606*f071c501SMasahiro Yamada 
607*f071c501SMasahiro Yamada       RETURN(BZ_OK);
608*f071c501SMasahiro Yamada 
609*f071c501SMasahiro Yamada 
610*f071c501SMasahiro Yamada     endhdr_2:
611*f071c501SMasahiro Yamada 
612*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ENDHDR_2, uc);
613*f071c501SMasahiro Yamada       if (uc != 0x72) RETURN(BZ_DATA_ERROR);
614*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ENDHDR_3, uc);
615*f071c501SMasahiro Yamada       if (uc != 0x45) RETURN(BZ_DATA_ERROR);
616*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ENDHDR_4, uc);
617*f071c501SMasahiro Yamada       if (uc != 0x38) RETURN(BZ_DATA_ERROR);
618*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ENDHDR_5, uc);
619*f071c501SMasahiro Yamada       if (uc != 0x50) RETURN(BZ_DATA_ERROR);
620*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_ENDHDR_6, uc);
621*f071c501SMasahiro Yamada       if (uc != 0x90) RETURN(BZ_DATA_ERROR);
622*f071c501SMasahiro Yamada 
623*f071c501SMasahiro Yamada       s->storedCombinedCRC = 0;
624*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_CCRC_1, uc);
625*f071c501SMasahiro Yamada       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
626*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_CCRC_2, uc);
627*f071c501SMasahiro Yamada       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
628*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_CCRC_3, uc);
629*f071c501SMasahiro Yamada       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
630*f071c501SMasahiro Yamada       GET_UCHAR(BZ_X_CCRC_4, uc);
631*f071c501SMasahiro Yamada       s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
632*f071c501SMasahiro Yamada 
633*f071c501SMasahiro Yamada       s->state = BZ_X_IDLE;
634*f071c501SMasahiro Yamada       RETURN(BZ_STREAM_END);
635*f071c501SMasahiro Yamada 
636*f071c501SMasahiro Yamada       default: AssertH ( False, 4001 );
637*f071c501SMasahiro Yamada    }
638*f071c501SMasahiro Yamada 
639*f071c501SMasahiro Yamada    AssertH ( False, 4002 );
640*f071c501SMasahiro Yamada 
641*f071c501SMasahiro Yamada    save_state_and_return:
642*f071c501SMasahiro Yamada 
643*f071c501SMasahiro Yamada    s->save_i           = i;
644*f071c501SMasahiro Yamada    s->save_j           = j;
645*f071c501SMasahiro Yamada    s->save_t           = t;
646*f071c501SMasahiro Yamada    s->save_alphaSize   = alphaSize;
647*f071c501SMasahiro Yamada    s->save_nGroups     = nGroups;
648*f071c501SMasahiro Yamada    s->save_nSelectors  = nSelectors;
649*f071c501SMasahiro Yamada    s->save_EOB         = EOB;
650*f071c501SMasahiro Yamada    s->save_groupNo     = groupNo;
651*f071c501SMasahiro Yamada    s->save_groupPos    = groupPos;
652*f071c501SMasahiro Yamada    s->save_nextSym     = nextSym;
653*f071c501SMasahiro Yamada    s->save_nblockMAX   = nblockMAX;
654*f071c501SMasahiro Yamada    s->save_nblock      = nblock;
655*f071c501SMasahiro Yamada    s->save_es          = es;
656*f071c501SMasahiro Yamada    s->save_N           = N;
657*f071c501SMasahiro Yamada    s->save_curr        = curr;
658*f071c501SMasahiro Yamada    s->save_zt          = zt;
659*f071c501SMasahiro Yamada    s->save_zn          = zn;
660*f071c501SMasahiro Yamada    s->save_zvec        = zvec;
661*f071c501SMasahiro Yamada    s->save_zj          = zj;
662*f071c501SMasahiro Yamada    s->save_gSel        = gSel;
663*f071c501SMasahiro Yamada    s->save_gMinlen     = gMinlen;
664*f071c501SMasahiro Yamada    s->save_gLimit      = gLimit;
665*f071c501SMasahiro Yamada    s->save_gBase       = gBase;
666*f071c501SMasahiro Yamada    s->save_gPerm       = gPerm;
667*f071c501SMasahiro Yamada 
668*f071c501SMasahiro Yamada    return retVal;
669*f071c501SMasahiro Yamada }
670*f071c501SMasahiro Yamada 
671*f071c501SMasahiro Yamada 
672*f071c501SMasahiro Yamada /*-------------------------------------------------------------*/
673*f071c501SMasahiro Yamada /*--- end                                      decompress.c ---*/
674*f071c501SMasahiro Yamada /*-------------------------------------------------------------*/
675