diff options
Diffstat (limited to 'lib/libz/zopen.c')
-rw-r--r-- | lib/libz/zopen.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/libz/zopen.c b/lib/libz/zopen.c new file mode 100644 index 0000000..025899f --- /dev/null +++ b/lib/libz/zopen.c @@ -0,0 +1,37 @@ +/* + * Public domain stdio wrapper for libz, written by Johan Danielsson. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <stdio.h> +#include <zlib.h> + +FILE *zopen(const char *fname, const char *mode); + +/* convert arguments */ +static int +xgzread(void *cookie, char *data, int size) +{ + return gzread(cookie, data, size); +} + +static int +xgzwrite(void *cookie, const char *data, int size) +{ + return gzwrite(cookie, (void*)data, size); +} + +FILE * +zopen(const char *fname, const char *mode) +{ + gzFile gz = gzopen(fname, mode); + if(gz == NULL) + return NULL; + + if(*mode == 'r') + return (funopen(gz, xgzread, NULL, NULL, gzclose)); + else + return (funopen(gz, NULL, xgzwrite, NULL, gzclose)); +} |