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