183138Skris/*
283138Skris * Public domain stdio wrapper for libz, written by Johan Danielsson.
383138Skris */
483138Skris
584228Sdillon#include <sys/cdefs.h>
6257462Semaste__FBSDID("$FreeBSD: releng/11.0/lib/libz/zopen.c 257462 2013-10-31 18:44:40Z emaste $");
783138Skris
883138Skris#include <stdio.h>
983138Skris#include <zlib.h>
1083138Skris
1183138SkrisFILE *zopen(const char *fname, const char *mode);
1283138Skris
1383138Skris/* convert arguments */
1483138Skrisstatic int
1583138Skrisxgzread(void *cookie, char *data, int size)
1683138Skris{
1783138Skris    return gzread(cookie, data, size);
1883138Skris}
1983138Skris
2083138Skrisstatic int
2183138Skrisxgzwrite(void *cookie, const char *data, int size)
2283138Skris{
2383138Skris    return gzwrite(cookie, (void*)data, size);
2483138Skris}
2583138Skris
26237410Sdelphijstatic int
27237410Sdelphijxgzclose(void *cookie)
28237410Sdelphij{
29237410Sdelphij    return gzclose(cookie);
30237410Sdelphij}
31237410Sdelphij
32256644Sdelphijstatic fpos_t
33256644Sdelphijxgzseek(void *cookie,  fpos_t offset, int whence)
34256644Sdelphij{
35256644Sdelphij	return gzseek(cookie, (z_off_t)offset, whence);
36256644Sdelphij}
37256644Sdelphij
3883138SkrisFILE *
3983138Skriszopen(const char *fname, const char *mode)
4083138Skris{
4183138Skris    gzFile gz = gzopen(fname, mode);
4283138Skris    if(gz == NULL)
4383138Skris	return NULL;
4483138Skris
4583138Skris    if(*mode == 'r')
46256644Sdelphij	return (funopen(gz, xgzread, NULL, xgzseek, xgzclose));
4783138Skris    else
48256644Sdelphij	return (funopen(gz, NULL, xgzwrite, xgzseek, xgzclose));
4983138Skris}
50