zcat.c revision 1.1 1 1.1 gwr /* $NetBSD: zcat.c,v 1.1 1996/09/12 20:24:00 gwr Exp $ */
2 1.1 gwr
3 1.1 gwr /* mini zcat.c -- a minimal zcat using the zlib compression library
4 1.1 gwr * Copyright (C) 1995-1996 Jean-loup Gailly.
5 1.1 gwr * For conditions of distribution and use, see copyright notice in zlib.h
6 1.1 gwr */
7 1.1 gwr
8 1.1 gwr /*
9 1.1 gwr * Credits, History:
10 1.1 gwr * This program is a reduced version of the minigzip.c
11 1.1 gwr * program originally written by Jean-loup Gailly.
12 1.1 gwr * This reduction is the work of Gordon Ross.
13 1.1 gwr */
14 1.1 gwr
15 1.1 gwr #include <stdio.h>
16 1.1 gwr #include <string.h>
17 1.1 gwr #include <stdlib.h>
18 1.1 gwr
19 1.1 gwr #include "zlib.h"
20 1.1 gwr
21 1.1 gwr #define BUFLEN 4096
22 1.1 gwr
23 1.1 gwr char *prog;
24 1.1 gwr
25 1.1 gwr void error __P((const char *msg));
26 1.1 gwr void gz_uncompress __P((gzFile in, FILE *out));
27 1.1 gwr int main __P((int argc, char *argv[]));
28 1.1 gwr
29 1.1 gwr /* ===========================================================================
30 1.1 gwr * Display error message and exit
31 1.1 gwr */
32 1.1 gwr void error(msg)
33 1.1 gwr const char *msg;
34 1.1 gwr {
35 1.1 gwr fprintf(stderr, "%s: %s\n", prog, msg);
36 1.1 gwr exit(1);
37 1.1 gwr }
38 1.1 gwr
39 1.1 gwr /* ===========================================================================
40 1.1 gwr * Uncompress input to output then close both files.
41 1.1 gwr */
42 1.1 gwr void gz_uncompress(in, out)
43 1.1 gwr gzFile in;
44 1.1 gwr FILE *out;
45 1.1 gwr {
46 1.1 gwr char buf[BUFLEN];
47 1.1 gwr int len;
48 1.1 gwr int err;
49 1.1 gwr
50 1.1 gwr for (;;) {
51 1.1 gwr len = gzread(in, buf, sizeof(buf));
52 1.1 gwr if (len < 0) error (gzerror(in, &err));
53 1.1 gwr if (len == 0) break;
54 1.1 gwr
55 1.1 gwr if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
56 1.1 gwr error("failed fwrite");
57 1.1 gwr }
58 1.1 gwr }
59 1.1 gwr if (fclose(out)) error("failed fclose");
60 1.1 gwr
61 1.1 gwr if (gzclose(in) != Z_OK) error("failed gzclose");
62 1.1 gwr }
63 1.1 gwr
64 1.1 gwr
65 1.1 gwr /* ===========================================================================
66 1.1 gwr * Usage: miniunzip [files...]
67 1.1 gwr */
68 1.1 gwr
69 1.1 gwr int main(argc, argv)
70 1.1 gwr int argc;
71 1.1 gwr char *argv[];
72 1.1 gwr {
73 1.1 gwr gzFile zfp;
74 1.1 gwr
75 1.1 gwr /* save program name and skip */
76 1.1 gwr prog = argv[0];
77 1.1 gwr argc--, argv++;
78 1.1 gwr
79 1.1 gwr /* ignore any switches */
80 1.1 gwr while (*argv && (**argv == '-')) {
81 1.1 gwr argc--, argv++;
82 1.1 gwr }
83 1.1 gwr
84 1.1 gwr if (argc == 0) {
85 1.1 gwr zfp = gzdopen(fileno(stdin), "rb");
86 1.1 gwr if (zfp == NULL)
87 1.1 gwr error("can't gzdopen stdin");
88 1.1 gwr gz_uncompress(zfp, stdout);
89 1.1 gwr return 0;
90 1.1 gwr }
91 1.1 gwr
92 1.1 gwr do {
93 1.1 gwr /* file_uncompress(*argv); */
94 1.1 gwr zfp = gzopen(*argv, "rb");
95 1.1 gwr if (zfp == NULL) {
96 1.1 gwr fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
97 1.1 gwr exit(1);
98 1.1 gwr }
99 1.1 gwr gz_uncompress(zfp, stdout);
100 1.1 gwr } while (argv++, --argc);
101 1.1 gwr return 0; /* to avoid warning */
102 1.1 gwr }
103