1/*
2 * Public domain stdio wrapper for libz, written by Johan Danielsson.
3 */
4
5#include <sys/cdefs.h>
6#include <stdio.h>
7#include <zlib.h>
8
9FILE *zopen(const char *fname, const char *mode);
10FILE *zdopen(int fd, const char *mode);
11
12/* convert arguments */
13static int
14xgzread(void *cookie, char *data, int size)
15{
16    return gzread(cookie, data, size);
17}
18
19static int
20xgzwrite(void *cookie, const char *data, int size)
21{
22    return gzwrite(cookie, (void*)data, size);
23}
24
25static int
26xgzclose(void *cookie)
27{
28    return gzclose(cookie);
29}
30
31static fpos_t
32xgzseek(void *cookie,  fpos_t offset, int whence)
33{
34	return gzseek(cookie, (z_off_t)offset, whence);
35}
36
37FILE *
38zopen(const char *fname, const char *mode)
39{
40    gzFile gz = gzopen(fname, mode);
41    if(gz == NULL)
42	return NULL;
43
44    if(*mode == 'r')
45	return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
46    else
47	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
48}
49
50FILE *
51zdopen(int fd, const char *mode)
52{
53	gzFile gz;
54
55	gz = gzdopen(fd, mode);
56	if (gz == NULL)
57		return (NULL);
58
59	if (*mode == 'r')
60		return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
61	else
62		return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
63}
64