1/* ioapi.c -- IO base function header for compress/uncompress .zip 2 files using zlib + zip or unzip API 3 4 Version 1.01e, February 12th, 2005 5 6 Copyright (C) 1998-2005 Gilles Vollant 7*/ 8 9#include <stdio.h> 10#include <stdlib.h> 11#include <string.h> 12 13#include "zlib.h" 14#include "ioapi.h" 15 16 17 18/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ 19 20#ifndef SEEK_CUR 21#define SEEK_CUR 1 22#endif 23 24#ifndef SEEK_END 25#define SEEK_END 2 26#endif 27 28#ifndef SEEK_SET 29#define SEEK_SET 0 30#endif 31 32voidpf ZCALLBACK fopen_file_func OF(( 33 voidpf opaque, 34 const char* filename, 35 int mode)); 36 37uLong ZCALLBACK fread_file_func OF(( 38 voidpf opaque, 39 voidpf stream, 40 void* buf, 41 uLong size)); 42 43uLong ZCALLBACK fwrite_file_func OF(( 44 voidpf opaque, 45 voidpf stream, 46 const void* buf, 47 uLong size)); 48 49long ZCALLBACK ftell_file_func OF(( 50 voidpf opaque, 51 voidpf stream)); 52 53long ZCALLBACK fseek_file_func OF(( 54 voidpf opaque, 55 voidpf stream, 56 uLong offset, 57 int origin)); 58 59int ZCALLBACK fclose_file_func OF(( 60 voidpf opaque, 61 voidpf stream)); 62 63int ZCALLBACK ferror_file_func OF(( 64 voidpf opaque, 65 voidpf stream)); 66 67 68voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) 69 voidpf opaque; 70 const char* filename; 71 int mode; 72{ 73 FILE* file = NULL; 74 const char* mode_fopen = NULL; 75 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) 76 mode_fopen = "rb"; 77 else 78 if (mode & ZLIB_FILEFUNC_MODE_EXISTING) 79 mode_fopen = "r+b"; 80 else 81 if (mode & ZLIB_FILEFUNC_MODE_CREATE) 82 mode_fopen = "wb"; 83 84 if ((filename!=NULL) && (mode_fopen != NULL)) 85 file = fopen(filename, mode_fopen); 86 return file; 87} 88 89 90uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) 91 voidpf opaque; 92 voidpf stream; 93 void* buf; 94 uLong size; 95{ 96 uLong ret; 97 ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); 98 return ret; 99} 100 101 102uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) 103 voidpf opaque; 104 voidpf stream; 105 const void* buf; 106 uLong size; 107{ 108 uLong ret; 109 ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); 110 return ret; 111} 112 113long ZCALLBACK ftell_file_func (opaque, stream) 114 voidpf opaque; 115 voidpf stream; 116{ 117 long ret; 118 ret = ftell((FILE *)stream); 119 return ret; 120} 121 122long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) 123 voidpf opaque; 124 voidpf stream; 125 uLong offset; 126 int origin; 127{ 128 int fseek_origin=0; 129 long ret; 130 switch (origin) 131 { 132 case ZLIB_FILEFUNC_SEEK_CUR : 133 fseek_origin = SEEK_CUR; 134 break; 135 case ZLIB_FILEFUNC_SEEK_END : 136 fseek_origin = SEEK_END; 137 break; 138 case ZLIB_FILEFUNC_SEEK_SET : 139 fseek_origin = SEEK_SET; 140 break; 141 default: return -1; 142 } 143 ret = 0; 144 fseek((FILE *)stream, offset, fseek_origin); 145 return ret; 146} 147 148int ZCALLBACK fclose_file_func (opaque, stream) 149 voidpf opaque; 150 voidpf stream; 151{ 152 int ret; 153 ret = fclose((FILE *)stream); 154 return ret; 155} 156 157int ZCALLBACK ferror_file_func (opaque, stream) 158 voidpf opaque; 159 voidpf stream; 160{ 161 int ret; 162 ret = ferror((FILE *)stream); 163 return ret; 164} 165 166void fill_fopen_filefunc (pzlib_filefunc_def) 167 zlib_filefunc_def* pzlib_filefunc_def; 168{ 169 pzlib_filefunc_def->zopen_file = fopen_file_func; 170 pzlib_filefunc_def->zread_file = fread_file_func; 171 pzlib_filefunc_def->zwrite_file = fwrite_file_func; 172 pzlib_filefunc_def->ztell_file = ftell_file_func; 173 pzlib_filefunc_def->zseek_file = fseek_file_func; 174 pzlib_filefunc_def->zclose_file = fclose_file_func; 175 pzlib_filefunc_def->zerror_file = ferror_file_func; 176 pzlib_filefunc_def->opaque = NULL; 177} 178