|
<html><head><title>dlib C++ Library - inflate.c</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>/* inflate.c -- zlib decompression |
|
* Copyright (C) 1995-2012 Mark Adler |
|
* For conditions of distribution and use, see copyright notice in zlib.h |
|
*/</font> |
|
|
|
<font color='#009900'>/* |
|
* Change history: |
|
* |
|
* 1.2.beta0 24 Nov 2002 |
|
* - First version -- complete rewrite of inflate to simplify code, avoid |
|
* creation of window when not needed, minimize use of window when it is |
|
* needed, make inffast.c even faster, implement gzip decoding, and to |
|
* improve code readability and style over the previous zlib inflate code |
|
* |
|
* 1.2.beta1 25 Nov 2002 |
|
* - Use pointers for available input and output checking in inffast.c |
|
* - Remove input and output counters in inffast.c |
|
* - Change inffast.c entry and loop from avail_in >= 7 to >= 6 |
|
* - Remove unnecessary second byte pull from length extra in inffast.c |
|
* - Unroll direct copy to three copies per loop in inffast.c |
|
* |
|
* 1.2.beta2 4 Dec 2002 |
|
* - Change external routine names to reduce potential conflicts |
|
* - Correct filename to inffixed.h for fixed tables in inflate.c |
|
* - Make hbuf[] unsigned char to match parameter type in inflate.c |
|
* - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) |
|
* to avoid negation problem on Alphas (64 bit) in inflate.c |
|
* |
|
* 1.2.beta3 22 Dec 2002 |
|
* - Add comments on state->bits assertion in inffast.c |
|
* - Add comments on op field in inftrees.h |
|
* - Fix bug in reuse of allocated window after inflateReset() |
|
* - Remove bit fields--back to byte structure for speed |
|
* - Remove distance extra == 0 check in inflate_fast()--only helps for lengths |
|
* - Change post-increments to pre-increments in inflate_fast(), PPC biased? |
|
* - Add compile time option, POSTINC, to use post-increments instead (Intel?) |
|
* - Make MATCH copy in inflate() much faster for when inflate_fast() not used |
|
* - Use local copies of stream next and avail values, as well as local bit |
|
* buffer and bit count in inflate()--for speed when inflate_fast() not used |
|
* |
|
* 1.2.beta4 1 Jan 2003 |
|
* - Split ptr - 257 statements in inflate_table() to avoid compiler warnings |
|
* - Move a comment on output buffer sizes from inffast.c to inflate.c |
|
* - Add comments in inffast.c to introduce the inflate_fast() routine |
|
* - Rearrange window copies in inflate_fast() for speed and simplification |
|
* - Unroll last copy for window match in inflate_fast() |
|
* - Use local copies of window variables in inflate_fast() for speed |
|
* - Pull out common wnext == 0 case for speed in inflate_fast() |
|
* - Make op and len in inflate_fast() unsigned for consistency |
|
* - Add FAR to lcode and dcode declarations in inflate_fast() |
|
* - Simplified bad distance check in inflate_fast() |
|
* - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new |
|
* source file infback.c to provide a call-back interface to inflate for |
|
* programs like gzip and unzip -- uses window as output buffer to avoid |
|
* window copying |
|
* |
|
* 1.2.beta5 1 Jan 2003 |
|
* - Improved inflateBack() interface to allow the caller to provide initial |
|
* input in strm. |
|
* - Fixed stored blocks bug in inflateBack() |
|
* |
|
* 1.2.beta6 4 Jan 2003 |
|
* - Added comments in inffast.c on effectiveness of POSTINC |
|
* - Typecasting all around to reduce compiler warnings |
|
* - Changed loops from while (1) or do {} while (1) to for (;;), again to |
|
* make compilers happy |
|
* - Changed type of window in inflateBackInit() to unsigned char * |
|
* |
|
* 1.2.beta7 27 Jan 2003 |
|
* - Changed many types to unsigned or unsigned short to avoid warnings |
|
* - Added inflateCopy() function |
|
* |
|
* 1.2.0 9 Mar 2003 |
|
* - Changed inflateBack() interface to provide separate opaque descriptors |
|
* for the in() and out() functions |
|
* - Changed inflateBack() argument and in_func typedef to swap the length |
|
* and buffer address return values for the input function |
|
* - Check next_in and next_out for Z_NULL on entry to inflate() |
|
* |
|
* The history for versions after 1.2.0 are in ChangeLog in zlib distribution. |
|
*/</font> |
|
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='zutil.h.html'>zutil.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='inftrees.h.html'>inftrees.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='inflate.h.html'>inflate.h</a>" |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='inffast.h.html'>inffast.h</a>" |
|
|
|
<font color='#0000FF'>#ifdef</font> MAKEFIXED |
|
# ifndef BUILDFIXED |
|
# define BUILDFIXED |
|
# endif |
|
<font color='#0000FF'>#endif</font> |
|
|
|
<font color='#009900'>/* function prototypes */</font> |
|
local <font color='#0000FF'><u>void</u></font> fixedtables <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
local <font color='#0000FF'><u>int</u></font> updatewindow <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>z_streamp strm, <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>end, |
|
<font color='#0000FF'><u>unsigned</u></font> copy<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#ifdef</font> BUILDFIXED |
|
<font color='#0000FF'><u>void</u></font> makefixed <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#endif</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> syncsearch <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> FAR <font color='#5555FF'>*</font>have, <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>buf, |
|
<font color='#0000FF'><u>unsigned</u></font> len<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflateResetKeep'></a>inflateResetKeep</b><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_in <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_out <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>total <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> Z_NULL; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap<font face='Lucida Console'>)</font> <font color='#009900'>/* to support ill-conceived Java test suite */</font> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font> <font color='#979000'>1</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> HEAD; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>havedict <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>dmax <font color='#5555FF'>=</font> <font color='#979000'>32768</font>U; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>=</font> Z_NULL; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>sane <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: reset\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflateReset'></a>inflateReset</b><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>inflateResetKeep</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflateReset2'></a>inflateReset2</b><font face='Lucida Console'>(</font>strm, windowBits<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'><u>int</u></font> windowBits; |
|
<b>{</b> |
|
<font color='#0000FF'><u>int</u></font> wrap; |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#009900'>/* get the state */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
|
|
<font color='#009900'>/* extract wrap request from windowBits parameter */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>windowBits <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
wrap <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
windowBits <font color='#5555FF'>=</font> <font color='#5555FF'>-</font>windowBits; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> |
|
wrap <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>windowBits <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>windowBits <font color='#5555FF'><</font> <font color='#979000'>48</font><font face='Lucida Console'>)</font> |
|
windowBits <font color='#5555FF'>&</font><font color='#5555FF'>=</font> <font color='#979000'>15</font>; |
|
<font color='#0000FF'>#endif</font> |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* set number of window bits, free window if different */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>windowBits <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font face='Lucida Console'>(</font>windowBits <font color='#5555FF'><</font> <font color='#979000'>8</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> windowBits <font color='#5555FF'>></font> <font color='#979000'>15</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>windowBits<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>ZFREE</font><font face='Lucida Console'>(</font>strm, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font> Z_NULL; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* update state and reset the rest of it */</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>=</font> wrap; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>windowBits; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>inflateReset</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflateInit2_'></a>inflateInit2_</b><font face='Lucida Console'>(</font>strm, windowBits, version, stream_size<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'><u>int</u></font> windowBits; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>version; |
|
<font color='#0000FF'><u>int</u></font> stream_size; |
|
<b>{</b> |
|
<font color='#0000FF'><u>int</u></font> ret; |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>version <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> version[<font color='#979000'>0</font>] <font color='#5555FF'>!</font><font color='#5555FF'>=</font> ZLIB_VERSION[<font color='#979000'>0</font>] <font color='#5555FF'>|</font><font color='#5555FF'>|</font> |
|
stream_size <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>z_stream<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_VERSION_ERROR; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> Z_NULL; <font color='#009900'>/* in case we return an error */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>zalloc <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>alloc_func<font face='Lucida Console'>)</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>#ifdef</font> Z_SOLO |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
<font color='#0000FF'>#else</font> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>zalloc <font color='#5555FF'>=</font> zcalloc; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>opaque <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>voidpf<font face='Lucida Console'>)</font><font color='#979000'>0</font>; |
|
<font color='#0000FF'>#endif</font> |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>zfree <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>free_func<font face='Lucida Console'>)</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>#ifdef</font> Z_SOLO |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
<font color='#0000FF'>#else</font> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>zfree <font color='#5555FF'>=</font> zcfree; |
|
<font color='#0000FF'>#endif</font> |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>ZALLOC</font><font face='Lucida Console'>(</font>strm, <font color='#979000'>1</font>, <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> <b><a name='inflate_state'></a>inflate_state</b><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: allocated\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> internal_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>state; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font> Z_NULL; |
|
ret <font color='#5555FF'>=</font> <font color='#BB00BB'>inflateReset2</font><font face='Lucida Console'>(</font>strm, windowBits<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ret <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_OK<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>ZFREE</font><font face='Lucida Console'>(</font>strm, state<font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font> Z_NULL; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> ret; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflateInit_'></a>inflateInit_</b><font face='Lucida Console'>(</font>strm, version, stream_size<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>version; |
|
<font color='#0000FF'><u>int</u></font> stream_size; |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>inflateInit2_</font><font face='Lucida Console'>(</font>strm, DEF_WBITS, version, stream_size<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflatePrime'></a>inflatePrime</b><font face='Lucida Console'>(</font>strm, bits, value<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'><u>int</u></font> bits; |
|
<font color='#0000FF'><u>int</u></font> value; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bits <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>bits <font color='#5555FF'>></font> <font color='#979000'>16</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>+</font> bits <font color='#5555FF'>></font> <font color='#979000'>32</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
value <font color='#5555FF'>&</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> bits<font face='Lucida Console'>)</font> <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'>+</font><font color='#5555FF'>=</font> value <font color='#5555FF'><</font><font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>+</font><font color='#5555FF'>=</font> bits; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* |
|
Return state with length and distance decoding tables and index sizes set to |
|
fixed code decoding. Normally this returns fixed tables from inffixed.h. |
|
If BUILDFIXED is defined, then instead this routine builds the tables the |
|
first time it's called, and returns those tables the first time and |
|
thereafter. This reduces the size of the code by about 2K bytes, in |
|
exchange for a little execution time. However, BUILDFIXED should not be |
|
used for threaded applications, since the rewriting of the tables and virgin |
|
may not be thread-safe. |
|
*/</font> |
|
local <font color='#0000FF'><u>void</u></font> <b><a name='fixedtables'></a>fixedtables</b><font face='Lucida Console'>(</font>state<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
<b>{</b> |
|
<font color='#0000FF'>#ifdef</font> BUILDFIXED |
|
<font color='#0000FF'>static</font> <font color='#0000FF'><u>int</u></font> virgin <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>static</font> code <font color='#5555FF'>*</font>lenfix, <font color='#5555FF'>*</font>distfix; |
|
<font color='#0000FF'>static</font> code fixed[<font color='#979000'>544</font>]; |
|
|
|
<font color='#009900'>/* build fixed huffman tables if first call (may not be thread safe) */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>virgin<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> sym, bits; |
|
<font color='#0000FF'>static</font> code <font color='#5555FF'>*</font>next; |
|
|
|
<font color='#009900'>/* literal/length table */</font> |
|
sym <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>144</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[sym<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font color='#979000'>8</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>256</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[sym<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font color='#979000'>9</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>280</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[sym<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font color='#979000'>7</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>288</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[sym<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font color='#979000'>8</font>; |
|
next <font color='#5555FF'>=</font> fixed; |
|
lenfix <font color='#5555FF'>=</font> next; |
|
bits <font color='#5555FF'>=</font> <font color='#979000'>9</font>; |
|
<font color='#BB00BB'>inflate_table</font><font face='Lucida Console'>(</font>LENS, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens, <font color='#979000'>288</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>next<font face='Lucida Console'>)</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>bits<font face='Lucida Console'>)</font>, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>work<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* distance table */</font> |
|
sym <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>sym <font color='#5555FF'><</font> <font color='#979000'>32</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[sym<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font color='#979000'>5</font>; |
|
distfix <font color='#5555FF'>=</font> next; |
|
bits <font color='#5555FF'>=</font> <font color='#979000'>5</font>; |
|
<font color='#BB00BB'>inflate_table</font><font face='Lucida Console'>(</font>DISTS, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens, <font color='#979000'>32</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>next<font face='Lucida Console'>)</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>bits<font face='Lucida Console'>)</font>, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>work<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* do this just once */</font> |
|
virgin <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#else</font> <font color='#009900'>/* !BUILDFIXED */</font> |
|
# include "<font color='#CC0000'>inffixed.h</font>" |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* BUILDFIXED */</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>=</font> lenfix; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits <font color='#5555FF'>=</font> <font color='#979000'>9</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode <font color='#5555FF'>=</font> distfix; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distbits <font color='#5555FF'>=</font> <font color='#979000'>5</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> MAKEFIXED |
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>stdio.h<font color='#5555FF'>></font> |
|
|
|
<font color='#009900'>/* |
|
Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also |
|
defines BUILDFIXED, so the tables are built on the fly. makefixed() writes |
|
those tables to stdout, which would be piped to inffixed.h. A small program |
|
can simply call makefixed to do this: |
|
|
|
void makefixed(void); |
|
|
|
int main(void) |
|
{ |
|
makefixed(); |
|
return 0; |
|
} |
|
|
|
Then that can be linked with zlib built with MAKEFIXED defined and run: |
|
|
|
a.out > inffixed.h |
|
*/</font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='makefixed'></a>makefixed</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> low, size; |
|
<font color='#0000FF'>struct</font> inflate_state state; |
|
|
|
<font color='#BB00BB'>fixedtables</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>state<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> /* inffixed.h -- table for decoding fixed codes</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> * Generated automatically by makefixed().</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> */</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> /* WARNING: this file should *not* be used by applications.</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> It is part of the implementation of this library and is</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> subject to change. Applications should only use zlib.h.</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> */</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>; |
|
size <font color='#5555FF'>=</font> <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>9</font>; |
|
<font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'> static const code lenfix[%u] = {</font>", size<font face='Lucida Console'>)</font>; |
|
low <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>low <font color='#5555FF'>%</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>\n </font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>{%u,%u,%d}</font>", <font face='Lucida Console'>(</font>low <font color='#5555FF'>&</font> <font color='#979000'>127</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>99</font> ? <font color='#979000'>64</font> : state.lencode[low].op, |
|
state.lencode[low].bits, state.lencode[low].val<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>+</font><font color='#5555FF'>+</font>low <font color='#5555FF'>=</font><font color='#5555FF'>=</font> size<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>putchar</font><font face='Lucida Console'>(</font>'<font color='#FF0000'>,</font>'<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>\n };</font>"<font face='Lucida Console'>)</font>; |
|
size <font color='#5555FF'>=</font> <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>5</font>; |
|
<font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>\n static const code distfix[%u] = {</font>", size<font face='Lucida Console'>)</font>; |
|
low <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>low <font color='#5555FF'>%</font> <font color='#979000'>6</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>\n </font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>printf</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>{%u,%u,%d}</font>", state.distcode[low].op, state.distcode[low].bits, |
|
state.distcode[low].val<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>+</font><font color='#5555FF'>+</font>low <font color='#5555FF'>=</font><font color='#5555FF'>=</font> size<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>putchar</font><font face='Lucida Console'>(</font>'<font color='#FF0000'>,</font>'<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>puts</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>\n };</font>"<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* MAKEFIXED */</font> |
|
|
|
<font color='#009900'>/* |
|
Update the window with the last wsize (normally 32K) bytes written before |
|
returning. If window does not exist yet, create it. This is only called |
|
when a window is already in use, or when output has been written during this |
|
inflate call, but the end of the deflate stream has not been reached yet. |
|
It is also called to create a window for dictionary data when a dictionary |
|
is loaded. |
|
|
|
Providing output buffers larger than 32K to inflate() should provide a speed |
|
advantage, since only the last 32K of output is copied to the sliding window |
|
upon return from inflate(), and since all distances after the first 32K of |
|
output will fall in the output data, making match copies simpler and faster. |
|
The advantage may be dependent on the size of the processor's data caches. |
|
*/</font> |
|
local <font color='#0000FF'><u>int</u></font> <b><a name='updatewindow'></a>updatewindow</b><font face='Lucida Console'>(</font>strm, end, copy<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'>const</font> Bytef <font color='#5555FF'>*</font>end; |
|
<font color='#0000FF'><u>unsigned</u></font> copy; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
<font color='#0000FF'><u>unsigned</u></font> dist; |
|
|
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
|
|
<font color='#009900'>/* if it hasn't been done already, allocate space for the window */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>ZALLOC</font><font face='Lucida Console'>(</font>strm, <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits, |
|
<font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* if window not in use yet, initialize */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>=</font> <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* copy state->wsize or less output bytes into the circular window */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window, end <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> |
|
dist <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>dist <font color='#5555FF'>></font> copy<font face='Lucida Console'>)</font> dist <font color='#5555FF'>=</font> copy; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext, end <font color='#5555FF'>-</font> copy, dist<font face='Lucida Console'>)</font>; |
|
copy <font color='#5555FF'>-</font><font color='#5555FF'>=</font> dist; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window, end <font color='#5555FF'>-</font> copy, copy<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font> copy; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>+</font><font color='#5555FF'>=</font> dist; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize<font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize<font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>+</font><font color='#5555FF'>=</font> dist; |
|
<b>}</b> |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#979000'>0</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* Macros for inflate(): */</font> |
|
|
|
<font color='#009900'>/* check function to use adler32() for zlib or crc32() for gzip */</font> |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
# define <b><a name='UPDATE'></a>UPDATE</b><font face='Lucida Console'>(</font>check, buf, len<font face='Lucida Console'>)</font> \ |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags ? <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>check, buf, len<font face='Lucida Console'>)</font> : adler32<font face='Lucida Console'>(</font>check, buf, len<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>#else</font> |
|
# define UPDATE<font face='Lucida Console'>(</font>check, buf, len<font face='Lucida Console'>)</font> adler32<font face='Lucida Console'>(</font>check, buf, len<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>#endif</font> |
|
|
|
<font color='#009900'>/* check macros for header crc */</font> |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
# define CRC2<font face='Lucida Console'>(</font>check, word<font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
hbuf[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font>; \ |
|
hbuf[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; \ |
|
check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>check, hbuf, <font color='#979000'>2</font><font face='Lucida Console'>)</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
# define <b><a name='CRC4'></a>CRC4</b><font face='Lucida Console'>(</font>check, word<font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
hbuf[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font>; \ |
|
hbuf[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; \ |
|
hbuf[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>16</font><font face='Lucida Console'>)</font>; \ |
|
hbuf[<font color='#979000'>3</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>word<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>24</font><font face='Lucida Console'>)</font>; \ |
|
check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>check, hbuf, <font color='#979000'>4</font><font face='Lucida Console'>)</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>#endif</font> |
|
|
|
<font color='#009900'>/* Load registers with state in inflate() for speed */</font> |
|
<font color='#0000FF'>#define</font> LOAD<font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
put <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_out; \ |
|
left <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_out; \ |
|
next <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_in; \ |
|
have <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in; \ |
|
hold <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold; \ |
|
bits <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Restore state from registers in inflate() */</font> |
|
<font color='#0000FF'>#define</font> RESTORE<font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_out <font color='#5555FF'>=</font> put; \ |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_out <font color='#5555FF'>=</font> left; \ |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_in <font color='#5555FF'>=</font> next; \ |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in <font color='#5555FF'>=</font> have; \ |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'>=</font> hold; \ |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>=</font> bits; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Clear the input bit accumulator */</font> |
|
<font color='#0000FF'>#define</font> INITBITS<font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
hold <font color='#5555FF'>=</font> <font color='#979000'>0</font>; \ |
|
bits <font color='#5555FF'>=</font> <font color='#979000'>0</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Get a byte of input into the bit accumulator, or return from inflate() |
|
if there is no input available. */</font> |
|
<font color='#0000FF'>#define</font> PULLBYTE<font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>have <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; \ |
|
have<font color='#5555FF'>-</font><font color='#5555FF'>-</font>; \ |
|
hold <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>next<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> bits; \ |
|
bits <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Assure that there are at least n bits in the bit accumulator. If there is |
|
not enough available input to do that, then return from inflate(). */</font> |
|
<font color='#0000FF'>#define</font> NEEDBITS<font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>bits <font color='#5555FF'><</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> \ |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Return the low n bits of the bit accumulator (n < 16) */</font> |
|
<font color='#0000FF'>#define</font> BITS<font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font> \ |
|
<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>hold <font color='#5555FF'>&</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> <font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>-</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Remove n bits from the bit accumulator */</font> |
|
<font color='#0000FF'>#define</font> DROPBITS<font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
hold <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font>; \ |
|
bits <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* Remove zero to seven bits as needed to go to a byte boundary */</font> |
|
<font color='#0000FF'>#define</font> BYTEBITS<font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> \ |
|
<font color='#0000FF'>do</font> <b>{</b> \ |
|
hold <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> bits <font color='#5555FF'>&</font> <font color='#979000'>7</font>; \ |
|
bits <font color='#5555FF'>-</font><font color='#5555FF'>=</font> bits <font color='#5555FF'>&</font> <font color='#979000'>7</font>; \ |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
|
|
<font color='#009900'>/* |
|
inflate() uses a state machine to process as much input data and generate as |
|
much output data as possible before returning. The state machine is |
|
structured roughly as follows: |
|
|
|
for (;;) switch (state) { |
|
... |
|
case STATEn: |
|
if (not enough input data or output space to make progress) |
|
return; |
|
... make progress ... |
|
state = STATEm; |
|
break; |
|
... |
|
} |
|
|
|
so when inflate() is called again, the same case is attempted again, and |
|
if the appropriate resources are provided, the machine proceeds to the |
|
next state. The NEEDBITS() macro is usually the way the state evaluates |
|
whether it can proceed or should return. NEEDBITS() does the return if |
|
the requested bits are not available. The typical use of the BITS macros |
|
is: |
|
|
|
NEEDBITS(n); |
|
... do something with BITS(n) ... |
|
DROPBITS(n); |
|
|
|
where NEEDBITS(n) either returns from inflate() if there isn't enough |
|
input left to load n bits into the accumulator, or it continues. BITS(n) |
|
gives the low n bits in the accumulator. When done, DROPBITS(n) drops |
|
the low n bits off the accumulator. INITBITS() clears the accumulator |
|
and sets the number of available bits to zero. BYTEBITS() discards just |
|
enough bits to put the accumulator on a byte boundary. After BYTEBITS() |
|
and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. |
|
|
|
NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return |
|
if there is no input available. The decoding of variable length codes uses |
|
PULLBYTE() directly in order to pull just enough bytes to decode the next |
|
code, and no more. |
|
|
|
Some states loop until they get enough input, making sure that enough |
|
state information is maintained to continue the loop where it left off |
|
if NEEDBITS() returns in the loop. For example, want, need, and keep |
|
would all have to actually be part of the saved state in case NEEDBITS() |
|
returns: |
|
|
|
case STATEw: |
|
while (want < need) { |
|
NEEDBITS(n); |
|
keep[want++] = BITS(n); |
|
DROPBITS(n); |
|
} |
|
state = STATEx; |
|
case STATEx: |
|
|
|
As shown above, if the next state is also the next case, then the break |
|
is omitted. |
|
|
|
A state may also return if there is not enough output space available to |
|
complete that state. Those states are copying stored data, writing a |
|
literal byte, and copying a matching string. |
|
|
|
When returning, a "goto inf_leave" is used to update the total counters, |
|
update the check value, and determine whether any progress has been made |
|
during that inflate() call in order to return the proper return code. |
|
Progress is defined as a change in either strm->avail_in or strm->avail_out. |
|
When there is a window, goto inf_leave will update the window with the last |
|
output written. If a goto inf_leave occurs in the middle of decompression |
|
and there is no window currently, goto inf_leave will create one and copy |
|
output to the window for the next call of inflate(). |
|
|
|
In this implementation, the flush parameter of inflate() only affects the |
|
return code (per zlib.h). inflate() always writes as much as possible to |
|
strm->next_out, given the space available and the provided input--the effect |
|
documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers |
|
the allocation of and copying into a sliding window until necessary, which |
|
provides the effect documented in zlib.h for Z_FINISH when the entire input |
|
stream available. So the only thing the flush parameter actually does is: |
|
when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it |
|
will return Z_BUF_ERROR if it has not reached the end of the stream. |
|
*/</font> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <b><a name='inflate'></a>inflate</b><font face='Lucida Console'>(</font>strm, flush<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'><u>int</u></font> flush; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
z_const <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>next; <font color='#009900'>/* next input */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>put; <font color='#009900'>/* next output */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> have, left; <font color='#009900'>/* available input and output */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> hold; <font color='#009900'>/* bit buffer */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> bits; <font color='#009900'>/* bits in bit buffer */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> in, out; <font color='#009900'>/* save starting available input and output */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> copy; <font color='#009900'>/* number of stored or match bytes to copy */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>from; <font color='#009900'>/* where to copy match bytes from */</font> |
|
code here; <font color='#009900'>/* current decoding table entry */</font> |
|
code last; <font color='#009900'>/* parent table entry */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> len; <font color='#009900'>/* length to copy for repeats, bits to drop */</font> |
|
<font color='#0000FF'><u>int</u></font> ret; <font color='#009900'>/* return code */</font> |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> hbuf[<font color='#979000'>4</font>]; <font color='#009900'>/* buffer for gzip header crc calculation */</font> |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> order[<font color='#979000'>19</font>] <font color='#5555FF'>=</font> <font color='#009900'>/* permutation of code lengths */</font> |
|
<b>{</b><font color='#979000'>16</font>, <font color='#979000'>17</font>, <font color='#979000'>18</font>, <font color='#979000'>0</font>, <font color='#979000'>8</font>, <font color='#979000'>7</font>, <font color='#979000'>9</font>, <font color='#979000'>6</font>, <font color='#979000'>10</font>, <font color='#979000'>5</font>, <font color='#979000'>11</font>, <font color='#979000'>4</font>, <font color='#979000'>12</font>, <font color='#979000'>3</font>, <font color='#979000'>13</font>, <font color='#979000'>2</font>, <font color='#979000'>14</font>, <font color='#979000'>1</font>, <font color='#979000'>15</font><b>}</b>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_out <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> |
|
<font face='Lucida Console'>(</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_in <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
|
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> TYPE<font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPEDO; <font color='#009900'>/* skip check */</font> |
|
<font color='#BB00BB'>LOAD</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
in <font color='#5555FF'>=</font> have; |
|
out <font color='#5555FF'>=</font> left; |
|
ret <font color='#5555FF'>=</font> Z_OK; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>case</font> HEAD: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPEDO; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> hold <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0x8b1f</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* gzip header */</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>L, Z_NULL, <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>CRC2</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> FLAGS; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>/* expect zlib header */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>done <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> <font color='#009900'>/* check if zlib header allowed */</font> |
|
<font color='#0000FF'>#else</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>#endif</font> |
|
<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>hold <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>%</font> <font color='#979000'>31</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>incorrect header check</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_DEFLATED<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>unknown compression method</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>; |
|
len <font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>8</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits <font color='#5555FF'>=</font> len; |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid window size</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>dmax <font color='#5555FF'>=</font> <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> len; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: zlib header ok\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>adler32</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>L, Z_NULL, <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> hold <font color='#5555FF'>&</font> <font color='#979000'>0x200</font> ? DICTID : TYPE; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
<font color='#0000FF'>case</font> FLAGS: |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>hold<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0xff</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_DEFLATED<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>unknown compression method</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0xe000</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>unknown header flags set</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>text <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>hold <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>CRC2</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TIME; |
|
<font color='#0000FF'>case</font> TIME: |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>32</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>time <font color='#5555FF'>=</font> hold; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>CRC4</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> OS; |
|
<font color='#0000FF'>case</font> OS: |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>xflags <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>hold <font color='#5555FF'>&</font> <font color='#979000'>0xff</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>os <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>hold <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>CRC2</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> EXLEN; |
|
<font color='#0000FF'>case</font> EXLEN: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0400</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>hold<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra_len <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>hold; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> <font color='#BB00BB'>CRC2</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra <font color='#5555FF'>=</font> Z_NULL; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> EXTRA; |
|
<font color='#0000FF'>case</font> EXTRA: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0400</font><font face='Lucida Console'>)</font> <b>{</b> |
|
copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> have<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> have; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
len <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra_len <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra <font color='#5555FF'>+</font> len, next, |
|
len <font color='#5555FF'>+</font> copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra_max ? |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra_max <font color='#5555FF'>-</font> len : copy<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, next, copy<font face='Lucida Console'>)</font>; |
|
have <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
next <font color='#5555FF'>+</font><font color='#5555FF'>=</font> copy; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> NAME; |
|
<font color='#0000FF'>case</font> NAME: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0800</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>have <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
copy <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>do</font> <b>{</b> |
|
len <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>next[copy<font color='#5555FF'>+</font><font color='#5555FF'>+</font>]<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>name <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>name_max<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>name[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> len; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>&</font><font color='#5555FF'>&</font> copy <font color='#5555FF'><</font> have<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, next, copy<font face='Lucida Console'>)</font>; |
|
have <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
next <font color='#5555FF'>+</font><font color='#5555FF'>=</font> copy; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>name <font color='#5555FF'>=</font> Z_NULL; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> COMMENT; |
|
<font color='#0000FF'>case</font> COMMENT: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x1000</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>have <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
copy <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>do</font> <b>{</b> |
|
len <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>next[copy<font color='#5555FF'>+</font><font color='#5555FF'>+</font>]<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>comment <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>comm_max<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>comment[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> len; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>&</font><font color='#5555FF'>&</font> copy <font color='#5555FF'><</font> have<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, next, copy<font face='Lucida Console'>)</font>; |
|
have <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
next <font color='#5555FF'>+</font><font color='#5555FF'>=</font> copy; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>comment <font color='#5555FF'>=</font> Z_NULL; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> HCRC; |
|
<font color='#0000FF'>case</font> HCRC: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>&</font> <font color='#979000'>0x0200</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>hold <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>&</font> <font color='#979000'>0xffff</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>header crc mismatch</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>hcrc <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>9</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head<font color='#5555FF'>-</font><font color='#5555FF'>></font>done <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>crc32</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>L, Z_NULL, <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPE; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#0000FF'>case</font> DICTID: |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>32</font><font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font>hold<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> DICT; |
|
<font color='#0000FF'>case</font> DICT: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>havedict <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>RESTORE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> Z_NEED_DICT; |
|
<b>}</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> <font color='#BB00BB'>adler32</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>L, Z_NULL, <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPE; |
|
<font color='#0000FF'>case</font> TYPE: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_BLOCK <font color='#5555FF'>|</font><font color='#5555FF'>|</font> flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_TREES<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#0000FF'>case</font> TYPEDO: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>BYTEBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> CHECK; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last <font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>case</font> <font color='#979000'>0</font>: <font color='#009900'>/* stored block */</font> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: stored block%s\n</font>", |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last ? "<font color='#CC0000'> (last)</font>" : "<font color='#CC0000'></font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> STORED; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> <font color='#979000'>1</font>: <font color='#009900'>/* fixed block */</font> |
|
<font color='#BB00BB'>fixedtables</font><font face='Lucida Console'>(</font>state<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: fixed codes block%s\n</font>", |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last ? "<font color='#CC0000'> (last)</font>" : "<font color='#CC0000'></font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN_; <font color='#009900'>/* decode codes */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_TREES<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>goto</font> inf_leave; |
|
<b>}</b> |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> <font color='#979000'>2</font>: <font color='#009900'>/* dynamic block */</font> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: dynamic codes block%s\n</font>", |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last ? "<font color='#CC0000'> (last)</font>" : "<font color='#CC0000'></font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TABLE; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> <font color='#979000'>3</font>: |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid block type</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> STORED: |
|
<font color='#BB00BB'>BYTEBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* go to byte boundary */</font> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>32</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>hold <font color='#5555FF'>&</font> <font color='#979000'>0xffff</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>hold <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> ^ <font color='#979000'>0xffff</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid stored block lengths</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>hold <font color='#5555FF'>&</font> <font color='#979000'>0xffff</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: stored length %u\n</font>", |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> COPY_; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_TREES<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#0000FF'>case</font> COPY_: |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> COPY; |
|
<font color='#0000FF'>case</font> COPY: |
|
copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> have<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> have; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> left<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> left; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>put, next, copy<font face='Lucida Console'>)</font>; |
|
have <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
next <font color='#5555FF'>+</font><font color='#5555FF'>=</font> copy; |
|
left <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
put <font color='#5555FF'>+</font><font color='#5555FF'>=</font> copy; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: stored end\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPE; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> TABLE: |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>14</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen <font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>5</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>257</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ndist <font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>5</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ncode <font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> <font color='#979000'>4</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#ifndef</font> PKZIP_BUG_WORKAROUND |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen <font color='#5555FF'>></font> <font color='#979000'>286</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ndist <font color='#5555FF'>></font> <font color='#979000'>30</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>too many length or distance symbols</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: table sizes ok\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LENLENS; |
|
<font color='#0000FF'>case</font> LENLENS: |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ncode<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[order[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font color='#5555FF'>+</font><font color='#5555FF'>+</font>]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font><font face='Lucida Console'>)</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'><</font> <font color='#979000'>19</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[order[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font color='#5555FF'>+</font><font color='#5555FF'>+</font>]] <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> code FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits <font color='#5555FF'>=</font> <font color='#979000'>7</font>; |
|
ret <font color='#5555FF'>=</font> <font color='#BB00BB'>inflate_table</font><font face='Lucida Console'>(</font>CODES, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens, <font color='#979000'>19</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>, |
|
<font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits<font face='Lucida Console'>)</font>, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>work<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ret<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid code lengths set</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: code lengths ok\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> CODELENS; |
|
<font color='#0000FF'>case</font> CODELENS: |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ndist<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
here <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode[<font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits<font face='Lucida Console'>)</font>]; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> bits<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.val <font color='#5555FF'><</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> here.val; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.val <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font>here.bits <font color='#5555FF'>+</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid bit length repeat</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
len <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>-</font> <font color='#979000'>1</font>]; |
|
copy <font color='#5555FF'>=</font> <font color='#979000'>3</font> <font color='#5555FF'>+</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.val <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>17</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font>here.bits <font color='#5555FF'>+</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
len <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
copy <font color='#5555FF'>=</font> <font color='#979000'>3</font> <font color='#5555FF'>+</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font>here.bits <font color='#5555FF'>+</font> <font color='#979000'>7</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
len <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
copy <font color='#5555FF'>=</font> <font color='#979000'>11</font> <font color='#5555FF'>+</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font><font color='#979000'>7</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font><font color='#979000'>7</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>+</font> copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ndist<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid bit length repeat</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>copy<font color='#5555FF'>-</font><font color='#5555FF'>-</font><font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font><font face='Lucida Console'>)</font>len; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* handle error breaks in while */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> BAD<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
|
|
<font color='#009900'>/* check for end-of-block code (better have one) */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens[<font color='#979000'>256</font>] <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid code -- missing end-of-block</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* build code tables -- note: do not change the lenbits or distbits |
|
values here (9 and 6) without reading the comments in inftrees.h |
|
concerning the ENOUGH constants, which depend on those values */</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> code FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits <font color='#5555FF'>=</font> <font color='#979000'>9</font>; |
|
ret <font color='#5555FF'>=</font> <font color='#BB00BB'>inflate_table</font><font face='Lucida Console'>(</font>LENS, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>, |
|
<font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits<font face='Lucida Console'>)</font>, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>work<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ret<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid literal/lengths set</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> code FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distbits <font color='#5555FF'>=</font> <font color='#979000'>6</font>; |
|
ret <font color='#5555FF'>=</font> <font color='#BB00BB'>inflate_table</font><font face='Lucida Console'>(</font>DISTS, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lens <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>nlen, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>ndist, |
|
<font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next<font face='Lucida Console'>)</font>, <font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distbits<font face='Lucida Console'>)</font>, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>work<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ret<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid distances set</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: codes ok\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN_; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_TREES<font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#0000FF'>case</font> LEN_: |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN; |
|
<font color='#0000FF'>case</font> LEN: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>have <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>6</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> left <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>258</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>RESTORE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>inflate_fast</font><font face='Lucida Console'>(</font>strm, out<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>LOAD</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> TYPE<font face='Lucida Console'>)</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
here <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode[<font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lenbits<font face='Lucida Console'>)</font>]; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> bits<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font> <font color='#979000'>0xf0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
last <font color='#5555FF'>=</font> here; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
here <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode[last.val <font color='#5555FF'>+</font> |
|
<font face='Lucida Console'>(</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>last.bits <font color='#5555FF'>+</font> last.op<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> last.bits<font face='Lucida Console'>)</font>]; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>last.bits <font color='#5555FF'>+</font> here.bits<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> bits<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>last.bits<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> last.bits; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> here.bits; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>here.val; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.op<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>Tracevv</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, here.val <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>0x20</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> here.val <font color='#5555FF'><</font> <font color='#979000'>0x7f</font> ? |
|
"<font color='#CC0000'>inflate: literal '%c'\n</font>" : |
|
"<font color='#CC0000'>inflate: literal 0x%02x\n</font>", here.val<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LIT; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font> <font color='#979000'>32</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>Tracevv</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: end of block\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPE; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font> <font color='#979000'>64</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid literal/length code</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.op<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>15</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LENEXT; |
|
<font color='#0000FF'>case</font> LENEXT: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra; |
|
<b>}</b> |
|
<font color='#BB00BB'>Tracevv</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: length %u\n</font>", state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>was <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> DIST; |
|
<font color='#0000FF'>case</font> DIST: |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
here <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode[<font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distbits<font face='Lucida Console'>)</font>]; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> bits<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font> <font color='#979000'>0xf0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b> |
|
last <font color='#5555FF'>=</font> here; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b> |
|
here <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode[last.val <font color='#5555FF'>+</font> |
|
<font face='Lucida Console'>(</font><font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>last.bits <font color='#5555FF'>+</font> last.op<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> last.bits<font face='Lucida Console'>)</font>]; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>last.bits <font color='#5555FF'>+</font> here.bits<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> bits<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; |
|
<font color='#BB00BB'>PULLBYTE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>last.bits<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> last.bits; |
|
<b>}</b> |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>here.bits<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> here.bits; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>here.op <font color='#5555FF'>&</font> <font color='#979000'>64</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid distance code</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font>here.val; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>here.op<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>15</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> DISTEXT; |
|
<font color='#0000FF'>case</font> DISTEXT: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#BB00BB'>BITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>DROPBITS</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back <font color='#5555FF'>+</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>extra; |
|
<b>}</b> |
|
<font color='#0000FF'>#ifdef</font> INFLATE_STRICT |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>dmax<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid distance too far back</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#BB00BB'>Tracevv</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: distance %u\n</font>", state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> MATCH; |
|
<font color='#0000FF'>case</font> MATCH: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>left <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
copy <font color='#5555FF'>=</font> out <font color='#5555FF'>-</font> left; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset <font color='#5555FF'>></font> copy<font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* copy from window */</font> |
|
copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset <font color='#5555FF'>-</font> copy; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>sane<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>invalid distance too far back</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#ifdef</font> INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR |
|
<font color='#BB00BB'>Trace</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate.c too far\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
copy <font color='#5555FF'>-</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> left<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> left; |
|
left <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
<font color='#0000FF'>do</font> <b>{</b> |
|
<font color='#5555FF'>*</font>put<font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>copy<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>#endif</font> |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext<font face='Lucida Console'>)</font> <b>{</b> |
|
copy <font color='#5555FF'>-</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext; |
|
from <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>-</font> copy<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
from <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext <font color='#5555FF'>-</font> copy<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> <font color='#009900'>/* copy from output */</font> |
|
from <font color='#5555FF'>=</font> put <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>offset; |
|
copy <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>></font> left<font face='Lucida Console'>)</font> copy <font color='#5555FF'>=</font> left; |
|
left <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>-</font><font color='#5555FF'>=</font> copy; |
|
<font color='#0000FF'>do</font> <b>{</b> |
|
<font color='#5555FF'>*</font>put<font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>from<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>copy<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> LIT: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>left <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#5555FF'>*</font>put<font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length<font face='Lucida Console'>)</font>; |
|
left<font color='#5555FF'>-</font><font color='#5555FF'>-</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LEN; |
|
<font color='#0000FF'>break</font>; |
|
<font color='#0000FF'>case</font> CHECK: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>32</font><font face='Lucida Console'>)</font>; |
|
out <font color='#5555FF'>-</font><font color='#5555FF'>=</font> left; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_out <font color='#5555FF'>+</font><font color='#5555FF'>=</font> out; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>total <font color='#5555FF'>+</font><font color='#5555FF'>=</font> out; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> |
|
<font color='#BB00BB'>UPDATE</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, put <font color='#5555FF'>-</font> out, out<font face='Lucida Console'>)</font>; |
|
out <font color='#5555FF'>=</font> left; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags ? hold : |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font>hold<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check<font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>incorrect data check</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: check matches trailer\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#ifdef</font> GUNZIP |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> LENGTH; |
|
<font color='#0000FF'>case</font> LENGTH: |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>flags<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>NEEDBITS</font><font face='Lucida Console'>(</font><font color='#979000'>32</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>hold <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>total <font color='#5555FF'>&</font> <font color='#979000'>0xffffffffUL</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>msg <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>"<font color='#CC0000'>incorrect length check</font>"; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> BAD; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>INITBITS</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: length matches trailer\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> DONE; |
|
<font color='#0000FF'>case</font> DONE: |
|
ret <font color='#5555FF'>=</font> Z_STREAM_END; |
|
<font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#0000FF'>case</font> BAD: |
|
ret <font color='#5555FF'>=</font> Z_DATA_ERROR; |
|
<font color='#0000FF'>goto</font> inf_leave; |
|
<font color='#0000FF'>case</font> MEM: |
|
<font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
<font color='#0000FF'>case</font> SYNC: |
|
<font color='#0000FF'>default</font>: |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* |
|
Return from inflate(), updating the total counts and the check value. |
|
If there was no progress during the inflate() call, return a buffer |
|
error. Call updatewindow() to create and/or update the window state. |
|
Note: a memory error from inflate() is non-recoverable. |
|
*/</font> |
|
inf_leave: |
|
<font color='#BB00BB'>RESTORE</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wsize <font color='#5555FF'>|</font><font color='#5555FF'>|</font> <font face='Lucida Console'>(</font>out <font color='#5555FF'>!</font><font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_out <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'><</font> BAD <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'><</font> CHECK <font color='#5555FF'>|</font><font color='#5555FF'>|</font> flush <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_FINISH<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>updatewindow</font><font face='Lucida Console'>(</font>strm, strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_out, out <font color='#5555FF'>-</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_out<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> MEM; |
|
<font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
<b>}</b> |
|
in <font color='#5555FF'>-</font><font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in; |
|
out <font color='#5555FF'>-</font><font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_out; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_in <font color='#5555FF'>+</font><font color='#5555FF'>=</font> in; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_out <font color='#5555FF'>+</font><font color='#5555FF'>=</font> out; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>total <font color='#5555FF'>+</font><font color='#5555FF'>=</font> out; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font><font color='#5555FF'>&</font> out<font face='Lucida Console'>)</font> |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>adler <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check <font color='#5555FF'>=</font> |
|
<font color='#BB00BB'>UPDATE</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check, strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_out <font color='#5555FF'>-</font> out, out<font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>data_type <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>last ? <font color='#979000'>64</font> : <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> TYPE ? <font color='#979000'>128</font> : <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> LEN_ <font color='#5555FF'>|</font><font color='#5555FF'>|</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> COPY_ ? <font color='#979000'>256</font> : <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>in <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> out <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> flush <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_FINISH<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> ret <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_OK<font face='Lucida Console'>)</font> |
|
ret <font color='#5555FF'>=</font> Z_BUF_ERROR; |
|
<font color='#0000FF'>return</font> ret; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateEnd</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>zfree <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>free_func<font face='Lucida Console'>)</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#BB00BB'>ZFREE</font><font face='Lucida Console'>(</font>strm, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>ZFREE</font><font face='Lucida Console'>(</font>strm, strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state<font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font> Z_NULL; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: end\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateGetDictionary</font><font face='Lucida Console'>(</font>strm, dictionary, dictLength<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
Bytef <font color='#5555FF'>*</font>dictionary; |
|
uInt <font color='#5555FF'>*</font>dictLength; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#009900'>/* check state */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
|
|
<font color='#009900'>/* copy dictionary */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>&</font><font color='#5555FF'>&</font> dictionary <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>dictionary, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext, |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>dictionary <font color='#5555FF'>+</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext, |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wnext<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>dictLength <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'>*</font>dictLength <font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>whave; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateSetDictionary</font><font face='Lucida Console'>(</font>strm, dictionary, dictLength<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'>const</font> Bytef <font color='#5555FF'>*</font>dictionary; |
|
uInt dictLength; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> dictid; |
|
<font color='#0000FF'><u>int</u></font> ret; |
|
|
|
<font color='#009900'>/* check state */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>!</font><font color='#5555FF'>=</font> DICT<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
|
|
<font color='#009900'>/* check for correct dictionary identifier */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> DICT<font face='Lucida Console'>)</font> <b>{</b> |
|
dictid <font color='#5555FF'>=</font> <font color='#BB00BB'>adler32</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>L, Z_NULL, <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
dictid <font color='#5555FF'>=</font> <font color='#BB00BB'>adler32</font><font face='Lucida Console'>(</font>dictid, dictionary, dictLength<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>dictid <font color='#5555FF'>!</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>check<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_DATA_ERROR; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* copy dictionary to window using updatewindow(), which will amend the |
|
existing dictionary if appropriate */</font> |
|
ret <font color='#5555FF'>=</font> <font color='#BB00BB'>updatewindow</font><font face='Lucida Console'>(</font>strm, dictionary <font color='#5555FF'>+</font> dictLength, dictLength<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>ret<font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> MEM; |
|
<font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>havedict <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>Tracev</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>stderr, "<font color='#CC0000'>inflate: dictionary set\n</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateGetHeader</font><font face='Lucida Console'>(</font>strm, head<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
gz_headerp head; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#009900'>/* check state */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wrap <font color='#5555FF'>&</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
|
|
<font color='#009900'>/* save header structure */</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>head <font color='#5555FF'>=</font> head; |
|
head<font color='#5555FF'>-</font><font color='#5555FF'>></font>done <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* |
|
Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found |
|
or when out of input. When called, *have is the number of pattern bytes |
|
found in order so far, in 0..3. On return *have is updated to the new |
|
state. If on return *have equals four, then the pattern was found and the |
|
return value is how many bytes were read including the last byte of the |
|
pattern. If *have is less than four, then the pattern has not been found |
|
yet and the return value is len. In the latter case, syncsearch() can be |
|
called again with more data and the *have state. *have is initialized to |
|
zero for the first call. |
|
*/</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#BB00BB'>syncsearch</font><font face='Lucida Console'>(</font>have, buf, len<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> FAR <font color='#5555FF'>*</font>have; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>buf; |
|
<font color='#0000FF'><u>unsigned</u></font> len; |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> got; |
|
<font color='#0000FF'><u>unsigned</u></font> next; |
|
|
|
got <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>have; |
|
next <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>next <font color='#5555FF'><</font> len <font color='#5555FF'>&</font><font color='#5555FF'>&</font> got <font color='#5555FF'><</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>buf[next]<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>got <font color='#5555FF'><</font> <font color='#979000'>2</font> ? <font color='#979000'>0</font> : <font color='#979000'>0xff</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
got<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>buf[next]<font face='Lucida Console'>)</font> |
|
got <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>else</font> |
|
got <font color='#5555FF'>=</font> <font color='#979000'>4</font> <font color='#5555FF'>-</font> got; |
|
next<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; |
|
<b>}</b> |
|
<font color='#5555FF'>*</font>have <font color='#5555FF'>=</font> got; |
|
<font color='#0000FF'>return</font> next; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateSync</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> len; <font color='#009900'>/* number of bytes to look at or looked at */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> in, out; <font color='#009900'>/* temporary to save total_in and total_out */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> buf[<font color='#979000'>4</font>]; <font color='#009900'>/* to restore bit buffer to byte string */</font> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#009900'>/* check parameters */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'><</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_BUF_ERROR; |
|
|
|
<font color='#009900'>/* if first time, start search in bit buffer */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>!</font><font color='#5555FF'>=</font> SYNC<font face='Lucida Console'>)</font> <b>{</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> SYNC; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>&</font> <font color='#979000'>7</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>-</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>&</font> <font color='#979000'>7</font>; |
|
len <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <b>{</b> |
|
buf[len<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold<font face='Lucida Console'>)</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>hold <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; |
|
<b>}</b> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>syncsearch</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font face='Lucida Console'>)</font>, buf, len<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* search available input */</font> |
|
len <font color='#5555FF'>=</font> <font color='#BB00BB'>syncsearch</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have<font face='Lucida Console'>)</font>, strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_in, strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in<font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>avail_in <font color='#5555FF'>-</font><font color='#5555FF'>=</font> len; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_in <font color='#5555FF'>+</font><font color='#5555FF'>=</font> len; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_in <font color='#5555FF'>+</font><font color='#5555FF'>=</font> len; |
|
|
|
<font color='#009900'>/* return no joy or set up to restart inflate() on a new block */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>have <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_DATA_ERROR; |
|
in <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_in; out <font color='#5555FF'>=</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_out; |
|
<font color='#BB00BB'>inflateReset</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font>; |
|
strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_in <font color='#5555FF'>=</font> in; strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>total_out <font color='#5555FF'>=</font> out; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font> TYPE; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* |
|
Returns true if inflate is currently at the end of a block generated by |
|
Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP |
|
implementation to provide an additional safety check. PPP uses |
|
Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored |
|
block. When decompressing, PPP checks that at the end of input packet, |
|
inflate is waiting for these length bytes. |
|
*/</font> |
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateSyncPoint</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>return</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> STORED <font color='#5555FF'>&</font><font color='#5555FF'>&</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>bits <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateCopy</font><font face='Lucida Console'>(</font>dest, source<font face='Lucida Console'>)</font> |
|
z_streamp dest; |
|
z_streamp source; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>copy; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>window; |
|
<font color='#0000FF'><u>unsigned</u></font> wsize; |
|
|
|
<font color='#009900'>/* check input */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>dest <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> source <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> |
|
source<font color='#5555FF'>-</font><font color='#5555FF'>></font>zalloc <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>alloc_func<font face='Lucida Console'>)</font><font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>zfree <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>free_func<font face='Lucida Console'>)</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>source<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
|
|
<font color='#009900'>/* allocate space */</font> |
|
copy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>ZALLOC</font><font face='Lucida Console'>(</font>source, <font color='#979000'>1</font>, <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> <b><a name='inflate_state'></a>inflate_state</b><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>copy <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
window <font color='#5555FF'>=</font> Z_NULL; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
window <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>ZALLOC</font><font face='Lucida Console'>(</font>source, <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits, <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>window <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>ZFREE</font><font face='Lucida Console'>(</font>source, copy<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> Z_MEM_ERROR; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* copy state */</font> |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>voidpf<font face='Lucida Console'>)</font>dest, <font face='Lucida Console'>(</font>voidpf<font face='Lucida Console'>)</font>source, <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>z_stream<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>voidpf<font face='Lucida Console'>)</font>copy, <font face='Lucida Console'>(</font>voidpf<font face='Lucida Console'>)</font>state, <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> <b><a name='inflate_state'></a>inflate_state</b><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>></font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes <font color='#5555FF'>&</font><font color='#5555FF'>&</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'><</font><font color='#5555FF'>=</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes <font color='#5555FF'>+</font> ENOUGH <font color='#5555FF'>-</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <b>{</b> |
|
copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>=</font> copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>lencode <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes<font face='Lucida Console'>)</font>; |
|
copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode <font color='#5555FF'>=</font> copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>distcode <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>next <font color='#5555FF'>=</font> copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>next <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>codes<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>window <font color='#5555FF'>!</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <b>{</b> |
|
wsize <font color='#5555FF'>=</font> <font color='#979000'>1</font>U <font color='#5555FF'><</font><font color='#5555FF'><</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>wbits; |
|
<font color='#BB00BB'>zmemcpy</font><font face='Lucida Console'>(</font>window, state<font color='#5555FF'>-</font><font color='#5555FF'>></font>window, wsize<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
copy<font color='#5555FF'>-</font><font color='#5555FF'>></font>window <font color='#5555FF'>=</font> window; |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> internal_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>copy; |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> ZEXPORT <font color='#BB00BB'>inflateUndermine</font><font face='Lucida Console'>(</font>strm, subvert<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<font color='#0000FF'><u>int</u></font> subvert; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> Z_STREAM_ERROR; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>sane <font color='#5555FF'>=</font> <font color='#5555FF'>!</font>subvert; |
|
<font color='#0000FF'>#ifdef</font> INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR |
|
<font color='#0000FF'>return</font> Z_OK; |
|
<font color='#0000FF'>#else</font> |
|
state<font color='#5555FF'>-</font><font color='#5555FF'>></font>sane <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>return</font> Z_DATA_ERROR; |
|
<font color='#0000FF'>#endif</font> |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>long</u></font> ZEXPORT <font color='#BB00BB'>inflateMark</font><font face='Lucida Console'>(</font>strm<font face='Lucida Console'>)</font> |
|
z_streamp strm; |
|
<b>{</b> |
|
<font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font>state; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>strm <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL <font color='#5555FF'>|</font><font color='#5555FF'>|</font> strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>16</font>; |
|
state <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> inflate_state FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>strm<font color='#5555FF'>-</font><font color='#5555FF'>></font>state; |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>long</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>back<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> COPY ? state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length : |
|
<font face='Lucida Console'>(</font>state<font color='#5555FF'>-</font><font color='#5555FF'>></font>mode <font color='#5555FF'>=</font><font color='#5555FF'>=</font> MATCH ? state<font color='#5555FF'>-</font><font color='#5555FF'>></font>was <font color='#5555FF'>-</font> state<font color='#5555FF'>-</font><font color='#5555FF'>></font>length : <font color='#979000'>0</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
</pre></body></html> |