/* ioapi.c -- IO base function header for compress/uncompress .zip | |
files using zlib + zip or unzip API | |
Version 1.01e, February 12th, 2005 | |
Copyright (C) 1998-2005 Gilles Vollant | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include "zlib.h" | |
#include "ioapi.h" | |
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ | |
#ifndef SEEK_CUR | |
#define SEEK_CUR 1 | |
#endif | |
#ifndef SEEK_END | |
#define SEEK_END 2 | |
#endif | |
#ifndef SEEK_SET | |
#define SEEK_SET 0 | |
#endif | |
voidpf ZCALLBACK fopen_file_func OF(( | |
voidpf opaque, | |
const char* filename, | |
int mode)); | |
uLong ZCALLBACK fread_file_func OF(( | |
voidpf opaque, | |
voidpf stream, | |
void* buf, | |
uLong size)); | |
uLong ZCALLBACK fwrite_file_func OF(( | |
voidpf opaque, | |
voidpf stream, | |
const void* buf, | |
uLong size)); | |
long ZCALLBACK ftell_file_func OF(( | |
voidpf opaque, | |
voidpf stream)); | |
long ZCALLBACK fseek_file_func OF(( | |
voidpf opaque, | |
voidpf stream, | |
uLong offset, | |
int origin)); | |
int ZCALLBACK fclose_file_func OF(( | |
voidpf opaque, | |
voidpf stream)); | |
int ZCALLBACK ferror_file_func OF(( | |
voidpf opaque, | |
voidpf stream)); | |
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) | |
voidpf opaque; | |
const char* filename; | |
int mode; | |
{ | |
FILE* file = NULL; | |
const char* mode_fopen = NULL; | |
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) | |
mode_fopen = "rb"; | |
else | |
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) | |
mode_fopen = "r+b"; | |
else | |
if (mode & ZLIB_FILEFUNC_MODE_CREATE) | |
mode_fopen = "wb"; | |
if ((filename!=NULL) && (mode_fopen != NULL)) | |
file = fopen(filename, mode_fopen); | |
return file; | |
} | |
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) | |
voidpf opaque; | |
voidpf stream; | |
void* buf; | |
uLong size; | |
{ | |
uLong ret; | |
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); | |
return ret; | |
} | |
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) | |
voidpf opaque; | |
voidpf stream; | |
const void* buf; | |
uLong size; | |
{ | |
uLong ret; | |
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); | |
return ret; | |
} | |
long ZCALLBACK ftell_file_func (opaque, stream) | |
voidpf opaque; | |
voidpf stream; | |
{ | |
long ret; | |
ret = ftell((FILE *)stream); | |
return ret; | |
} | |
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) | |
voidpf opaque; | |
voidpf stream; | |
uLong offset; | |
int origin; | |
{ | |
int fseek_origin=0; | |
long ret; | |
switch (origin) | |
{ | |
case ZLIB_FILEFUNC_SEEK_CUR : | |
fseek_origin = SEEK_CUR; | |
break; | |
case ZLIB_FILEFUNC_SEEK_END : | |
fseek_origin = SEEK_END; | |
break; | |
case ZLIB_FILEFUNC_SEEK_SET : | |
fseek_origin = SEEK_SET; | |
break; | |
default: return -1; | |
} | |
ret = 0; | |
fseek((FILE *)stream, offset, fseek_origin); | |
return ret; | |
} | |
int ZCALLBACK fclose_file_func (opaque, stream) | |
voidpf opaque; | |
voidpf stream; | |
{ | |
int ret; | |
ret = fclose((FILE *)stream); | |
return ret; | |
} | |
int ZCALLBACK ferror_file_func (opaque, stream) | |
voidpf opaque; | |
voidpf stream; | |
{ | |
int ret; | |
ret = ferror((FILE *)stream); | |
return ret; | |
} | |
void fill_fopen_filefunc (pzlib_filefunc_def) | |
zlib_filefunc_def* pzlib_filefunc_def; | |
{ | |
pzlib_filefunc_def->zopen_file = fopen_file_func; | |
pzlib_filefunc_def->zread_file = fread_file_func; | |
pzlib_filefunc_def->zwrite_file = fwrite_file_func; | |
pzlib_filefunc_def->ztell_file = ftell_file_func; | |
pzlib_filefunc_def->zseek_file = fseek_file_func; | |
pzlib_filefunc_def->zclose_file = fclose_file_func; | |
pzlib_filefunc_def->zerror_file = ferror_file_func; | |
pzlib_filefunc_def->opaque = NULL; | |
} |