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