Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/klibc/zlib/inflate.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 48977 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

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