1*52678ac6Skamil /* $NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $ */
27e74657eSjoda
37e74657eSjoda /*
47e74657eSjoda * Public domain stdio wrapper for libz, written by Johan Danielsson.
57e74657eSjoda */
67e74657eSjoda
77e74657eSjoda #include <sys/cdefs.h>
87e74657eSjoda #ifndef lint
9*52678ac6Skamil __RCSID("$NetBSD: zopen.c,v 1.4 2017/01/10 04:42:20 kamil Exp $");
107e74657eSjoda #endif
117e74657eSjoda
127e74657eSjoda #include <stdio.h>
137e74657eSjoda #include <zlib.h>
147e74657eSjoda
157e74657eSjoda FILE *zopen(const char *fname, const char *mode);
167e74657eSjoda
177e74657eSjoda /* convert arguments */
187e74657eSjoda static int
xgzread(void * cookie,char * data,int size)197e74657eSjoda xgzread(void *cookie, char *data, int size)
207e74657eSjoda {
217e74657eSjoda return gzread(cookie, data, size);
227e74657eSjoda }
237e74657eSjoda
247e74657eSjoda static int
xgzwrite(void * cookie,const char * data,int size)257e74657eSjoda xgzwrite(void *cookie, const char *data, int size)
267e74657eSjoda {
272c6eadc9Schristos return gzwrite(cookie, __UNCONST(data), size);
287e74657eSjoda }
297e74657eSjoda
307e74657eSjoda FILE *
zopen(const char * fname,const char * mode)317e74657eSjoda zopen(const char *fname, const char *mode)
327e74657eSjoda {
337e74657eSjoda gzFile gz = gzopen(fname, mode);
347e74657eSjoda if(gz == NULL)
357e74657eSjoda return NULL;
367e74657eSjoda
377e74657eSjoda if(*mode == 'r')
38*52678ac6Skamil return funopen(gz, xgzread, NULL, NULL, (int (*)(void *))gzclose);
397e74657eSjoda else
40*52678ac6Skamil return funopen(gz, NULL, xgzwrite, NULL, (int (*)(void *))gzclose);
417e74657eSjoda }
42