text: /*
   * 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);
  }
  
  static int
  xgzclose(void *cookie)
  {
      return gzclose(cookie);
  }
  
  static fpos_t
  xgzseek(void *cookie,  fpos_t offset, int whence)
  {
  	return gzseek(cookie, (z_off_t)offset, whence);
  }
  
  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, xgzseek, xgzclose));
      else
  	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
  }
  