xref: /netbsd-src/distrib/utils/zcat/zcat.c (revision d25ffa98a4bfca1fe272f3c182496ec9934faac7)
1 /*	$NetBSD: zcat.c,v 1.4 2011/05/19 22:23:12 tsutsui Exp $	*/
2 
3 /* mini zcat.c -- a minimal zcat using the zlib compression library
4  * Copyright (C) 1995-1996 Jean-loup Gailly.
5  * For conditions of distribution and use, see copyright notice in zlib.h
6  */
7 
8 /*
9  * Credits, History:
10  * This program is a reduced version of the minigzip.c
11  * program originally written by Jean-loup Gailly.
12  * This reduction is the work of Gordon Ross.
13  */
14 
15 #include <stdio.h>
16 #include <string.h>
17 #include <stdlib.h>
18 
19 #include "zlib.h"
20 
21 #define BUFLEN 4096
22 
23 char *prog;
24 
25 void error(const char *msg);
26 void gz_uncompress(gzFile in, FILE   *out);
27 int  main(int argc, char *argv[]);
28 
29 /* ===========================================================================
30  * Display error message and exit
31  */
32 void error(const char *msg)
33 {
34 
35 	fprintf(stderr, "%s: %s\n", prog, msg);
36 	exit(EXIT_SUCCESS);
37 }
38 
39 /* ===========================================================================
40  * Uncompress input to output then close both files.
41  */
42 void gz_uncompress(gzFile in, FILE *out)
43 {
44 	char buf[BUFLEN];
45 	int len;
46 	int err;
47 
48 	for (;;) {
49 		len = gzread(in, buf, sizeof(buf));
50 		if (len < 0)
51 			error (gzerror(in, &err));
52 		if (len == 0)
53 			break;
54 
55 		if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
56 			error("failed fwrite");
57 		}
58 	}
59 	if (fclose(out))
60 		error("failed fclose");
61 
62 	if (gzclose(in) != Z_OK)
63 		error("failed gzclose");
64 }
65 
66 
67 /* ===========================================================================
68  * Usage:  zcat [files...]
69  */
70 
71 int main(int argc, char *argv[])
72 {
73 	gzFile zfp;
74 
75 	/* save program name and skip */
76 	prog = argv[0];
77 	argc--, argv++;
78 
79 	/* ignore any switches */
80 	while (*argv && (**argv == '-')) {
81 		argc--, argv++;
82 	}
83 
84 	if (argc == 0) {
85 		zfp = gzdopen(fileno(stdin), "rb");
86 		if (zfp == NULL)
87 			error("can't gzdopen stdin");
88 		gz_uncompress(zfp, stdout);
89 		return 0;
90 	}
91 
92 	do {
93 		/* file_uncompress(*argv); */
94 		zfp = gzopen(*argv, "rb");
95 		if (zfp == NULL) {
96 			fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
97 			exit(EXIT_FAILURE);
98 		}
99 		gz_uncompress(zfp, stdout);
100 	} while (argv++, --argc);
101 	return 0; /* to avoid warning */
102 }
103 
104 
105 /*
106  * XXX: hacks to keep gzio.c from pulling in deflate stuff
107  */
108 
109 int deflateInit2_(z_streamp strm, int  level, int  method,
110     int windowBits, int memLevel, int strategy,
111     const char *version, int stream_size)
112 {
113 
114 	return -1;
115 }
116 
117 int deflate(z_streamp strm, int flush)
118 {
119 
120 	return -1;
121 }
122 
123 int deflateEnd(z_streamp strm)
124 {
125 
126 	return -1;
127 }
128 
129 int deflateParams(z_streamp strm, int level, int strategy)
130 {
131 
132 	return Z_STREAM_ERROR;
133 }
134