/* $NetBSD: zcat.c,v 1.3 1998/11/12 16:49:47 thorpej Exp $ */ /* mini zcat.c -- a minimal zcat using the zlib compression library * Copyright (C) 1995-1996 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Credits, History: * This program is a reduced version of the minigzip.c * program originally written by Jean-loup Gailly. * This reduction is the work of Gordon Ross. */ #include #include #include #include "zlib.h" #define BUFLEN 4096 char *prog; void error __P((const char *msg)); void gz_uncompress __P((gzFile in, FILE *out)); int main __P((int argc, char *argv[])); /* =========================================================================== * Display error message and exit */ void error(msg) const char *msg; { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } /* =========================================================================== * Uncompress input to output then close both files. */ void gz_uncompress(in, out) gzFile in; FILE *out; { char buf[BUFLEN]; int len; int err; for (;;) { len = gzread(in, buf, sizeof(buf)); if (len < 0) error (gzerror(in, &err)); if (len == 0) break; if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { error("failed fwrite"); } } if (fclose(out)) error("failed fclose"); if (gzclose(in) != Z_OK) error("failed gzclose"); } /* =========================================================================== * Usage: zcat [files...] */ int main(argc, argv) int argc; char *argv[]; { gzFile zfp; /* save program name and skip */ prog = argv[0]; argc--, argv++; /* ignore any switches */ while (*argv && (**argv == '-')) { argc--, argv++; } if (argc == 0) { zfp = gzdopen(fileno(stdin), "rb"); if (zfp == NULL) error("can't gzdopen stdin"); gz_uncompress(zfp, stdout); return 0; } do { /* file_uncompress(*argv); */ zfp = gzopen(*argv, "rb"); if (zfp == NULL) { fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); exit(1); } gz_uncompress(zfp, stdout); } while (argv++, --argc); return 0; /* to avoid warning */ } /* * XXX: hacks to keep gzio.c from pulling in deflate stuff */ int deflateInit2_ (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size) { return(-1); } int deflate (z_streamp strm, int flush) { return(-1); } int deflateEnd (z_streamp strm) { return(-1); } int deflateParams (z_streamp strm, int level, int strategy) { return(Z_STREAM_ERROR); }