1 /* $NetBSD: inflate.c,v 1.4 2007/12/22 00:52:03 tsutsui Exp $ */ 2 3 /* inflate.c -- zlib decompression 4 * Copyright (C) 1995-2005 Mark Adler 5 * For conditions of distribution and use, see copyright notice in zlib.h 6 */ 7 8 /* 9 * Change history: 10 * 11 * 1.2.beta0 24 Nov 2002 12 * - First version -- complete rewrite of inflate to simplify code, avoid 13 * creation of window when not needed, minimize use of window when it is 14 * needed, make inffast.c even faster, implement gzip decoding, and to 15 * improve code readability and style over the previous zlib inflate code 16 * 17 * 1.2.beta1 25 Nov 2002 18 * - Use pointers for available input and output checking in inffast.c 19 * - Remove input and output counters in inffast.c 20 * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 21 * - Remove unnecessary second byte pull from length extra in inffast.c 22 * - Unroll direct copy to three copies per loop in inffast.c 23 * 24 * 1.2.beta2 4 Dec 2002 25 * - Change external routine names to reduce potential conflicts 26 * - Correct filename to inffixed.h for fixed tables in inflate.c 27 * - Make hbuf[] unsigned char to match parameter type in inflate.c 28 * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) 29 * to avoid negation problem on Alphas (64 bit) in inflate.c 30 * 31 * 1.2.beta3 22 Dec 2002 32 * - Add comments on state->bits assertion in inffast.c 33 * - Add comments on op field in inftrees.h 34 * - Fix bug in reuse of allocated window after inflateReset() 35 * - Remove bit fields--back to byte structure for speed 36 * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths 37 * - Change post-increments to pre-increments in inflate_fast(), PPC biased? 38 * - Add compile time option, POSTINC, to use post-increments instead (Intel?) 39 * - Make MATCH copy in inflate() much faster for when inflate_fast() not used 40 * - Use local copies of stream next and avail values, as well as local bit 41 * buffer and bit count in inflate()--for speed when inflate_fast() not used 42 * 43 * 1.2.beta4 1 Jan 2003 44 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings 45 * - Move a comment on output buffer sizes from inffast.c to inflate.c 46 * - Add comments in inffast.c to introduce the inflate_fast() routine 47 * - Rearrange window copies in inflate_fast() for speed and simplification 48 * - Unroll last copy for window match in inflate_fast() 49 * - Use local copies of window variables in inflate_fast() for speed 50 * - Pull out common write == 0 case for speed in inflate_fast() 51 * - Make op and len in inflate_fast() unsigned for consistency 52 * - Add FAR to lcode and dcode declarations in inflate_fast() 53 * - Simplified bad distance check in inflate_fast() 54 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new 55 * source file infback.c to provide a call-back interface to inflate for 56 * programs like gzip and unzip -- uses window as output buffer to avoid 57 * window copying 58 * 59 * 1.2.beta5 1 Jan 2003 60 * - Improved inflateBack() interface to allow the caller to provide initial 61 * input in strm. 62 * - Fixed stored blocks bug in inflateBack() 63 * 64 * 1.2.beta6 4 Jan 2003 65 * - Added comments in inffast.c on effectiveness of POSTINC 66 * - Typecasting all around to reduce compiler warnings 67 * - Changed loops from while (1) or do {} while (1) to for (;;), again to 68 * make compilers happy 69 * - Changed type of window in inflateBackInit() to unsigned char * 70 * 71 * 1.2.beta7 27 Jan 2003 72 * - Changed many types to unsigned or unsigned short to avoid warnings 73 * - Added inflateCopy() function 74 * 75 * 1.2.0 9 Mar 2003 76 * - Changed inflateBack() interface to provide separate opaque descriptors 77 * for the in() and out() functions 78 * - Changed inflateBack() argument and in_func typedef to swap the length 79 * and buffer address return values for the input function 80 * - Check next_in and next_out for Z_NULL on entry to inflate() 81 * 82 * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. 83 */ 84 85 #include "zutil.h" 86 #include "inftrees.h" 87 #include "inflate.h" 88 #include "inffast.h" 89 90 #ifdef MAKEFIXED 91 # ifndef BUILDFIXED 92 # define BUILDFIXED 93 # endif 94 #endif 95 96 /* function prototypes */ 97 local void fixedtables OF((struct inflate_state FAR *state)); 98 local int updatewindow OF((z_streamp strm, unsigned out)); 99 #ifdef BUILDFIXED 100 void makefixed OF((void)); 101 #endif 102 local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, 103 unsigned len)); 104 105 int ZEXPORT inflateReset(strm) 106 z_streamp strm; 107 { 108 struct inflate_state FAR *state; 109 110 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 111 state = (struct inflate_state FAR *)strm->state; 112 strm->total_in = strm->total_out = state->total = 0; 113 strm->msg = Z_NULL; 114 strm->adler = 1; /* to support ill-conceived Java test suite */ 115 state->mode = HEAD; 116 state->last = 0; 117 state->havedict = 0; 118 state->dmax = 32768U; 119 state->head = Z_NULL; 120 state->wsize = 0; 121 state->whave = 0; 122 state->write = 0; 123 state->hold = 0; 124 state->bits = 0; 125 state->lencode = state->distcode = state->next = state->codes; 126 Tracev((stderr, "inflate: reset\n")); 127 return Z_OK; 128 } 129 130 int ZEXPORT inflatePrime(strm, bits, value) 131 z_streamp strm; 132 int bits; 133 int value; 134 { 135 struct inflate_state FAR *state; 136 137 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 138 state = (struct inflate_state FAR *)strm->state; 139 if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; 140 value &= (1L << bits) - 1; 141 state->hold += value << state->bits; 142 state->bits += bits; 143 return Z_OK; 144 } 145 146 int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) 147 z_streamp strm; 148 int windowBits; 149 const char *version; 150 int stream_size; 151 { 152 struct inflate_state FAR *state; 153 154 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || 155 stream_size != (int)(sizeof(z_stream))) 156 return Z_VERSION_ERROR; 157 if (strm == Z_NULL) return Z_STREAM_ERROR; 158 strm->msg = Z_NULL; /* in case we return an error */ 159 if (strm->zalloc == (alloc_func)0) { 160 strm->zalloc = zcalloc; 161 strm->opaque = (voidpf)0; 162 } 163 if (strm->zfree == (free_func)0) strm->zfree = zcfree; 164 state = (struct inflate_state FAR *) 165 ZALLOC(strm, 1, sizeof(struct inflate_state)); 166 if (state == Z_NULL) return Z_MEM_ERROR; 167 Tracev((stderr, "inflate: allocated\n")); 168 strm->state = (struct internal_state FAR *)state; 169 if (windowBits < 0) { 170 state->wrap = 0; 171 windowBits = -windowBits; 172 } 173 else { 174 state->wrap = (windowBits >> 4) + 1; 175 #ifdef GUNZIP 176 if (windowBits < 48) windowBits &= 15; 177 #endif 178 } 179 if (windowBits < 8 || windowBits > 15) { 180 ZFREE(strm, state); 181 strm->state = Z_NULL; 182 return Z_STREAM_ERROR; 183 } 184 state->wbits = (unsigned)windowBits; 185 state->window = Z_NULL; 186 return inflateReset(strm); 187 } 188 189 int ZEXPORT inflateInit_(strm, version, stream_size) 190 z_streamp strm; 191 const char *version; 192 int stream_size; 193 { 194 return inflateInit2_(strm, DEF_WBITS, version, stream_size); 195 } 196 197 /* 198 Return state with length and distance decoding tables and index sizes set to 199 fixed code decoding. Normally this returns fixed tables from inffixed.h. 200 If BUILDFIXED is defined, then instead this routine builds the tables the 201 first time it's called, and returns those tables the first time and 202 thereafter. This reduces the size of the code by about 2K bytes, in 203 exchange for a little execution time. However, BUILDFIXED should not be 204 used for threaded applications, since the rewriting of the tables and virgin 205 may not be thread-safe. 206 */ 207 local void fixedtables(state) 208 struct inflate_state FAR *state; 209 { 210 #ifdef BUILDFIXED 211 static int virgin = 1; 212 static code *lenfix, *distfix; 213 static code fixed[544]; 214 215 /* build fixed huffman tables if first call (may not be thread safe) */ 216 if (virgin) { 217 unsigned sym, bits; 218 static code *next; 219 220 /* literal/length table */ 221 sym = 0; 222 while (sym < 144) state->lens[sym++] = 8; 223 while (sym < 256) state->lens[sym++] = 9; 224 while (sym < 280) state->lens[sym++] = 7; 225 while (sym < 288) state->lens[sym++] = 8; 226 next = fixed; 227 lenfix = next; 228 bits = 9; 229 inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); 230 231 /* distance table */ 232 sym = 0; 233 while (sym < 32) state->lens[sym++] = 5; 234 distfix = next; 235 bits = 5; 236 inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); 237 238 /* do this just once */ 239 virgin = 0; 240 } 241 #else /* !BUILDFIXED */ 242 # include "inffixed.h" 243 #endif /* BUILDFIXED */ 244 state->lencode = lenfix; 245 state->lenbits = 9; 246 state->distcode = distfix; 247 state->distbits = 5; 248 } 249 250 #ifdef MAKEFIXED 251 #include <stdio.h> 252 253 /* 254 Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also 255 defines BUILDFIXED, so the tables are built on the fly. makefixed() writes 256 those tables to stdout, which would be piped to inffixed.h. A small program 257 can simply call makefixed to do this: 258 259 void makefixed(void); 260 261 int main(void) 262 { 263 makefixed(); 264 return 0; 265 } 266 267 Then that can be linked with zlib built with MAKEFIXED defined and run: 268 269 a.out > inffixed.h 270 */ 271 void makefixed() 272 { 273 unsigned low, size; 274 struct inflate_state state; 275 276 fixedtables(&state); 277 puts(" /* inffixed.h -- table for decoding fixed codes"); 278 puts(" * Generated automatically by makefixed()."); 279 puts(" */"); 280 puts(""); 281 puts(" /* WARNING: this file should *not* be used by applications."); 282 puts(" It is part of the implementation of this library and is"); 283 puts(" subject to change. Applications should only use zlib.h."); 284 puts(" */"); 285 puts(""); 286 size = 1U << 9; 287 printf(" static const code lenfix[%u] = {", size); 288 low = 0; 289 for (;;) { 290 if ((low % 7) == 0) printf("\n "); 291 printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, 292 state.lencode[low].val); 293 if (++low == size) break; 294 putchar(','); 295 } 296 puts("\n };"); 297 size = 1U << 5; 298 printf("\n static const code distfix[%u] = {", size); 299 low = 0; 300 for (;;) { 301 if ((low % 6) == 0) printf("\n "); 302 printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, 303 state.distcode[low].val); 304 if (++low == size) break; 305 putchar(','); 306 } 307 puts("\n };"); 308 } 309 #endif /* MAKEFIXED */ 310 311 /* 312 Update the window with the last wsize (normally 32K) bytes written before 313 returning. If window does not exist yet, create it. This is only called 314 when a window is already in use, or when output has been written during this 315 inflate call, but the end of the deflate stream has not been reached yet. 316 It is also called to create a window for dictionary data when a dictionary 317 is loaded. 318 319 Providing output buffers larger than 32K to inflate() should provide a speed 320 advantage, since only the last 32K of output is copied to the sliding window 321 upon return from inflate(), and since all distances after the first 32K of 322 output will fall in the output data, making match copies simpler and faster. 323 The advantage may be dependent on the size of the processor's data caches. 324 */ 325 local int updatewindow(strm, out) 326 z_streamp strm; 327 unsigned out; 328 { 329 struct inflate_state FAR *state; 330 unsigned copy, dist; 331 332 state = (struct inflate_state FAR *)strm->state; 333 334 /* if it hasn't been done already, allocate space for the window */ 335 if (state->window == Z_NULL) { 336 state->window = (unsigned char FAR *) 337 ZALLOC(strm, 1U << state->wbits, 338 sizeof(unsigned char)); 339 if (state->window == Z_NULL) return 1; 340 } 341 342 /* if window not in use yet, initialize */ 343 if (state->wsize == 0) { 344 state->wsize = 1U << state->wbits; 345 state->write = 0; 346 state->whave = 0; 347 } 348 349 /* copy state->wsize or less output bytes into the circular window */ 350 copy = out - strm->avail_out; 351 if (copy >= state->wsize) { 352 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); 353 state->write = 0; 354 state->whave = state->wsize; 355 } 356 else { 357 dist = state->wsize - state->write; 358 if (dist > copy) dist = copy; 359 zmemcpy(state->window + state->write, strm->next_out - copy, dist); 360 copy -= dist; 361 if (copy) { 362 zmemcpy(state->window, strm->next_out - copy, copy); 363 state->write = copy; 364 state->whave = state->wsize; 365 } 366 else { 367 state->write += dist; 368 if (state->write == state->wsize) state->write = 0; 369 if (state->whave < state->wsize) state->whave += dist; 370 } 371 } 372 return 0; 373 } 374 375 /* Macros for inflate(): */ 376 377 /* check function to use adler32() for zlib or crc32() for gzip */ 378 #ifdef GUNZIP 379 # define UPDATE(check, buf, len) \ 380 (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) 381 #else 382 # define UPDATE(check, buf, len) adler32(check, buf, len) 383 #endif 384 385 /* check macros for header crc */ 386 #ifdef GUNZIP 387 # define CRC2(check, word) \ 388 do { \ 389 hbuf[0] = (unsigned char)(word); \ 390 hbuf[1] = (unsigned char)((word) >> 8); \ 391 check = crc32(check, hbuf, 2); \ 392 } while (0) 393 394 # define CRC4(check, word) \ 395 do { \ 396 hbuf[0] = (unsigned char)(word); \ 397 hbuf[1] = (unsigned char)((word) >> 8); \ 398 hbuf[2] = (unsigned char)((word) >> 16); \ 399 hbuf[3] = (unsigned char)((word) >> 24); \ 400 check = crc32(check, hbuf, 4); \ 401 } while (0) 402 #endif 403 404 /* Load registers with state in inflate() for speed */ 405 #define LOAD() \ 406 do { \ 407 put = strm->next_out; \ 408 left = strm->avail_out; \ 409 next = strm->next_in; \ 410 have = strm->avail_in; \ 411 hold = state->hold; \ 412 bits = state->bits; \ 413 } while (0) 414 415 /* Restore state from registers in inflate() */ 416 #define RESTORE() \ 417 do { \ 418 strm->next_out = put; \ 419 strm->avail_out = left; \ 420 strm->next_in = next; \ 421 strm->avail_in = have; \ 422 state->hold = hold; \ 423 state->bits = bits; \ 424 } while (0) 425 426 /* Clear the input bit accumulator */ 427 #define INITBITS() \ 428 do { \ 429 hold = 0; \ 430 bits = 0; \ 431 } while (0) 432 433 /* Get a byte of input into the bit accumulator, or return from inflate() 434 if there is no input available. */ 435 #define PULLBYTE() \ 436 do { \ 437 if (have == 0) goto inf_leave; \ 438 have--; \ 439 hold += (unsigned long)(*next++) << bits; \ 440 bits += 8; \ 441 } while (0) 442 443 /* Assure that there are at least n bits in the bit accumulator. If there is 444 not enough available input to do that, then return from inflate(). */ 445 #define NEEDBITS(n) \ 446 do { \ 447 while (bits < (unsigned)(n)) \ 448 PULLBYTE(); \ 449 } while (0) 450 451 /* Return the low n bits of the bit accumulator (n < 16) */ 452 #define BITS(n) \ 453 ((unsigned)hold & ((1U << (n)) - 1)) 454 455 /* Remove n bits from the bit accumulator */ 456 #define DROPBITS(n) \ 457 do { \ 458 hold >>= (n); \ 459 bits -= (unsigned)(n); \ 460 } while (0) 461 462 /* Remove zero to seven bits as needed to go to a byte boundary */ 463 #define BYTEBITS() \ 464 do { \ 465 hold >>= bits & 7; \ 466 bits -= bits & 7; \ 467 } while (0) 468 469 /* Reverse the bytes in a 32-bit value */ 470 #define REVERSE(q) \ 471 ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ 472 (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) 473 474 /* 475 inflate() uses a state machine to process as much input data and generate as 476 much output data as possible before returning. The state machine is 477 structured roughly as follows: 478 479 for (;;) switch (state) { 480 ... 481 case STATEn: 482 if (not enough input data or output space to make progress) 483 return; 484 ... make progress ... 485 state = STATEm; 486 break; 487 ... 488 } 489 490 so when inflate() is called again, the same case is attempted again, and 491 if the appropriate resources are provided, the machine proceeds to the 492 next state. The NEEDBITS() macro is usually the way the state evaluates 493 whether it can proceed or should return. NEEDBITS() does the return if 494 the requested bits are not available. The typical use of the BITS macros 495 is: 496 497 NEEDBITS(n); 498 ... do something with BITS(n) ... 499 DROPBITS(n); 500 501 where NEEDBITS(n) either returns from inflate() if there isn't enough 502 input left to load n bits into the accumulator, or it continues. BITS(n) 503 gives the low n bits in the accumulator. When done, DROPBITS(n) drops 504 the low n bits off the accumulator. INITBITS() clears the accumulator 505 and sets the number of available bits to zero. BYTEBITS() discards just 506 enough bits to put the accumulator on a byte boundary. After BYTEBITS() 507 and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. 508 509 NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return 510 if there is no input available. The decoding of variable length codes uses 511 PULLBYTE() directly in order to pull just enough bytes to decode the next 512 code, and no more. 513 514 Some states loop until they get enough input, making sure that enough 515 state information is maintained to continue the loop where it left off 516 if NEEDBITS() returns in the loop. For example, want, need, and keep 517 would all have to actually be part of the saved state in case NEEDBITS() 518 returns: 519 520 case STATEw: 521 while (want < need) { 522 NEEDBITS(n); 523 keep[want++] = BITS(n); 524 DROPBITS(n); 525 } 526 state = STATEx; 527 case STATEx: 528 529 As shown above, if the next state is also the next case, then the break 530 is omitted. 531 532 A state may also return if there is not enough output space available to 533 complete that state. Those states are copying stored data, writing a 534 literal byte, and copying a matching string. 535 536 When returning, a "goto inf_leave" is used to update the total counters, 537 update the check value, and determine whether any progress has been made 538 during that inflate() call in order to return the proper return code. 539 Progress is defined as a change in either strm->avail_in or strm->avail_out. 540 When there is a window, goto inf_leave will update the window with the last 541 output written. If a goto inf_leave occurs in the middle of decompression 542 and there is no window currently, goto inf_leave will create one and copy 543 output to the window for the next call of inflate(). 544 545 In this implementation, the flush parameter of inflate() only affects the 546 return code (per zlib.h). inflate() always writes as much as possible to 547 strm->next_out, given the space available and the provided input--the effect 548 documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers 549 the allocation of and copying into a sliding window until necessary, which 550 provides the effect documented in zlib.h for Z_FINISH when the entire input 551 stream available. So the only thing the flush parameter actually does is: 552 when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it 553 will return Z_BUF_ERROR if it has not reached the end of the stream. 554 */ 555 556 int ZEXPORT inflate(strm, flush) 557 z_streamp strm; 558 int flush; 559 { 560 struct inflate_state FAR *state; 561 unsigned char FAR *next; /* next input */ 562 unsigned char FAR *put; /* next output */ 563 unsigned have, left; /* available input and output */ 564 unsigned long hold; /* bit buffer */ 565 unsigned bits; /* bits in bit buffer */ 566 unsigned in, out; /* save starting available input and output */ 567 unsigned copy; /* number of stored or match bytes to copy */ 568 unsigned char FAR *from; /* where to copy match bytes from */ 569 code this; /* current decoding table entry */ 570 code last; /* parent table entry */ 571 unsigned len; /* length to copy for repeats, bits to drop */ 572 int ret; /* return code */ 573 #ifdef GUNZIP 574 unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ 575 #endif 576 static const unsigned short order[19] = /* permutation of code lengths */ 577 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 578 579 #if defined(__NetBSD__) && defined(_STANDALONE) 580 /* Some kernels are loaded at address 0x0 so strm->next_out could be NULL */ 581 if (strm == Z_NULL || strm->state == Z_NULL || 582 (strm->next_in == Z_NULL && strm->avail_in != 0)) 583 return Z_STREAM_ERROR; 584 #else 585 if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || 586 (strm->next_in == Z_NULL && strm->avail_in != 0)) 587 return Z_STREAM_ERROR; 588 #endif 589 590 state = (struct inflate_state FAR *)strm->state; 591 if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ 592 LOAD(); 593 in = have; 594 out = left; 595 ret = Z_OK; 596 for (;;) 597 switch (state->mode) { 598 case HEAD: 599 if (state->wrap == 0) { 600 state->mode = TYPEDO; 601 break; 602 } 603 NEEDBITS(16); 604 #ifdef GUNZIP 605 if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ 606 state->check = crc32(0L, Z_NULL, 0); 607 CRC2(state->check, hold); 608 INITBITS(); 609 state->mode = FLAGS; 610 break; 611 } 612 state->flags = 0; /* expect zlib header */ 613 if (state->head != Z_NULL) 614 state->head->done = -1; 615 if (!(state->wrap & 1) || /* check if zlib header allowed */ 616 #else 617 if ( 618 #endif 619 ((BITS(8) << 8) + (hold >> 8)) % 31) { 620 strm->msg = __UNCONST("incorrect header check"); 621 state->mode = BAD; 622 break; 623 } 624 if (BITS(4) != Z_DEFLATED) { 625 strm->msg = __UNCONST("unknown compression method"); 626 state->mode = BAD; 627 break; 628 } 629 DROPBITS(4); 630 len = BITS(4) + 8; 631 if (len > state->wbits) { 632 strm->msg = __UNCONST("invalid window size"); 633 state->mode = BAD; 634 break; 635 } 636 state->dmax = 1U << len; 637 Tracev((stderr, "inflate: zlib header ok\n")); 638 strm->adler = state->check = adler32(0L, Z_NULL, 0); 639 state->mode = hold & 0x200 ? DICTID : TYPE; 640 INITBITS(); 641 break; 642 #ifdef GUNZIP 643 case FLAGS: 644 NEEDBITS(16); 645 state->flags = (int)(hold); 646 if ((state->flags & 0xff) != Z_DEFLATED) { 647 strm->msg = __UNCONST("unknown compression method"); 648 state->mode = BAD; 649 break; 650 } 651 if (state->flags & 0xe000) { 652 strm->msg = __UNCONST("unknown header flags set"); 653 state->mode = BAD; 654 break; 655 } 656 if (state->head != Z_NULL) 657 state->head->text = (int)((hold >> 8) & 1); 658 if (state->flags & 0x0200) CRC2(state->check, hold); 659 INITBITS(); 660 state->mode = TIME; 661 case TIME: 662 NEEDBITS(32); 663 if (state->head != Z_NULL) 664 state->head->time = hold; 665 if (state->flags & 0x0200) CRC4(state->check, hold); 666 INITBITS(); 667 state->mode = OS; 668 case OS: 669 NEEDBITS(16); 670 if (state->head != Z_NULL) { 671 state->head->xflags = (int)(hold & 0xff); 672 state->head->os = (int)(hold >> 8); 673 } 674 if (state->flags & 0x0200) CRC2(state->check, hold); 675 INITBITS(); 676 state->mode = EXLEN; 677 case EXLEN: 678 if (state->flags & 0x0400) { 679 NEEDBITS(16); 680 state->length = (unsigned)(hold); 681 if (state->head != Z_NULL) 682 state->head->extra_len = (unsigned)hold; 683 if (state->flags & 0x0200) CRC2(state->check, hold); 684 INITBITS(); 685 } 686 else if (state->head != Z_NULL) 687 state->head->extra = Z_NULL; 688 state->mode = EXTRA; 689 case EXTRA: 690 if (state->flags & 0x0400) { 691 copy = state->length; 692 if (copy > have) copy = have; 693 if (copy) { 694 if (state->head != Z_NULL && 695 state->head->extra != Z_NULL) { 696 len = state->head->extra_len - state->length; 697 Assert (next != NULL, "next is null"); 698 zmemcpy(state->head->extra + len, next, 699 len + copy > state->head->extra_max ? 700 state->head->extra_max - len : copy); 701 } 702 if (state->flags & 0x0200) 703 state->check = crc32(state->check, next, copy); 704 have -= copy; 705 next += copy; 706 state->length -= copy; 707 } 708 if (state->length) goto inf_leave; 709 } 710 state->length = 0; 711 state->mode = NAME; 712 case NAME: 713 if (state->flags & 0x0800) { 714 if (have == 0) goto inf_leave; 715 copy = 0; 716 do { 717 len = (unsigned)(next[copy++]); 718 if (state->head != Z_NULL && 719 state->head->name != Z_NULL && 720 state->length < state->head->name_max) 721 state->head->name[state->length++] = len; 722 } while (len && copy < have); 723 if (state->flags & 0x0200) 724 state->check = crc32(state->check, next, copy); 725 have -= copy; 726 next += copy; 727 if (len) goto inf_leave; 728 } 729 else if (state->head != Z_NULL) 730 state->head->name = Z_NULL; 731 state->length = 0; 732 state->mode = COMMENT; 733 case COMMENT: 734 if (state->flags & 0x1000) { 735 if (have == 0) goto inf_leave; 736 copy = 0; 737 do { 738 len = (unsigned)(next[copy++]); 739 if (state->head != Z_NULL && 740 state->head->comment != Z_NULL && 741 state->length < state->head->comm_max) 742 state->head->comment[state->length++] = len; 743 } while (len && copy < have); 744 if (state->flags & 0x0200) 745 state->check = crc32(state->check, next, copy); 746 have -= copy; 747 next += copy; 748 if (len) goto inf_leave; 749 } 750 else if (state->head != Z_NULL) 751 state->head->comment = Z_NULL; 752 state->mode = HCRC; 753 case HCRC: 754 if (state->flags & 0x0200) { 755 NEEDBITS(16); 756 if (hold != (state->check & 0xffff)) { 757 strm->msg = __UNCONST("header crc mismatch"); 758 state->mode = BAD; 759 break; 760 } 761 INITBITS(); 762 } 763 if (state->head != Z_NULL) { 764 state->head->hcrc = (int)((state->flags >> 9) & 1); 765 state->head->done = 1; 766 } 767 strm->adler = state->check = crc32(0L, Z_NULL, 0); 768 state->mode = TYPE; 769 break; 770 #endif 771 case DICTID: 772 NEEDBITS(32); 773 strm->adler = state->check = REVERSE(hold); 774 INITBITS(); 775 state->mode = DICT; 776 case DICT: 777 if (state->havedict == 0) { 778 RESTORE(); 779 return Z_NEED_DICT; 780 } 781 strm->adler = state->check = adler32(0L, Z_NULL, 0); 782 state->mode = TYPE; 783 case TYPE: 784 if (flush == Z_BLOCK) goto inf_leave; 785 case TYPEDO: 786 if (state->last) { 787 BYTEBITS(); 788 state->mode = CHECK; 789 break; 790 } 791 NEEDBITS(3); 792 state->last = BITS(1); 793 DROPBITS(1); 794 switch (BITS(2)) { 795 case 0: /* stored block */ 796 Tracev((stderr, "inflate: stored block%s\n", 797 state->last ? " (last)" : "")); 798 state->mode = STORED; 799 break; 800 case 1: /* fixed block */ 801 fixedtables(state); 802 Tracev((stderr, "inflate: fixed codes block%s\n", 803 state->last ? " (last)" : "")); 804 state->mode = LEN; /* decode codes */ 805 break; 806 case 2: /* dynamic block */ 807 Tracev((stderr, "inflate: dynamic codes block%s\n", 808 state->last ? " (last)" : "")); 809 state->mode = TABLE; 810 break; 811 case 3: 812 strm->msg = __UNCONST("invalid block type"); 813 state->mode = BAD; 814 } 815 DROPBITS(2); 816 break; 817 case STORED: 818 BYTEBITS(); /* go to byte boundary */ 819 NEEDBITS(32); 820 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { 821 strm->msg = __UNCONST("invalid stored block lengths"); 822 state->mode = BAD; 823 break; 824 } 825 state->length = (unsigned)hold & 0xffff; 826 Tracev((stderr, "inflate: stored length %u\n", 827 state->length)); 828 INITBITS(); 829 state->mode = COPY; 830 case COPY: 831 copy = state->length; 832 if (copy) { 833 if (copy > have) copy = have; 834 if (copy > left) copy = left; 835 if (copy == 0) goto inf_leave; 836 zmemcpy(put, next, copy); 837 have -= copy; 838 next += copy; 839 left -= copy; 840 put += copy; 841 state->length -= copy; 842 break; 843 } 844 Tracev((stderr, "inflate: stored end\n")); 845 state->mode = TYPE; 846 break; 847 case TABLE: 848 NEEDBITS(14); 849 state->nlen = BITS(5) + 257; 850 DROPBITS(5); 851 state->ndist = BITS(5) + 1; 852 DROPBITS(5); 853 state->ncode = BITS(4) + 4; 854 DROPBITS(4); 855 #ifndef PKZIP_BUG_WORKAROUND 856 if (state->nlen > 286 || state->ndist > 30) { 857 strm->msg = __UNCONST("too many length or distance symbols"); 858 state->mode = BAD; 859 break; 860 } 861 #endif 862 Tracev((stderr, "inflate: table sizes ok\n")); 863 state->have = 0; 864 state->mode = LENLENS; 865 case LENLENS: 866 while (state->have < state->ncode) { 867 NEEDBITS(3); 868 state->lens[order[state->have++]] = (unsigned short)BITS(3); 869 DROPBITS(3); 870 } 871 while (state->have < 19) 872 state->lens[order[state->have++]] = 0; 873 state->next = state->codes; 874 state->lencode = (code const FAR *)(state->next); 875 state->lenbits = 7; 876 ret = inflate_table(CODES, state->lens, 19, &(state->next), 877 &(state->lenbits), state->work); 878 if (ret) { 879 strm->msg = __UNCONST("invalid code lengths set"); 880 state->mode = BAD; 881 break; 882 } 883 Tracev((stderr, "inflate: code lengths ok\n")); 884 state->have = 0; 885 state->mode = CODELENS; 886 case CODELENS: 887 while (state->have < state->nlen + state->ndist) { 888 for (;;) { 889 this = state->lencode[BITS(state->lenbits)]; 890 if ((unsigned)(this.bits) <= bits) break; 891 PULLBYTE(); 892 } 893 if (this.val < 16) { 894 NEEDBITS(this.bits); 895 DROPBITS(this.bits); 896 state->lens[state->have++] = this.val; 897 } 898 else { 899 if (this.val == 16) { 900 NEEDBITS(this.bits + 2); 901 DROPBITS(this.bits); 902 if (state->have == 0) { 903 strm->msg = __UNCONST("invalid bit length repeat"); 904 state->mode = BAD; 905 break; 906 } 907 len = state->lens[state->have - 1]; 908 copy = 3 + BITS(2); 909 DROPBITS(2); 910 } 911 else if (this.val == 17) { 912 NEEDBITS(this.bits + 3); 913 DROPBITS(this.bits); 914 len = 0; 915 copy = 3 + BITS(3); 916 DROPBITS(3); 917 } 918 else { 919 NEEDBITS(this.bits + 7); 920 DROPBITS(this.bits); 921 len = 0; 922 copy = 11 + BITS(7); 923 DROPBITS(7); 924 } 925 if (state->have + copy > state->nlen + state->ndist) { 926 strm->msg = __UNCONST("invalid bit length repeat"); 927 state->mode = BAD; 928 break; 929 } 930 while (copy--) 931 state->lens[state->have++] = (unsigned short)len; 932 } 933 } 934 935 /* handle error breaks in while */ 936 if (state->mode == BAD) break; 937 938 /* build code tables */ 939 state->next = state->codes; 940 state->lencode = (code const FAR *)(state->next); 941 state->lenbits = 9; 942 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), 943 &(state->lenbits), state->work); 944 if (ret) { 945 strm->msg = __UNCONST("invalid literal/lengths set"); 946 state->mode = BAD; 947 break; 948 } 949 state->distcode = (code const FAR *)(state->next); 950 state->distbits = 6; 951 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, 952 &(state->next), &(state->distbits), state->work); 953 if (ret) { 954 strm->msg = __UNCONST("invalid distances set"); 955 state->mode = BAD; 956 break; 957 } 958 Tracev((stderr, "inflate: codes ok\n")); 959 state->mode = LEN; 960 case LEN: 961 if (have >= 6 && left >= 258) { 962 RESTORE(); 963 inflate_fast(strm, out); 964 LOAD(); 965 break; 966 } 967 for (;;) { 968 this = state->lencode[BITS(state->lenbits)]; 969 if ((unsigned)(this.bits) <= bits) break; 970 PULLBYTE(); 971 } 972 if (this.op && (this.op & 0xf0) == 0) { 973 last = this; 974 for (;;) { 975 this = state->lencode[last.val + 976 (BITS(last.bits + last.op) >> last.bits)]; 977 if ((unsigned)(last.bits + this.bits) <= bits) break; 978 PULLBYTE(); 979 } 980 DROPBITS(last.bits); 981 } 982 DROPBITS(this.bits); 983 state->length = (unsigned)this.val; 984 if ((int)(this.op) == 0) { 985 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? 986 "inflate: literal '%c'\n" : 987 "inflate: literal 0x%02x\n", this.val)); 988 state->mode = LIT; 989 break; 990 } 991 if (this.op & 32) { 992 Tracevv((stderr, "inflate: end of block\n")); 993 state->mode = TYPE; 994 break; 995 } 996 if (this.op & 64) { 997 strm->msg = __UNCONST("invalid literal/length code"); 998 state->mode = BAD; 999 break; 1000 } 1001 state->extra = (unsigned)(this.op) & 15; 1002 state->mode = LENEXT; 1003 case LENEXT: 1004 if (state->extra) { 1005 NEEDBITS(state->extra); 1006 state->length += BITS(state->extra); 1007 DROPBITS(state->extra); 1008 } 1009 Tracevv((stderr, "inflate: length %u\n", state->length)); 1010 state->mode = DIST; 1011 case DIST: 1012 for (;;) { 1013 this = state->distcode[BITS(state->distbits)]; 1014 if ((unsigned)(this.bits) <= bits) break; 1015 PULLBYTE(); 1016 } 1017 if ((this.op & 0xf0) == 0) { 1018 last = this; 1019 for (;;) { 1020 this = state->distcode[last.val + 1021 (BITS(last.bits + last.op) >> last.bits)]; 1022 if ((unsigned)(last.bits + this.bits) <= bits) break; 1023 PULLBYTE(); 1024 } 1025 DROPBITS(last.bits); 1026 } 1027 DROPBITS(this.bits); 1028 if (this.op & 64) { 1029 strm->msg = __UNCONST("invalid distance code"); 1030 state->mode = BAD; 1031 break; 1032 } 1033 state->offset = (unsigned)this.val; 1034 state->extra = (unsigned)(this.op) & 15; 1035 state->mode = DISTEXT; 1036 case DISTEXT: 1037 if (state->extra) { 1038 NEEDBITS(state->extra); 1039 state->offset += BITS(state->extra); 1040 DROPBITS(state->extra); 1041 } 1042 #ifdef INFLATE_STRICT 1043 if (state->offset > state->dmax) { 1044 strm->msg = __UNCONST("invalid distance too far back"); 1045 state->mode = BAD; 1046 break; 1047 } 1048 #endif 1049 if (state->offset > state->whave + out - left) { 1050 strm->msg = __UNCONST("invalid distance too far back"); 1051 state->mode = BAD; 1052 break; 1053 } 1054 Tracevv((stderr, "inflate: distance %u\n", state->offset)); 1055 state->mode = MATCH; 1056 case MATCH: 1057 if (left == 0) goto inf_leave; 1058 copy = out - left; 1059 if (state->offset > copy) { /* copy from window */ 1060 copy = state->offset - copy; 1061 if (copy > state->write) { 1062 copy -= state->write; 1063 from = state->window + (state->wsize - copy); 1064 } 1065 else 1066 from = state->window + (state->write - copy); 1067 if (copy > state->length) copy = state->length; 1068 } 1069 else { /* copy from output */ 1070 from = put - state->offset; 1071 copy = state->length; 1072 } 1073 if (copy > left) copy = left; 1074 left -= copy; 1075 state->length -= copy; 1076 do { 1077 *put++ = *from++; 1078 } while (--copy); 1079 if (state->length == 0) state->mode = LEN; 1080 break; 1081 case LIT: 1082 if (left == 0) goto inf_leave; 1083 *put++ = (unsigned char)(state->length); 1084 left--; 1085 state->mode = LEN; 1086 break; 1087 case CHECK: 1088 if (state->wrap) { 1089 NEEDBITS(32); 1090 out -= left; 1091 strm->total_out += out; 1092 state->total += out; 1093 if (out) 1094 strm->adler = state->check = 1095 UPDATE(state->check, put - out, out); 1096 out = left; 1097 if (( 1098 #ifdef GUNZIP 1099 state->flags ? hold : 1100 #endif 1101 REVERSE(hold)) != state->check) { 1102 strm->msg = __UNCONST("incorrect data check"); 1103 state->mode = BAD; 1104 break; 1105 } 1106 INITBITS(); 1107 Tracev((stderr, "inflate: check matches trailer\n")); 1108 } 1109 #ifdef GUNZIP 1110 state->mode = LENGTH; 1111 case LENGTH: 1112 if (state->wrap && state->flags) { 1113 NEEDBITS(32); 1114 if (hold != (state->total & 0xffffffffUL)) { 1115 strm->msg = __UNCONST("incorrect length check"); 1116 state->mode = BAD; 1117 break; 1118 } 1119 INITBITS(); 1120 Tracev((stderr, "inflate: length matches trailer\n")); 1121 } 1122 #endif 1123 state->mode = DONE; 1124 case DONE: 1125 ret = Z_STREAM_END; 1126 goto inf_leave; 1127 case BAD: 1128 ret = Z_DATA_ERROR; 1129 goto inf_leave; 1130 case MEM: 1131 return Z_MEM_ERROR; 1132 case SYNC: 1133 default: 1134 return Z_STREAM_ERROR; 1135 } 1136 1137 /* 1138 Return from inflate(), updating the total counts and the check value. 1139 If there was no progress during the inflate() call, return a buffer 1140 error. Call updatewindow() to create and/or update the window state. 1141 Note: a memory error from inflate() is non-recoverable. 1142 */ 1143 inf_leave: 1144 RESTORE(); 1145 if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) 1146 if (updatewindow(strm, out)) { 1147 state->mode = MEM; 1148 return Z_MEM_ERROR; 1149 } 1150 in -= strm->avail_in; 1151 out -= strm->avail_out; 1152 strm->total_in += in; 1153 strm->total_out += out; 1154 state->total += out; 1155 if (state->wrap && out) 1156 strm->adler = state->check = 1157 UPDATE(state->check, strm->next_out - out, out); 1158 strm->data_type = state->bits + (state->last ? 64 : 0) + 1159 (state->mode == TYPE ? 128 : 0); 1160 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) 1161 ret = Z_BUF_ERROR; 1162 return ret; 1163 } 1164 1165 int ZEXPORT inflateEnd(strm) 1166 z_streamp strm; 1167 { 1168 struct inflate_state FAR *state; 1169 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) 1170 return Z_STREAM_ERROR; 1171 state = (struct inflate_state FAR *)strm->state; 1172 if (state->window != Z_NULL) ZFREE(strm, state->window); 1173 ZFREE(strm, strm->state); 1174 strm->state = Z_NULL; 1175 Tracev((stderr, "inflate: end\n")); 1176 return Z_OK; 1177 } 1178 1179 int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) 1180 z_streamp strm; 1181 const Bytef *dictionary; 1182 uInt dictLength; 1183 { 1184 struct inflate_state FAR *state; 1185 unsigned long id; 1186 1187 /* check state */ 1188 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1189 state = (struct inflate_state FAR *)strm->state; 1190 if (state->wrap != 0 && state->mode != DICT) 1191 return Z_STREAM_ERROR; 1192 1193 /* check for correct dictionary id */ 1194 if (state->mode == DICT) { 1195 id = adler32(0L, Z_NULL, 0); 1196 id = adler32(id, dictionary, dictLength); 1197 if (id != state->check) 1198 return Z_DATA_ERROR; 1199 } 1200 1201 /* copy dictionary to window */ 1202 if (updatewindow(strm, strm->avail_out)) { 1203 state->mode = MEM; 1204 return Z_MEM_ERROR; 1205 } 1206 if (dictLength > state->wsize) { 1207 zmemcpy(state->window, dictionary + dictLength - state->wsize, 1208 state->wsize); 1209 state->whave = state->wsize; 1210 } 1211 else { 1212 zmemcpy(state->window + state->wsize - dictLength, dictionary, 1213 dictLength); 1214 state->whave = dictLength; 1215 } 1216 state->havedict = 1; 1217 Tracev((stderr, "inflate: dictionary set\n")); 1218 return Z_OK; 1219 } 1220 1221 int ZEXPORT inflateGetHeader(strm, head) 1222 z_streamp strm; 1223 gz_headerp head; 1224 { 1225 struct inflate_state FAR *state; 1226 1227 /* check state */ 1228 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1229 state = (struct inflate_state FAR *)strm->state; 1230 if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; 1231 1232 /* save header structure */ 1233 state->head = head; 1234 head->done = 0; 1235 return Z_OK; 1236 } 1237 1238 /* 1239 Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found 1240 or when out of input. When called, *have is the number of pattern bytes 1241 found in order so far, in 0..3. On return *have is updated to the new 1242 state. If on return *have equals four, then the pattern was found and the 1243 return value is how many bytes were read including the last byte of the 1244 pattern. If *have is less than four, then the pattern has not been found 1245 yet and the return value is len. In the latter case, syncsearch() can be 1246 called again with more data and the *have state. *have is initialized to 1247 zero for the first call. 1248 */ 1249 local unsigned syncsearch(have, buf, len) 1250 unsigned FAR *have; 1251 unsigned char FAR *buf; 1252 unsigned len; 1253 { 1254 unsigned got; 1255 unsigned next; 1256 1257 got = *have; 1258 next = 0; 1259 while (next < len && got < 4) { 1260 if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) 1261 got++; 1262 else if (buf[next]) 1263 got = 0; 1264 else 1265 got = 4 - got; 1266 next++; 1267 } 1268 *have = got; 1269 return next; 1270 } 1271 1272 int ZEXPORT inflateSync(strm) 1273 z_streamp strm; 1274 { 1275 unsigned len; /* number of bytes to look at or looked at */ 1276 unsigned long in, out; /* temporary to save total_in and total_out */ 1277 unsigned char buf[4]; /* to restore bit buffer to byte string */ 1278 struct inflate_state FAR *state; 1279 1280 /* check parameters */ 1281 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1282 state = (struct inflate_state FAR *)strm->state; 1283 if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; 1284 1285 /* if first time, start search in bit buffer */ 1286 if (state->mode != SYNC) { 1287 state->mode = SYNC; 1288 state->hold <<= state->bits & 7; 1289 state->bits -= state->bits & 7; 1290 len = 0; 1291 while (state->bits >= 8) { 1292 buf[len++] = (unsigned char)(state->hold); 1293 state->hold >>= 8; 1294 state->bits -= 8; 1295 } 1296 state->have = 0; 1297 syncsearch(&(state->have), buf, len); 1298 } 1299 1300 /* search available input */ 1301 len = syncsearch(&(state->have), strm->next_in, strm->avail_in); 1302 strm->avail_in -= len; 1303 strm->next_in += len; 1304 strm->total_in += len; 1305 1306 /* return no joy or set up to restart inflate() on a new block */ 1307 if (state->have != 4) return Z_DATA_ERROR; 1308 in = strm->total_in; out = strm->total_out; 1309 inflateReset(strm); 1310 strm->total_in = in; strm->total_out = out; 1311 state->mode = TYPE; 1312 return Z_OK; 1313 } 1314 1315 /* 1316 Returns true if inflate is currently at the end of a block generated by 1317 Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP 1318 implementation to provide an additional safety check. PPP uses 1319 Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored 1320 block. When decompressing, PPP checks that at the end of input packet, 1321 inflate is waiting for these length bytes. 1322 */ 1323 int ZEXPORT inflateSyncPoint(strm) 1324 z_streamp strm; 1325 { 1326 struct inflate_state FAR *state; 1327 1328 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 1329 state = (struct inflate_state FAR *)strm->state; 1330 return state->mode == STORED && state->bits == 0; 1331 } 1332 1333 int ZEXPORT inflateCopy(dest, source) 1334 z_streamp dest; 1335 z_streamp source; 1336 { 1337 struct inflate_state FAR *state; 1338 struct inflate_state FAR *copy; 1339 unsigned char FAR *window; 1340 unsigned wsize; 1341 1342 /* check input */ 1343 if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || 1344 source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) 1345 return Z_STREAM_ERROR; 1346 state = (struct inflate_state FAR *)source->state; 1347 1348 /* allocate space */ 1349 copy = (struct inflate_state FAR *) 1350 ZALLOC(source, 1, sizeof(struct inflate_state)); 1351 if (copy == Z_NULL) return Z_MEM_ERROR; 1352 window = Z_NULL; 1353 if (state->window != Z_NULL) { 1354 window = (unsigned char FAR *) 1355 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); 1356 if (window == Z_NULL) { 1357 ZFREE(source, copy); 1358 return Z_MEM_ERROR; 1359 } 1360 } 1361 1362 /* copy state */ 1363 zmemcpy(dest, source, sizeof(z_stream)); 1364 zmemcpy(copy, state, sizeof(struct inflate_state)); 1365 if (state->lencode >= state->codes && 1366 state->lencode <= state->codes + ENOUGH - 1) { 1367 copy->lencode = copy->codes + (state->lencode - state->codes); 1368 copy->distcode = copy->codes + (state->distcode - state->codes); 1369 } 1370 copy->next = copy->codes + (state->next - state->codes); 1371 if (window != Z_NULL) { 1372 wsize = 1U << state->wbits; 1373 zmemcpy(window, state->window, wsize); 1374 } 1375 copy->window = window; 1376 dest->state = (struct internal_state FAR *)copy; 1377 return Z_OK; 1378 } 1379