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