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