1131ee164SKris Kennaway /*
2131ee164SKris Kennaway * Public domain stdio wrapper for libz, written by Johan Danielsson.
3131ee164SKris Kennaway */
4131ee164SKris Kennaway
5fa81a976SMatthew Dillon #include <sys/cdefs.h>
6131ee164SKris Kennaway #include <stdio.h>
7131ee164SKris Kennaway #include <zlib.h>
8131ee164SKris Kennaway
9131ee164SKris Kennaway FILE *zopen(const char *fname, const char *mode);
10*8e2a46c8SMark Johnston FILE *zdopen(int fd, const char *mode);
11131ee164SKris Kennaway
12131ee164SKris Kennaway /* convert arguments */
13131ee164SKris Kennaway static int
xgzread(void * cookie,char * data,int size)14131ee164SKris Kennaway xgzread(void *cookie, char *data, int size)
15131ee164SKris Kennaway {
16131ee164SKris Kennaway return gzread(cookie, data, size);
17131ee164SKris Kennaway }
18131ee164SKris Kennaway
19131ee164SKris Kennaway static int
xgzwrite(void * cookie,const char * data,int size)20131ee164SKris Kennaway xgzwrite(void *cookie, const char *data, int size)
21131ee164SKris Kennaway {
22131ee164SKris Kennaway return gzwrite(cookie, (void*)data, size);
23131ee164SKris Kennaway }
24131ee164SKris Kennaway
25a2953f76SXin LI static int
xgzclose(void * cookie)26a2953f76SXin LI xgzclose(void *cookie)
27a2953f76SXin LI {
28a2953f76SXin LI return gzclose(cookie);
29a2953f76SXin LI }
30a2953f76SXin LI
3186ccd3e0SXin LI static fpos_t
xgzseek(void * cookie,fpos_t offset,int whence)3286ccd3e0SXin LI xgzseek(void *cookie, fpos_t offset, int whence)
3386ccd3e0SXin LI {
3486ccd3e0SXin LI return gzseek(cookie, (z_off_t)offset, whence);
3586ccd3e0SXin LI }
3686ccd3e0SXin LI
37131ee164SKris Kennaway FILE *
zopen(const char * fname,const char * mode)38131ee164SKris Kennaway zopen(const char *fname, const char *mode)
39131ee164SKris Kennaway {
40131ee164SKris Kennaway gzFile gz = gzopen(fname, mode);
41131ee164SKris Kennaway if(gz == NULL)
42131ee164SKris Kennaway return NULL;
43131ee164SKris Kennaway
44131ee164SKris Kennaway if(*mode == 'r')
4586ccd3e0SXin LI return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
46131ee164SKris Kennaway else
4786ccd3e0SXin LI return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
48131ee164SKris Kennaway }
49*8e2a46c8SMark Johnston
50*8e2a46c8SMark Johnston FILE *
zdopen(int fd,const char * mode)51*8e2a46c8SMark Johnston zdopen(int fd, const char *mode)
52*8e2a46c8SMark Johnston {
53*8e2a46c8SMark Johnston gzFile gz;
54*8e2a46c8SMark Johnston
55*8e2a46c8SMark Johnston gz = gzdopen(fd, mode);
56*8e2a46c8SMark Johnston if (gz == NULL)
57*8e2a46c8SMark Johnston return (NULL);
58*8e2a46c8SMark Johnston
59*8e2a46c8SMark Johnston if (*mode == 'r')
60*8e2a46c8SMark Johnston return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
61*8e2a46c8SMark Johnston else
62*8e2a46c8SMark Johnston return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
63*8e2a46c8SMark Johnston }
64