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