|
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 |
|
32 voidpf ZCALLBACK fopen_file_func OF(( |
|
33 voidpf opaque, |
|
34 const char* filename, |
|
35 int mode)); |
|
36 |
|
37 uLong ZCALLBACK fread_file_func OF(( |
|
38 voidpf opaque, |
|
39 voidpf stream, |
|
40 void* buf, |
|
41 uLong size)); |
|
42 |
|
43 uLong ZCALLBACK fwrite_file_func OF(( |
|
44 voidpf opaque, |
|
45 voidpf stream, |
|
46 const void* buf, |
|
47 uLong size)); |
|
48 |
|
49 long ZCALLBACK ftell_file_func OF(( |
|
50 voidpf opaque, |
|
51 voidpf stream)); |
|
52 |
|
53 long ZCALLBACK fseek_file_func OF(( |
|
54 voidpf opaque, |
|
55 voidpf stream, |
|
56 uLong offset, |
|
57 int origin)); |
|
58 |
|
59 int ZCALLBACK fclose_file_func OF(( |
|
60 voidpf opaque, |
|
61 voidpf stream)); |
|
62 |
|
63 int ZCALLBACK ferror_file_func OF(( |
|
64 voidpf opaque, |
|
65 voidpf stream)); |
|
66 |
|
67 |
|
68 voidpf 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 |
|
90 uLong 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 |
|
102 uLong 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 |
|
113 long 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 |
|
122 long 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 |
|
148 int 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 |
|
157 int 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 |
|
166 void 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 } |