xref: /onnv-gate/usr/src/common/bzip2/decompress.c (revision 10843:eb166ea6e74e)
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