17eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* minigzip.c -- simulate gzip using the zlib compression library
27eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly.
37eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * For conditions of distribution and use, see copyright notice in zlib.h
47eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
57eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
67eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/*
77eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * minigzip is a minimal implementation of the gzip utility. This is
87eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * only an example of using zlib and isn't meant to replace the
97eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * full-featured gzip. No attempt is made to deal with file systems
107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * limiting names to 14 or 8+3 characters, etc... Error checking is
117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * very limited. So use minigzip only for testing; use gzip for the
127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * real thing. On MSDOS, use only on file names without extension
137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * or in pipe mode.
147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* @(#) $Id$ */
177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include "zlib.h"
197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#include <stdio.h>
207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef STDC
227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <string.h>
237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <stdlib.h>
247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP
277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <sys/types.h>
287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <sys/mman.h>
297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <sys/stat.h>
307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <fcntl.h>
347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <io.h>
357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  ifdef UNDER_CE
367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#    include <stdlib.h>
377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  endif
387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define SET_BINARY_MODE(file)
417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef _MSC_VER
447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define snprintf _snprintf
457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef VMS
487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define unlink delete
497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define GZ_SUFFIX "-gz"
507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef RISCOS
527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define unlink remove
537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define GZ_SUFFIX "-gz"
547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define fileno(file) file->__file
557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <unix.h> /* for fileno */
587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE)
617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel  extern int unlink OF((const char *));
637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(UNDER_CE)
677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <windows.h>
687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define perror(s) pwinerror(s)
697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* Map the Windows error number in ERROR to a locale-dependent error
717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   message string and return a pointer to it.  Typically, the values
727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   for ERROR come from GetLastError.
737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   The string pointed to shall not be modified by the application,
757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   but may be overwritten by a subsequent call to strwinerror
767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   The strwinerror function does not change the current setting
787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   of GetLastError.  */
797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic char *strwinerror (error)
817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     DWORD error;
827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    static char buf[1024];
847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    wchar_t *msgbuf;
867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    DWORD lasterr = GetLastError();
877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        | FORMAT_MESSAGE_ALLOCATE_BUFFER,
897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        NULL,
907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        error,
917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        0, /* Default language */
927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        (LPVOID)&msgbuf,
937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        0,
947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        NULL);
957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (chars != 0) {
967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        /* If there is an \r\n appended, zap it.  */
977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (chars >= 2
987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            chars -= 2;
1007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            msgbuf[chars] = 0;
1017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
1027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (chars > sizeof (buf) - 1) {
1047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            chars = sizeof (buf) - 1;
1057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            msgbuf[chars] = 0;
1067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
1077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        wcstombs(buf, msgbuf, chars + 1);
1097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        LocalFree(msgbuf);
1107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else {
1127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        sprintf(buf, "unknown win32 error (%ld)", error);
1137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
1147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    SetLastError(lasterr);
1167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return buf;
1177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielstatic void pwinerror (s)
1207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *s;
1217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (s && *s)
1237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ()));
1247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else
1257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s\n", strwinerror(GetLastError ()));
1267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* UNDER_CE */
1297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifndef GZ_SUFFIX
1317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define GZ_SUFFIX ".gz"
1327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
1347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define BUFLEN      16384
1367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#define MAX_NAME_LEN 1024
1377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef MAXSEG_64K
1397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define local static
1407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel   /* Needed for systems with limitation on stack size. */
1417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
1427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  define local
1437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef Z_SOLO
1467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* for Z_SOLO, create simplified gz* functions using deflate and inflate */
1477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE)
1497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#  include <unistd.h>       /* for unlink() */
1507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
1517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc OF((void *, unsigned, unsigned));
1537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree OF((void *, void *));
1547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid *myalloc(q, n, m)
1567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    void *q;
1577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned n, m;
1587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    q = Z_NULL;
1607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return calloc(n, m);
1617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid myfree(q, p)
1647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    void *q, *p;
1657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    q = Z_NULL;
1677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    free(p);
1687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanieltypedef struct gzFile_s {
1717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE *file;
1727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int write;
1737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
1747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *msg;
1757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream strm;
1767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel} *gzFile;
1777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzopen OF((const char *, const char *));
1797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzdopen OF((int, const char *));
1807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gz_open OF((const char *, int, const char *));
1817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzopen(path, mode)
1837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *path;
1847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *mode;
1857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return gz_open(path, -1, mode);
1877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gzdopen(fd, mode)
1907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint fd;
1917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *mode;
1927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
1937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return gz_open(NULL, fd, mode);
1947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
1957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
1967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielgzFile gz_open(path, fd, mode)
1977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *path;
1987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int fd;
1997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *mode;
2007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile gz;
2027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int ret;
2037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz = malloc(sizeof(struct gzFile_s));
2057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz == NULL)
2067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->write = strchr(mode, 'w') != NULL;
2087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->strm.zalloc = myalloc;
2097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->strm.zfree = myfree;
2107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->strm.opaque = Z_NULL;
2117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz->write)
2127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0);
2137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else {
2147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        gz->strm.next_in = 0;
2157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        gz->strm.avail_in = Z_NULL;
2167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ret = inflateInit2(&(gz->strm), 15 + 16);
2177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (ret != Z_OK) {
2197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        free(gz);
2207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") :
2237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                              fopen(path, gz->write ? "wb" : "rb");
2247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz->file == NULL) {
2257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm));
2267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        free(gz);
2277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return NULL;
2287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
2297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->err = 0;
2307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz->msg = "";
2317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return gz;
2327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzwrite OF((gzFile, const void *, unsigned));
2357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzwrite(gz, buf, len)
2377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile gz;
2387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const void *buf;
2397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned len;
2407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream *strm;
2427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned char out[BUFLEN];
2437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz == NULL || !gz->write)
2457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
2467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm = &(gz->strm);
2477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm->next_in = (void *)buf;
2487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm->avail_in = len;
2497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    do {
2507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->next_out = out;
2517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->avail_out = BUFLEN;
2527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        (void)deflate(strm, Z_NO_FLUSH);
2537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);
2547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } while (strm->avail_out == 0);
2557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return len;
2567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzread OF((gzFile, void *, unsigned));
2597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzread(gz, buf, len)
2617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile gz;
2627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    void *buf;
2637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned len;
2647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
2657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int ret;
2667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned got;
2677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned char in[1];
2687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream *strm;
2697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz == NULL || gz->write)
2717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
2727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz->err)
2737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return 0;
2747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm = &(gz->strm);
2757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm->next_out = (void *)buf;
2767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm->avail_out = len;
2777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    do {
2787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        got = fread(in, 1, 1, gz->file);
2797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (got == 0)
2807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            break;
2817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->next_in = in;
2827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->avail_in = 1;
2837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        ret = inflate(strm, Z_NO_FLUSH);
2847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ret == Z_DATA_ERROR) {
2857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            gz->err = Z_DATA_ERROR;
2867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            gz->msg = strm->msg;
2877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            return 0;
2887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
2897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ret == Z_STREAM_END)
2907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            inflateReset(strm);
2917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } while (strm->avail_out);
2927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return len - strm->avail_out;
2937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
2947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzclose OF((gzFile));
2967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
2977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gzclose(gz)
2987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile gz;
2997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    z_stream *strm;
3017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unsigned char out[BUFLEN];
3027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz == NULL)
3047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        return Z_STREAM_ERROR;
3057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strm = &(gz->strm);
3067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz->write) {
3077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->next_in = Z_NULL;
3087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strm->avail_in = 0;
3097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        do {
3107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            strm->next_out = out;
3117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            strm->avail_out = BUFLEN;
3127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            (void)deflate(strm, Z_FINISH);
3137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);
3147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        } while (strm->avail_out == 0);
3157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        deflateEnd(strm);
3167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else
3187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        inflateEnd(strm);
3197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    fclose(gz->file);
3207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    free(gz);
3217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return Z_OK;
3227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *gzerror OF((gzFile, int *));
3257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielconst char *gzerror(gz, err)
3277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile gz;
3287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int *err;
3297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    *err = gz->err;
3317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return gz->msg;
3327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
3357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielchar *prog;
3377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid error            OF((const char *msg));
3397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_compress      OF((FILE   *in, gzFile out));
3407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP
3417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint  gz_compress_mmap OF((FILE   *in, gzFile out));
3427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
3437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_uncompress    OF((gzFile in, FILE   *out));
3447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_compress    OF((char  *file, char *mode));
3457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_uncompress  OF((char  *file));
3467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint  main             OF((int argc, char *argv[]));
3477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
3497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Display error message and exit
3507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
3517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid error(msg)
3527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    const char *msg;
3537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    fprintf(stderr, "%s: %s\n", prog, msg);
3557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    exit(1);
3567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
3597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Compress input to output then close both files.
3607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
3617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_compress(in, out)
3637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE   *in;
3647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile out;
3657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    local char buf[BUFLEN];
3677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int len;
3687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
3697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP
3717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Try first compressing with mmap. If mmap fails (minigzip used in a
3727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     * pipe), use the normal fread loop.
3737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel     */
3747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gz_compress_mmap(in, out) == Z_OK) return;
3757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
3767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
3777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        len = (int)fread(buf, 1, sizeof(buf), in);
3787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (ferror(in)) {
3797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            perror("fread");
3807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            exit(1);
3817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
3827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (len == 0) break;
3837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));
3857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
3867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    fclose(in);
3877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzclose(out) != Z_OK) error("failed gzclose");
3887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
3897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
3917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
3927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* Try compressing the input file at once using mmap. Return Z_OK if
3937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * if success, Z_ERRNO otherwise.
3947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
3957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint gz_compress_mmap(in, out)
3967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE   *in;
3977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile out;
3987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
3997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int len;
4007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
4017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int ifd = fileno(in);
4027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    caddr_t buf;    /* mmap'ed buffer for the entire input file */
4037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    off_t buf_len;  /* length of the input file */
4047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    struct stat sb;
4057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Determine the size of the file, needed for mmap: */
4077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (fstat(ifd, &sb) < 0) return Z_ERRNO;
4087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    buf_len = sb.st_size;
4097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (buf_len <= 0) return Z_ERRNO;
4107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Now do the actual mmap: */
4127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);
4137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (buf == (caddr_t)(-1)) return Z_ERRNO;
4147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    /* Compress the whole file at once: */
4167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    len = gzwrite(out, (char *)buf, (unsigned)buf_len);
4177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (len != (int)buf_len) error(gzerror(out, &err));
4197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    munmap(buf, buf_len);
4217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    fclose(in);
4227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzclose(out) != Z_OK) error("failed gzclose");
4237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return Z_OK;
4247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif /* USE_MMAP */
4267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Uncompress input to output then close both files.
4297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid gz_uncompress(in, out)
4317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile in;
4327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE   *out;
4337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    local char buf[BUFLEN];
4357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int len;
4367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int err;
4377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    for (;;) {
4397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        len = gzread(in, buf, sizeof(buf));
4407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (len < 0) error (gzerror(in, &err));
4417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (len == 0) break;
4427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
4447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            error("failed fwrite");
4457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
4467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (fclose(out)) error("failed fclose");
4487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (gzclose(in) != Z_OK) error("failed gzclose");
4507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Compress the given file: create a corresponding .gz file and remove the
4557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * original.
4567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_compress(file, mode)
4587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char  *file;
4597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char  *mode;
4607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    local char outfile[MAX_NAME_LEN];
4627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE  *in;
4637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile out;
4647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) {
4667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s: filename too long\n", prog);
4677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
4687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
4717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX);
4727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
4737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy(outfile, file);
4747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcat(outfile, GZ_SUFFIX);
4757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
4767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    in = fopen(file, "rb");
4787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (in == NULL) {
4797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        perror(file);
4807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
4817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    out = gzopen(outfile, mode);
4837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (out == NULL) {
4847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
4857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
4867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
4877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz_compress(in, out);
4887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unlink(file);
4907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
4917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
4937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
4947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Uncompress the given file and remove the original.
4957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
4967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielvoid file_uncompress(file)
4977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char  *file;
4987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
4997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    local char buf[MAX_NAME_LEN];
5007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *infile, *outfile;
5017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    FILE  *out;
5027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile in;
5037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    size_t len = strlen(file);
5047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) {
5067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s: filename too long\n", prog);
5077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
5117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    snprintf(buf, sizeof(buf), "%s", file);
5127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
5137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy(buf, file);
5147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {
5177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        infile = file;
5187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outfile = buf;
5197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outfile[len-3] = '\0';
5207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
5217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outfile = file;
5227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        infile = buf;
5237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
5247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX);
5257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
5267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        strcat(infile, GZ_SUFFIX);
5277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    in = gzopen(infile, "rb");
5307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (in == NULL) {
5317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);
5327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    out = fopen(outfile, "wb");
5357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (out == NULL) {
5367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        perror(file);
5377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        exit(1);
5387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
5397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gz_uncompress(in, out);
5417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    unlink(infile);
5437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
5447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel/* ===========================================================================
5477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel * Usage:  minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]
5487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -c : write to standard output
5497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -d : decompress
5507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -f : compress with Z_FILTERED
5517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -h : compress with Z_HUFFMAN_ONLY
5527eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -r : compress with Z_RLE
5537eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel *   -1 to -9 : compression level
5547eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel */
5557eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5567eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDanielint main(argc, argv)
5577eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int argc;
5587eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *argv[];
5597eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel{
5607eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int copyout = 0;
5617eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    int uncompr = 0;
5627eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    gzFile file;
5637eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    char *bname, outmode[20];
5647eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5657eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
5667eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    snprintf(outmode, sizeof(outmode), "%s", "wb6 ");
5677eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#else
5687eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    strcpy(outmode, "wb6 ");
5697eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel#endif
5707eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5717eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    prog = argv[0];
5727eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    bname = strrchr(argv[0], '/');
5737eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (bname)
5747eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      bname++;
5757eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else
5767eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      bname = argv[0];
5777eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    argc--, argv++;
5787eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5797eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (!strcmp(bname, "gunzip"))
5807eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      uncompr = 1;
5817eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    else if (!strcmp(bname, "zcat"))
5827eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      copyout = uncompr = 1;
5837eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
5847eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    while (argc > 0) {
5857eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      if (strcmp(*argv, "-c") == 0)
5867eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        copyout = 1;
5877eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (strcmp(*argv, "-d") == 0)
5887eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        uncompr = 1;
5897eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (strcmp(*argv, "-f") == 0)
5907eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outmode[3] = 'f';
5917eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (strcmp(*argv, "-h") == 0)
5927eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outmode[3] = 'h';
5937eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if (strcmp(*argv, "-r") == 0)
5947eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outmode[3] = 'R';
5957eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
5967eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel               (*argv)[2] == 0)
5977eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outmode[2] = (*argv)[1];
5987eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      else
5997eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        break;
6007eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel      argc--, argv++;
6017eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
6027eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (outmode[3] == ' ')
6037eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        outmode[3] = 0;
6047eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    if (argc == 0) {
6057eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        SET_BINARY_MODE(stdin);
6067eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        SET_BINARY_MODE(stdout);
6077eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (uncompr) {
6087eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            file = gzdopen(fileno(stdin), "rb");
6097eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (file == NULL) error("can't gzdopen stdin");
6107eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            gz_uncompress(file, stdout);
6117eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        } else {
6127eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            file = gzdopen(fileno(stdout), outmode);
6137eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (file == NULL) error("can't gzdopen stdout");
6147eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            gz_compress(stdin, file);
6157eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
6167eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    } else {
6177eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        if (copyout) {
6187eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            SET_BINARY_MODE(stdout);
6197eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        }
6207eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        do {
6217eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            if (uncompr) {
6227eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                if (copyout) {
6237eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    file = gzopen(*argv, "rb");
6247eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    if (file == NULL)
6257eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
6267eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    else
6277eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        gz_uncompress(file, stdout);
6287eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                } else {
6297eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    file_uncompress(*argv);
6307eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                }
6317eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            } else {
6327eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                if (copyout) {
6337eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    FILE * in = fopen(*argv, "rb");
6347eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6357eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    if (in == NULL) {
6367eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        perror(*argv);
6377eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    } else {
6387eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        file = gzdopen(fileno(stdout), outmode);
6397eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        if (file == NULL) error("can't gzdopen stdout");
6407eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6417eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                        gz_compress(in, file);
6427eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    }
6437eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel
6447eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                } else {
6457eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                    file_compress(*argv, outmode);
6467eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel                }
6477eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel            }
6487eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel        } while (argv++, --argc);
6497eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    }
6507eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel    return 0;
6517eb75bccb5dacb658c63db1a9a980950c3d54d42Daryl McDaniel}
652