1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* zpipe.c: example of proper use of zlib's inflate() and deflate()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Not copyrighted -- provided to the public domain
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Version 1.4 11 December 2005 Mark Adler */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* Version history:
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1.0 30 Oct 2004 First version
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1.1 8 Nov 2004 Add void casting for unused return values
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Use switch statement for inflate() return values
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1.2 9 Nov 2004 Add assertions to document zlib guarantees
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1.3 6 Apr 2005 Remove incorrect assertion in inf()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Avoid some compiler warnings for input and output buffers
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* Compress from file source to file dest until EOF on source.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync allocated for processing, Z_STREAM_ERROR if an invalid compression
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync version of the library linked do not match, or Z_ERRNO if there is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync an error reading or writing the files. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* allocate deflate state */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* compress until end of file */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* run deflate() on input until output buffer not full, finish
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync compression if all of source has been read in */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ret = deflate(&strm, flush); /* no bad return value */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync assert(ret != Z_STREAM_ERROR); /* state not clobbered */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync assert(strm.avail_in == 0); /* all input will be used */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* done when last data in file processed */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync assert(ret == Z_STREAM_END); /* stream will be complete */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* clean up and return */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* Decompress from file source to file dest until stream ends or EOF.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync allocated for processing, Z_DATA_ERROR if the deflate data is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync the version of the library linked do not match, or Z_ERRNO if there
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is an error reading or writing the files. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* allocate inflate state */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* decompress until deflate stream ends or end of file */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* run inflate() on input until output buffer not full */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync assert(ret != Z_STREAM_ERROR); /* state not clobbered */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* done when inflate() says it's done */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* clean up and return */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* report a zlib or i/o error */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync fputs("invalid or incomplete deflate data\n", stderr);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* compress or decompress from stdin to stdout */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* avoid end-of-line conversions */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* do compression if no arguments */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* do decompression if -d specified */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* otherwise, report usage */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);