Fossil SCM

fossil-scm / compat / zlib / examples / zlib_how.html
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
"http://www.w3.org/TR/html4/loose.dtd">
3
<html>
4
<head>
5
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
6
<title>zlib Usage Example</title>
7
<!-- Copyright (c) 2004-2026 Mark Adler. -->
8
</head>
9
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#00A000">
10
<h2 align="center"> zlib Usage Example </h2>
11
We often get questions about how the <tt>deflate()</tt> and <tt>inflate()</tt> functions should be used.
12
Users wonder when they should provide more input, when they should use more output,
13
what to do with a <tt>Z_BUF_ERROR</tt>, how to make sure the process terminates properly, and
14
so on. So for those who have read <tt>zlib.h</tt> (a few times), and
15
would like further edification, below is an annotated example in C of simple routines to compress and decompress
16
from an input file to an output file using <tt>deflate()</tt> and <tt>inflate()</tt> respectively. The
17
annotations are interspersed between lines of the code. So please read between the lines.
18
We hope this helps explain some of the intricacies of <em>zlib</em>.
19
<p>
20
Without further ado, here is the program <a href="zpipe.c"><tt>zpipe.c</tt></a>:
21
<pre><b>
22
/* zpipe.c: example of proper use of zlib's inflate() and deflate()
23
Not copyrighted -- provided to the public domain
24
Version 1.5 11 February 2026 Mark Adler */
25
26
/* Version history:
27
1.0 30 Oct 2004 First version
28
1.1 8 Nov 2004 Add void casting for unused return values
29
Use switch statement for inflate() return values
30
1.2 9 Nov 2004 Add assertions to document zlib guarantees
31
1.3 6 Apr 2005 Remove incorrect assertion in inf()
32
1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
33
Avoid some compiler warnings for input and output buffers
34
1.5 11 Feb 2026 Use underscores for Windows POSIX names
35
*/
36
</b></pre><!-- -->
37
We now include the header files for the required definitions. From
38
<tt>stdio.h</tt> we use <tt>fopen()</tt>, <tt>fread()</tt>, <tt>fwrite()</tt>,
39
<tt>feof()</tt>, <tt>ferror()</tt>, and <tt>fclose()</tt> for file i/o, and
40
<tt>fputs()</tt> for error messages. From <tt>string.h</tt> we use
41
<tt>strcmp()</tt> for command line argument processing.
42
From <tt>assert.h</tt> we use the <tt>assert()</tt> macro.
43
From <tt>zlib.h</tt>
44
we use the basic compression functions <tt>deflateInit()</tt>,
45
<tt>deflate()</tt>, and <tt>deflateEnd()</tt>, and the basic decompression
46
functions <tt>inflateInit()</tt>, <tt>inflate()</tt>, and
47
<tt>inflateEnd()</tt>.
48
<pre><b>
49
#include &lt;stdio.h&gt;
50
#include &lt;string.h&gt;
51
#include &lt;assert.h&gt;
52
#include "zlib.h"
53
</b></pre><!-- -->
54
This is an ugly hack required to avoid corruption of the input and output data on
55
Windows/MS-DOS systems. Without this, those systems would assume that the input and output
56
files are text, and try to convert the end-of-line characters from one standard to
57
another. That would corrupt binary data, and in particular would render the compressed data unusable.
58
This sets the input and output to binary which suppresses the end-of-line conversions.
59
<tt>SET_BINARY_MODE()</tt> will be used later on <tt>stdin</tt> and <tt>stdout</tt>, at the beginning of <tt>main()</tt>.
60
<pre><b>
61
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
62
# include &lt;fcntl.h&gt;
63
# include &lt;io.h&gt;
64
# define SET_BINARY_MODE(file) _setmode(_fileno(file), _O_BINARY)
65
#else
66
# define SET_BINARY_MODE(file)
67
#endif
68
</b></pre><!-- -->
69
<tt>CHUNK</tt> is simply the buffer size for feeding data to and pulling data
70
from the <em>zlib</em> routines. Larger buffer sizes would be more efficient,
71
especially for <tt>inflate()</tt>. If the memory is available, buffers sizes
72
on the order of 128K or 256K bytes should be used.
73
<pre><b>
74
#define CHUNK 16384
75
</b></pre><!-- -->
76
The <tt>def()</tt> routine compresses data from an input file to an output file. The output data
77
will be in the <em>zlib</em> format, which is different from the <em>gzip</em> or <em>zip</em>
78
formats. The <em>zlib</em> format has a very small header of only two bytes to identify it as
79
a <em>zlib</em> stream and to provide decoding information, and a four-byte trailer with a fast
80
check value to verify the integrity of the uncompressed data after decoding.
81
<pre><b>
82
/* Compress from file source to file dest until EOF on source.
83
def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
84
allocated for processing, Z_STREAM_ERROR if an invalid compression
85
level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
86
version of the library linked do not match, or Z_ERRNO if there is
87
an error reading or writing the files. */
88
int def(FILE *source, FILE *dest, int level)
89
{
90
</b></pre>
91
Here are the local variables for <tt>def()</tt>. <tt>ret</tt> will be used for <em>zlib</em>
92
return codes. <tt>flush</tt> will keep track of the current flushing state for <tt>deflate()</tt>,
93
which is either no flushing, or flush to completion after the end of the input file is reached.
94
<tt>have</tt> is the amount of data returned from <tt>deflate()</tt>. The <tt>strm</tt> structure
95
is used to pass information to and from the <em>zlib</em> routines, and to maintain the
96
<tt>deflate()</tt> state. <tt>in</tt> and <tt>out</tt> are the input and output buffers for
97
<tt>deflate()</tt>.
98
<pre><b>
99
int ret, flush;
100
unsigned have;
101
z_stream strm;
102
unsigned char in[CHUNK];
103
unsigned char out[CHUNK];
104
</b></pre><!-- -->
105
The first thing we do is to initialize the <em>zlib</em> state for compression using
106
<tt>deflateInit()</tt>. This must be done before the first use of <tt>deflate()</tt>.
107
The <tt>zalloc</tt>, <tt>zfree</tt>, and <tt>opaque</tt> fields in the <tt>strm</tt>
108
structure must be initialized before calling <tt>deflateInit()</tt>. Here they are
109
set to the <em>zlib</em> constant <tt>Z_NULL</tt> to request that <em>zlib</em> use
110
the default memory allocation routines. An application may also choose to provide
111
custom memory allocation routines here. <tt>deflateInit()</tt> will allocate on the
112
order of 256K bytes for the internal state.
113
(See <a href="zlib_tech.html"><em>zlib Technical Details</em></a>.)
114
<p>
115
<tt>deflateInit()</tt> is called with a pointer to the structure to be initialized and
116
the compression level, which is an integer in the range of -1 to 9. Lower compression
117
levels result in faster execution, but less compression. Higher levels result in
118
greater compression, but slower execution. The <em>zlib</em> constant Z_DEFAULT_COMPRESSION,
119
equal to -1,
120
provides a good compromise between compression and speed and is equivalent to level 6.
121
Level 0 actually does no compression at all, and in fact expands the data slightly to produce
122
the <em>zlib</em> format (it is not a byte-for-byte copy of the input).
123
More advanced applications of <em>zlib</em>
124
may use <tt>deflateInit2()</tt> here instead. Such an application may want to reduce how
125
much memory will be used, at some price in compression. Or it may need to request a
126
<em>gzip</em> header and trailer instead of a <em>zlib</em> header and trailer, or raw
127
encoding with no header or trailer at all.
128
<p>
129
We must check the return value of <tt>deflateInit()</tt> against the <em>zlib</em> constant
130
<tt>Z_OK</tt> to make sure that it was able to
131
allocate memory for the internal state, and that the provided arguments were valid.
132
<tt>deflateInit()</tt> will also check that the version of <em>zlib</em> that the <tt>zlib.h</tt>
133
file came from matches the version of <em>zlib</em> actually linked with the program. This
134
is especially important for environments in which <em>zlib</em> is a shared library.
135
<p>
136
Note that an application can initialize multiple, independent <em>zlib</em> streams, which can
137
operate in parallel. The state information maintained in the structure allows the <em>zlib</em>
138
routines to be reentrant.
139
<pre><b>
140
/* allocate deflate state */
141
strm.zalloc = Z_NULL;
142
strm.zfree = Z_NULL;
143
strm.opaque = Z_NULL;
144
ret = deflateInit(&amp;strm, level);
145
if (ret != Z_OK)
146
return ret;
147
</b></pre><!-- -->
148
With the pleasantries out of the way, now we can get down to business. The outer <tt>do</tt>-loop
149
reads all of the input file and exits at the bottom of the loop once end-of-file is reached.
150
This loop contains the only call of <tt>deflate()</tt>. So we must make sure that all of the
151
input data has been processed and that all of the output data has been generated and consumed
152
before we fall out of the loop at the bottom.
153
<pre><b>
154
/* compress until end of file */
155
do {
156
</b></pre>
157
We start off by reading data from the input file. The number of bytes read is put directly
158
into <tt>avail_in</tt>, and a pointer to those bytes is put into <tt>next_in</tt>. We also
159
check to see if end-of-file on the input has been reached using feof().
160
If we are at the end of file, then <tt>flush</tt> is set to the
161
<em>zlib</em> constant <tt>Z_FINISH</tt>, which is later passed to <tt>deflate()</tt> to
162
indicate that this is the last chunk of input data to compress.
163
If we are not yet at the end of the input, then the <em>zlib</em>
164
constant <tt>Z_NO_FLUSH</tt> will be passed to <tt>deflate</tt> to indicate that we are still
165
in the middle of the uncompressed data.
166
<p>
167
If there is an error in reading from the input file, the process is aborted with
168
<tt>deflateEnd()</tt> being called to free the allocated <em>zlib</em> state before returning
169
the error. We wouldn't want a memory leak, now would we? <tt>deflateEnd()</tt> can be called
170
at any time after the state has been initialized. Once that's done, <tt>deflateInit()</tt> (or
171
<tt>deflateInit2()</tt>) would have to be called to start a new compression process. There is
172
no point here in checking the <tt>deflateEnd()</tt> return code. The deallocation can't fail.
173
<pre><b>
174
strm.avail_in = fread(in, 1, CHUNK, source);
175
if (ferror(source)) {
176
(void)deflateEnd(&amp;strm);
177
return Z_ERRNO;
178
}
179
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
180
strm.next_in = in;
181
</b></pre><!-- -->
182
The inner <tt>do</tt>-loop passes our chunk of input data to <tt>deflate()</tt>, and then
183
keeps calling <tt>deflate()</tt> until it is done producing output. Once there is no more
184
new output, <tt>deflate()</tt> is guaranteed to have consumed all of the input, i.e.,
185
<tt>avail_in</tt> will be zero.
186
<pre><b>
187
/* run deflate() on input until output buffer not full, finish
188
compression if all of source has been read in */
189
do {
190
</b></pre>
191
Output space is provided to <tt>deflate()</tt> by setting <tt>avail_out</tt> to the number
192
of available output bytes and <tt>next_out</tt> to a pointer to that space.
193
<pre><b>
194
strm.avail_out = CHUNK;
195
strm.next_out = out;
196
</b></pre>
197
Now we call the compression engine itself, <tt>deflate()</tt>. It takes as many of the
198
<tt>avail_in</tt> bytes at <tt>next_in</tt> as it can process, and writes as many as
199
<tt>avail_out</tt> bytes to <tt>next_out</tt>. Those counters and pointers are then
200
updated past the input data consumed and the output data written. It is the amount of
201
output space available that may limit how much input is consumed.
202
Hence the inner loop to make sure that
203
all of the input is consumed by providing more output space each time. Since <tt>avail_in</tt>
204
and <tt>next_in</tt> are updated by <tt>deflate()</tt>, we don't have to mess with those
205
between <tt>deflate()</tt> calls until it's all used up.
206
<p>
207
The parameters to <tt>deflate()</tt> are a pointer to the <tt>strm</tt> structure containing
208
the input and output information and the internal compression engine state, and a parameter
209
indicating whether and how to flush data to the output. Normally <tt>deflate</tt> will consume
210
several K bytes of input data before producing any output (except for the header), in order
211
to accumulate statistics on the data for optimum compression. It will then put out a burst of
212
compressed data, and proceed to consume more input before the next burst. Eventually,
213
<tt>deflate()</tt>
214
must be told to terminate the stream, complete the compression with provided input data, and
215
write out the trailer check value. <tt>deflate()</tt> will continue to compress normally as long
216
as the flush parameter is <tt>Z_NO_FLUSH</tt>. Once the <tt>Z_FINISH</tt> parameter is provided,
217
<tt>deflate()</tt> will begin to complete the compressed output stream. However depending on how
218
much output space is provided, <tt>deflate()</tt> may have to be called several times until it
219
has provided the complete compressed stream, even after it has consumed all of the input. The flush
220
parameter must continue to be <tt>Z_FINISH</tt> for those subsequent calls.
221
<p>
222
There are other values of the flush parameter that are used in more advanced applications. You can
223
force <tt>deflate()</tt> to produce a burst of output that encodes all of the input data provided
224
so far, even if it wouldn't have otherwise, for example to control data latency on a link with
225
compressed data. You can also ask that <tt>deflate()</tt> do that as well as erase any history up to
226
that point so that what follows can be decompressed independently, for example for random access
227
applications. Both requests will degrade compression by an amount depending on how often such
228
requests are made.
229
<p>
230
<tt>deflate()</tt> has a return value that can indicate errors, yet we do not check it here. Why
231
not? Well, it turns out that <tt>deflate()</tt> can do no wrong here. Let's go through
232
<tt>deflate()</tt>'s return values and dispense with them one by one. The possible values are
233
<tt>Z_OK</tt>, <tt>Z_STREAM_END</tt>, <tt>Z_STREAM_ERROR</tt>, or <tt>Z_BUF_ERROR</tt>. <tt>Z_OK</tt>
234
is, well, ok. <tt>Z_STREAM_END</tt> is also ok and will be returned for the last call of
235
<tt>deflate()</tt>. This is already guaranteed by calling <tt>deflate()</tt> with <tt>Z_FINISH</tt>
236
until it has no more output. <tt>Z_STREAM_ERROR</tt> is only possible if the stream is not
237
initialized properly, but we did initialize it properly. There is no harm in checking for
238
<tt>Z_STREAM_ERROR</tt> here, for example to check for the possibility that some
239
other part of the application inadvertently clobbered the memory containing the <em>zlib</em> state.
240
<tt>Z_BUF_ERROR</tt> will be explained further below, but
241
suffice it to say that this is simply an indication that <tt>deflate()</tt> could not consume
242
more input or produce more output. <tt>deflate()</tt> can be called again with more output space
243
or more available input, which it will be in this code.
244
<pre><b>
245
ret = deflate(&amp;strm, flush); /* no bad return value */
246
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
247
</b></pre>
248
Now we compute how much output <tt>deflate()</tt> provided on the last call, which is the
249
difference between how much space was provided before the call, and how much output space
250
is still available after the call. Then that data, if any, is written to the output file.
251
We can then reuse the output buffer for the next call of <tt>deflate()</tt>. Again if there
252
is a file i/o error, we call <tt>deflateEnd()</tt> before returning to avoid a memory leak.
253
<pre><b>
254
have = CHUNK - strm.avail_out;
255
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
256
(void)deflateEnd(&amp;strm);
257
return Z_ERRNO;
258
}
259
</b></pre>
260
The inner <tt>do</tt>-loop is repeated until the last <tt>deflate()</tt> call fails to fill the
261
provided output buffer. Then we know that <tt>deflate()</tt> has done as much as it can with
262
the provided input, and that all of that input has been consumed. We can then fall out of this
263
loop and reuse the input buffer.
264
<p>
265
The way we tell that <tt>deflate()</tt> has no more output is by seeing that it did not fill
266
the output buffer, leaving <tt>avail_out</tt> greater than zero. However suppose that
267
<tt>deflate()</tt> has no more output, but just so happened to exactly fill the output buffer!
268
<tt>avail_out</tt> is zero, and we can't tell that <tt>deflate()</tt> has done all it can.
269
As far as we know, <tt>deflate()</tt>
270
has more output for us. So we call it again. But now <tt>deflate()</tt> produces no output
271
at all, and <tt>avail_out</tt> remains unchanged as <tt>CHUNK</tt>. That <tt>deflate()</tt> call
272
wasn't able to do anything, either consume input or produce output, and so it returns
273
<tt>Z_BUF_ERROR</tt>. (See, I told you I'd cover this later.) However this is not a problem at
274
all. Now we finally have the desired indication that <tt>deflate()</tt> is really done,
275
and so we drop out of the inner loop to provide more input to <tt>deflate()</tt>.
276
<p>
277
With <tt>flush</tt> set to <tt>Z_FINISH</tt>, this final set of <tt>deflate()</tt> calls will
278
complete the output stream. Once that is done, subsequent calls of <tt>deflate()</tt> would return
279
<tt>Z_STREAM_ERROR</tt> if the flush parameter is not <tt>Z_FINISH</tt>, and do no more processing
280
until the state is reinitialized.
281
<p>
282
Some applications of <em>zlib</em> have two loops that call <tt>deflate()</tt>
283
instead of the single inner loop we have here. The first loop would call
284
without flushing and feed all of the data to <tt>deflate()</tt>. The second loop would call
285
<tt>deflate()</tt> with no more
286
data and the <tt>Z_FINISH</tt> parameter to complete the process. As you can see from this
287
example, that can be avoided by simply keeping track of the current flush state.
288
<pre><b>
289
} while (strm.avail_out == 0);
290
assert(strm.avail_in == 0); /* all input will be used */
291
</b></pre><!-- -->
292
Now we check to see if we have already processed all of the input file. That information was
293
saved in the <tt>flush</tt> variable, so we see if that was set to <tt>Z_FINISH</tt>. If so,
294
then we're done and we fall out of the outer loop. We're guaranteed to get <tt>Z_STREAM_END</tt>
295
from the last <tt>deflate()</tt> call, since we ran it until the last chunk of input was
296
consumed and all of the output was generated.
297
<pre><b>
298
/* done when last data in file processed */
299
} while (flush != Z_FINISH);
300
assert(ret == Z_STREAM_END); /* stream will be complete */
301
</b></pre><!-- -->
302
The process is complete, but we still need to deallocate the state to avoid a memory leak
303
(or rather more like a memory hemorrhage if you didn't do this). Then
304
finally we can return with a happy return value.
305
<pre><b>
306
/* clean up and return */
307
(void)deflateEnd(&amp;strm);
308
return Z_OK;
309
}
310
</b></pre><!-- -->
311
Now we do the same thing for decompression in the <tt>inf()</tt> routine. <tt>inf()</tt>
312
decompresses what is hopefully a valid <em>zlib</em> stream from the input file and writes the
313
uncompressed data to the output file. Much of the discussion above for <tt>def()</tt>
314
applies to <tt>inf()</tt> as well, so the discussion here will focus on the differences between
315
the two.
316
<pre><b>
317
/* Decompress from file source to file dest until stream ends or EOF.
318
inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
319
allocated for processing, Z_DATA_ERROR if the deflate data is
320
invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
321
the version of the library linked do not match, or Z_ERRNO if there
322
is an error reading or writing the files. */
323
int inf(FILE *source, FILE *dest)
324
{
325
</b></pre>
326
The local variables have the same functionality as they do for <tt>def()</tt>. The
327
only difference is that there is no <tt>flush</tt> variable, since <tt>inflate()</tt>
328
can tell from the <em>zlib</em> stream itself when the stream is complete.
329
<pre><b>
330
int ret;
331
unsigned have;
332
z_stream strm;
333
unsigned char in[CHUNK];
334
unsigned char out[CHUNK];
335
</b></pre><!-- -->
336
The initialization of the state is the same, except that there is no compression level,
337
of course, and two more elements of the structure are initialized. <tt>avail_in</tt>
338
and <tt>next_in</tt> must be initialized before calling <tt>inflateInit()</tt>. This
339
is because the application has the option to provide the start of the zlib stream in
340
order for <tt>inflateInit()</tt> to have access to information about the compression
341
method to aid in memory allocation. In the current implementation of <em>zlib</em>
342
(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of
343
<tt>inflate()</tt> anyway. However those fields must be initialized since later versions
344
of <em>zlib</em> that provide more compression methods may take advantage of this interface.
345
In any case, no decompression is performed by <tt>inflateInit()</tt>, so the
346
<tt>avail_out</tt> and <tt>next_out</tt> fields do not need to be initialized before calling.
347
<p>
348
Here <tt>avail_in</tt> is set to zero and <tt>next_in</tt> is set to <tt>Z_NULL</tt> to
349
indicate that no input data is being provided.
350
<pre><b>
351
/* allocate inflate state */
352
strm.zalloc = Z_NULL;
353
strm.zfree = Z_NULL;
354
strm.opaque = Z_NULL;
355
strm.avail_in = 0;
356
strm.next_in = Z_NULL;
357
ret = inflateInit(&amp;strm);
358
if (ret != Z_OK)
359
return ret;
360
</b></pre><!-- -->
361
The outer <tt>do</tt>-loop decompresses input until <tt>inflate()</tt> indicates
362
that it has reached the end of the compressed data and has produced all of the uncompressed
363
output. This is in contrast to <tt>def()</tt> which processes all of the input file.
364
If end-of-file is reached before the compressed data self-terminates, then the compressed
365
data is incomplete and an error is returned.
366
<pre><b>
367
/* decompress until deflate stream ends or end of file */
368
do {
369
</b></pre>
370
We read input data and set the <tt>strm</tt> structure accordingly. If we've reached the
371
end of the input file, then we leave the outer loop and report an error, since the
372
compressed data is incomplete. Note that we may read more data than is eventually consumed
373
by <tt>inflate()</tt>, if the input file continues past the <em>zlib</em> stream.
374
For applications where <em>zlib</em> streams are embedded in other data, this routine would
375
need to be modified to return the unused data, or at least indicate how much of the input
376
data was not used, so the application would know where to pick up after the <em>zlib</em> stream.
377
<pre><b>
378
strm.avail_in = fread(in, 1, CHUNK, source);
379
if (ferror(source)) {
380
(void)inflateEnd(&amp;strm);
381
return Z_ERRNO;
382
}
383
if (strm.avail_in == 0)
384
break;
385
strm.next_in = in;
386
</b></pre><!-- -->
387
The inner <tt>do</tt>-loop has the same function it did in <tt>def()</tt>, which is to
388
keep calling <tt>inflate()</tt> until has generated all of the output it can with the
389
provided input.
390
<pre><b>
391
/* run inflate() on input until output buffer not full */
392
do {
393
</b></pre>
394
Just like in <tt>def()</tt>, the same output space is provided for each call of <tt>inflate()</tt>.
395
<pre><b>
396
strm.avail_out = CHUNK;
397
strm.next_out = out;
398
</b></pre>
399
Now we run the decompression engine itself. There is no need to adjust the flush parameter, since
400
the <em>zlib</em> format is self-terminating. The main difference here is that there are
401
return values that we need to pay attention to. <tt>Z_DATA_ERROR</tt>
402
indicates that <tt>inflate()</tt> detected an error in the <em>zlib</em> compressed data format,
403
which means that either the data is not a <em>zlib</em> stream to begin with, or that the data was
404
corrupted somewhere along the way since it was compressed. The other error to be processed is
405
<tt>Z_MEM_ERROR</tt>, which can occur since memory allocation is deferred until <tt>inflate()</tt>
406
needs it, unlike <tt>deflate()</tt>, whose memory is allocated at the start by <tt>deflateInit()</tt>.
407
<p>
408
Advanced applications may use
409
<tt>deflateSetDictionary()</tt> to prime <tt>deflate()</tt> with a set of likely data to improve the
410
first 32K or so of compression. This is noted in the <em>zlib</em> header, so <tt>inflate()</tt>
411
requests that that dictionary be provided before it can start to decompress. Without the dictionary,
412
correct decompression is not possible. For this routine, we have no idea what the dictionary is,
413
so the <tt>Z_NEED_DICT</tt> indication is converted to a <tt>Z_DATA_ERROR</tt>.
414
<p>
415
<tt>inflate()</tt> can also return <tt>Z_STREAM_ERROR</tt>, which should not be possible here,
416
but could be checked for as noted above for <tt>def()</tt>. <tt>Z_BUF_ERROR</tt> does not need to be
417
checked for here, for the same reasons noted for <tt>def()</tt>. <tt>Z_STREAM_END</tt> will be
418
checked for later.
419
<pre><b>
420
ret = inflate(&amp;strm, Z_NO_FLUSH);
421
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
422
switch (ret) {
423
case Z_NEED_DICT:
424
ret = Z_DATA_ERROR; /* and fall through */
425
case Z_DATA_ERROR:
426
case Z_MEM_ERROR:
427
(void)inflateEnd(&amp;strm);
428
return ret;
429
}
430
</b></pre>
431
The output of <tt>inflate()</tt> is handled identically to that of <tt>deflate()</tt>.
432
<pre><b>
433
have = CHUNK - strm.avail_out;
434
if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
435
(void)inflateEnd(&amp;strm);
436
return Z_ERRNO;
437
}
438
</b></pre>
439
The inner <tt>do</tt>-loop ends when <tt>inflate()</tt> has no more output as indicated
440
by not filling the output buffer, just as for <tt>deflate()</tt>. In this case, we cannot
441
assert that <tt>strm.avail_in</tt> will be zero, since the deflate stream may end before the file
442
does.
443
<pre><b>
444
} while (strm.avail_out == 0);
445
</b></pre><!-- -->
446
The outer <tt>do</tt>-loop ends when <tt>inflate()</tt> reports that it has reached the
447
end of the input <em>zlib</em> stream, has completed the decompression and integrity
448
check, and has provided all of the output. This is indicated by the <tt>inflate()</tt>
449
return value <tt>Z_STREAM_END</tt>. The inner loop is guaranteed to leave <tt>ret</tt>
450
equal to <tt>Z_STREAM_END</tt> if the last chunk of the input file read contained the end
451
of the <em>zlib</em> stream. So if the return value is not <tt>Z_STREAM_END</tt>, the
452
loop continues to read more input.
453
<pre><b>
454
/* done when inflate() says it's done */
455
} while (ret != Z_STREAM_END);
456
</b></pre><!-- -->
457
At this point, decompression successfully completed, or we broke out of the loop due to no
458
more data being available from the input file. If the last <tt>inflate()</tt> return value
459
is not <tt>Z_STREAM_END</tt>, then the <em>zlib</em> stream was incomplete and a data error
460
is returned. Otherwise, we return with a happy return value. Of course, <tt>inflateEnd()</tt>
461
is called first to avoid a memory leak.
462
<pre><b>
463
/* clean up and return */
464
(void)inflateEnd(&amp;strm);
465
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
466
}
467
</b></pre><!-- -->
468
That ends the routines that directly use <em>zlib</em>. The following routines make this
469
a command-line program by running data through the above routines from <tt>stdin</tt> to
470
<tt>stdout</tt>, and handling any errors reported by <tt>def()</tt> or <tt>inf()</tt>.
471
<p>
472
<tt>zerr()</tt> is used to interpret the possible error codes from <tt>def()</tt>
473
and <tt>inf()</tt>, as detailed in their comments above, and print out an error message.
474
Note that these are only a subset of the possible return values from <tt>deflate()</tt>
475
and <tt>inflate()</tt>.
476
<pre><b>
477
/* report a zlib or i/o error */
478
void zerr(int ret)
479
{
480
fputs("zpipe: ", stderr);
481
switch (ret) {
482
case Z_ERRNO:
483
if (ferror(stdin))
484
fputs("error reading stdin\n", stderr);
485
if (ferror(stdout))
486
fputs("error writing stdout\n", stderr);
487
break;
488
case Z_STREAM_ERROR:
489
fputs("invalid compression level\n", stderr);
490
break;
491
case Z_DATA_ERROR:
492
fputs("invalid or incomplete deflate data\n", stderr);
493
break;
494
case Z_MEM_ERROR:
495
fputs("out of memory\n", stderr);
496
break;
497
case Z_VERSION_ERROR:
498
fputs("zlib version mismatch!\n", stderr);
499
}
500
}
501
</b></pre><!-- -->
502
Here is the <tt>main()</tt> routine used to test <tt>def()</tt> and <tt>inf()</tt>. The
503
<tt>zpipe</tt> command is simply a compression pipe from <tt>stdin</tt> to <tt>stdout</tt>, if
504
no arguments are given, or it is a decompression pipe if <tt>zpipe -d</tt> is used. If any other
505
arguments are provided, no compression or decompression is performed. Instead a usage
506
message is displayed. Examples are <tt>zpipe < foo.txt > foo.txt.z</tt> to compress, and
507
<tt>zpipe -d < foo.txt.z > foo.txt</tt> to decompress.
508
<pre><b>
509
/* compress or decompress from stdin to stdout */
510
int main(int argc, char **argv)
511
{
512
int ret;
513
514
/* avoid end-of-line conversions */
515
SET_BINARY_MODE(stdin);
516
SET_BINARY_MODE(stdout);
517
518
/* do compression if no arguments */
519
if (argc == 1) {
520
ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
521
if (ret != Z_OK)
522
zerr(ret);
523
return ret;
524
}
525
526
/* do decompression if -d specified */
527
else if (argc == 2 &amp;&amp; strcmp(argv[1], "-d") == 0) {
528
ret = inf(stdin, stdout);
529
if (ret != Z_OK)
530
zerr(ret);
531
return ret;
532
}
533
534
/* otherwise, report usage */
535
else {
536
fputs("zpipe usage: zpipe [-d] &lt; source &gt; dest\n", stderr);
537
return 1;
538
}
539
}
540
</b></pre>
541
<hr>
542
<i>Last modified 12 February 2026<br>
543
Copyright &#169; 2004-2026 Mark Adler</i><br>
544
<a rel="license" href="https://creativecommons.org/licenses/by-nd/4.0/">
545
<img alt="Creative Commons License" style="border-width:0"
546
src="https://i.creativecommons.org/l/by-nd/4.0/88x31.png"></a>
547
<a rel="license" href="https://creativecommons.org/licenses/by-nd/4.0/">
548
Creative Commons Attribution-NoDerivatives 4.0 International License</a>.
549
</body>
550
</html>
551

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button