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