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