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
9 FILE *zopen(const char *fname, const char *mode);
10 FILE *zdopen(int fd, const char *mode);
11
12 /* convert arguments */
13 static int
xgzread(void * cookie,char * data,int size)14 xgzread(void *cookie, char *data, int size)
15 {
16 return gzread(cookie, data, size);
17 }
18
19 static int
xgzwrite(void * cookie,const char * data,int size)20 xgzwrite(void *cookie, const char *data, int size)
21 {
22 return gzwrite(cookie, (void*)data, size);
23 }
24
25 static int
xgzclose(void * cookie)26 xgzclose(void *cookie)
27 {
28 return gzclose(cookie);
29 }
30
31 static fpos_t
xgzseek(void * cookie,fpos_t offset,int whence)32 xgzseek(void *cookie, fpos_t offset, int whence)
33 {
34 return gzseek(cookie, (z_off_t)offset, whence);
35 }
36
37 FILE *
zopen(const char * fname,const char * mode)38 zopen(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
50 FILE *
zdopen(int fd,const char * mode)51 zdopen(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