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