Skip to content

Latest commit

 

History

History
283 lines (218 loc) · 7.82 KB

archiver_dir.c

File metadata and controls

283 lines (218 loc) · 7.82 KB
 
Jul 7, 2001
Jul 7, 2001
1
2
3
/*
* Standard directory I/O support routines for PhysicsFS.
*
Mar 11, 2007
Mar 11, 2007
4
* Please see the file LICENSE.txt in the source's root directory.
Jul 7, 2001
Jul 7, 2001
5
6
7
8
9
10
*
* This file written by Ryan C. Gordon.
*/
#include <stdio.h>
#include <stdlib.h>
Jul 8, 2001
Jul 8, 2001
11
#include <string.h>
Jul 8, 2001
Jul 8, 2001
12
#include "physfs.h"
Jul 7, 2001
Jul 7, 2001
13
14
15
16
#define __PHYSICSFS_INTERNAL__
#include "physfs_internal.h"
Sep 26, 2004
Sep 26, 2004
17
static PHYSFS_sint64 DIR_read(fvoid *opaque, void *buffer,
Mar 24, 2002
Mar 24, 2002
18
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
Jul 8, 2001
Jul 8, 2001
19
{
Mar 25, 2002
Mar 25, 2002
20
PHYSFS_sint64 retval;
Sep 26, 2004
Sep 26, 2004
21
retval = __PHYSFS_platformRead(opaque, buffer, objSize, objCount);
Jan 28, 2010
Jan 28, 2010
22
return retval;
Jul 8, 2001
Jul 8, 2001
23
24
25
} /* DIR_read */
Sep 26, 2004
Sep 26, 2004
26
static PHYSFS_sint64 DIR_write(fvoid *opaque, const void *buffer,
Mar 24, 2002
Mar 24, 2002
27
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
Jul 8, 2001
Jul 8, 2001
28
{
Mar 25, 2002
Mar 25, 2002
29
PHYSFS_sint64 retval;
Sep 26, 2004
Sep 26, 2004
30
retval = __PHYSFS_platformWrite(opaque, buffer, objSize, objCount);
Jan 28, 2010
Jan 28, 2010
31
return retval;
Jul 8, 2001
Jul 8, 2001
32
33
34
} /* DIR_write */
Sep 26, 2004
Sep 26, 2004
35
static int DIR_eof(fvoid *opaque)
Aug 21, 2002
Aug 21, 2002
36
{
Jan 28, 2010
Jan 28, 2010
37
return __PHYSFS_platformEOF(opaque);
Jul 8, 2001
Jul 8, 2001
38
39
40
} /* DIR_eof */
Sep 26, 2004
Sep 26, 2004
41
static PHYSFS_sint64 DIR_tell(fvoid *opaque)
Jul 8, 2001
Jul 8, 2001
42
{
Jan 28, 2010
Jan 28, 2010
43
return __PHYSFS_platformTell(opaque);
Jul 8, 2001
Jul 8, 2001
44
45
46
} /* DIR_tell */
Sep 26, 2004
Sep 26, 2004
47
static int DIR_seek(fvoid *opaque, PHYSFS_uint64 offset)
Jul 8, 2001
Jul 8, 2001
48
{
Jan 28, 2010
Jan 28, 2010
49
return __PHYSFS_platformSeek(opaque, offset);
Jul 8, 2001
Jul 8, 2001
50
51
52
} /* DIR_seek */
Sep 26, 2004
Sep 26, 2004
53
static PHYSFS_sint64 DIR_fileLength(fvoid *opaque)
Jul 9, 2001
Jul 9, 2001
54
{
Jan 28, 2010
Jan 28, 2010
55
return __PHYSFS_platformFileLength(opaque);
Jul 9, 2001
Jul 9, 2001
56
57
58
} /* DIR_fileLength */
Sep 26, 2004
Sep 26, 2004
59
static int DIR_fileClose(fvoid *opaque)
Jul 8, 2001
Jul 8, 2001
60
61
{
/*
Mar 25, 2002
Mar 25, 2002
62
* we manually flush the buffer, since that's the place a close will
Jul 8, 2001
Jul 8, 2001
63
* most likely fail, but that will leave the file handle in an undefined
Mar 25, 2002
Mar 25, 2002
64
* state if it fails. Flush failures we can recover from.
Jul 8, 2001
Jul 8, 2001
65
*/
Sep 26, 2004
Sep 26, 2004
66
67
BAIL_IF_MACRO(!__PHYSFS_platformFlush(opaque), NULL, 0);
BAIL_IF_MACRO(!__PHYSFS_platformClose(opaque), NULL, 0);
Jan 28, 2010
Jan 28, 2010
68
return 1;
Jul 8, 2001
Jul 8, 2001
69
70
71
72
73
74
} /* DIR_fileClose */
static int DIR_isArchive(const char *filename, int forWriting)
{
/* directories ARE archives in this driver... */
Jan 28, 2010
Jan 28, 2010
75
return __PHYSFS_platformIsDirectory(filename);
Jul 8, 2001
Jul 8, 2001
76
77
78
} /* DIR_isArchive */
Sep 26, 2004
Sep 26, 2004
79
static void *DIR_openArchive(const char *name, int forWriting)
Jul 8, 2001
Jul 8, 2001
80
{
Jul 8, 2001
Jul 8, 2001
81
const char *dirsep = PHYSFS_getDirSeparator();
Sep 26, 2004
Sep 26, 2004
82
char *retval = NULL;
Sep 2, 2001
Sep 2, 2001
83
84
size_t namelen = strlen(name);
size_t seplen = strlen(dirsep);
Jul 8, 2001
Jul 8, 2001
85
Sep 26, 2004
Sep 26, 2004
86
/* !!! FIXME: when is this not called right before openArchive? */
Jul 8, 2001
Jul 8, 2001
87
BAIL_IF_MACRO(!DIR_isArchive(name, forWriting),
Sep 26, 2004
Sep 26, 2004
88
ERR_UNSUPPORTED_ARCHIVE, 0);
Jul 8, 2001
Jul 8, 2001
89
Mar 14, 2005
Mar 14, 2005
90
retval = allocator.Malloc(namelen + seplen + 1);
Jul 8, 2001
Jul 8, 2001
91
92
93
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
/* make sure there's a dir separator at the end of the string */
Sep 26, 2004
Sep 26, 2004
94
strcpy(retval, name);
Jul 8, 2001
Jul 8, 2001
95
if (strcmp((name + namelen) - seplen, dirsep) != 0)
Sep 26, 2004
Sep 26, 2004
96
strcat(retval, dirsep);
Oct 9, 2001
Oct 9, 2001
97
Jan 28, 2010
Jan 28, 2010
98
return retval;
Jul 8, 2001
Jul 8, 2001
99
100
101
} /* DIR_openArchive */
Sep 29, 2004
Sep 29, 2004
102
static void DIR_enumerateFiles(dvoid *opaque, const char *dname,
Sep 18, 2005
Sep 18, 2005
103
104
int omitSymLinks, PHYSFS_EnumFilesCallback cb,
const char *origdir, void *callbackdata)
Jul 8, 2001
Jul 8, 2001
105
{
Sep 26, 2004
Sep 26, 2004
106
char *d = __PHYSFS_platformCvtToDependent((char *)opaque, dname, NULL);
Sep 29, 2004
Sep 29, 2004
107
108
if (d != NULL)
{
Sep 18, 2005
Sep 18, 2005
109
110
__PHYSFS_platformEnumerateFiles(d, omitSymLinks, cb,
origdir, callbackdata);
Mar 14, 2005
Mar 14, 2005
111
allocator.Free(d);
Sep 29, 2004
Sep 29, 2004
112
} /* if */
Jul 8, 2001
Jul 8, 2001
113
114
115
} /* DIR_enumerateFiles */
Sep 26, 2004
Sep 26, 2004
116
static int DIR_exists(dvoid *opaque, const char *name)
Jul 8, 2001
Jul 8, 2001
117
{
Sep 26, 2004
Sep 26, 2004
118
char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Jul 8, 2001
Jul 8, 2001
119
120
121
122
int retval;
BAIL_IF_MACRO(f == NULL, NULL, 0);
retval = __PHYSFS_platformExists(f);
Mar 14, 2005
Mar 14, 2005
123
allocator.Free(f);
Jan 28, 2010
Jan 28, 2010
124
return retval;
Jul 8, 2001
Jul 8, 2001
125
126
127
} /* DIR_exists */
Sep 26, 2004
Sep 26, 2004
128
static int DIR_isDirectory(dvoid *opaque, const char *name, int *fileExists)
Jul 8, 2001
Jul 8, 2001
129
{
Sep 26, 2004
Sep 26, 2004
130
char *d = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Aug 21, 2002
Aug 21, 2002
131
int retval = 0;
Jul 8, 2001
Jul 8, 2001
132
133
BAIL_IF_MACRO(d == NULL, NULL, 0);
Aug 21, 2002
Aug 21, 2002
134
135
136
*fileExists = __PHYSFS_platformExists(d);
if (*fileExists)
retval = __PHYSFS_platformIsDirectory(d);
Mar 14, 2005
Mar 14, 2005
137
allocator.Free(d);
Jan 28, 2010
Jan 28, 2010
138
return retval;
Jul 8, 2001
Jul 8, 2001
139
140
141
} /* DIR_isDirectory */
Sep 26, 2004
Sep 26, 2004
142
static int DIR_isSymLink(dvoid *opaque, const char *name, int *fileExists)
Jul 8, 2001
Jul 8, 2001
143
{
Sep 26, 2004
Sep 26, 2004
144
char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Aug 21, 2002
Aug 21, 2002
145
int retval = 0;
Jul 8, 2001
Jul 8, 2001
146
May 21, 2002
May 21, 2002
147
BAIL_IF_MACRO(f == NULL, NULL, 0);
Aug 21, 2002
Aug 21, 2002
148
149
150
*fileExists = __PHYSFS_platformExists(f);
if (*fileExists)
retval = __PHYSFS_platformIsSymLink(f);
Mar 14, 2005
Mar 14, 2005
151
allocator.Free(f);
Jan 28, 2010
Jan 28, 2010
152
return retval;
Jul 8, 2001
Jul 8, 2001
153
154
155
} /* DIR_isSymLink */
Sep 26, 2004
Sep 26, 2004
156
static PHYSFS_sint64 DIR_getLastModTime(dvoid *opaque,
Aug 21, 2002
Aug 21, 2002
157
158
const char *name,
int *fileExists)
May 25, 2002
May 25, 2002
159
{
Sep 26, 2004
Sep 26, 2004
160
char *d = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Aug 21, 2002
Aug 21, 2002
161
PHYSFS_sint64 retval = -1;
May 25, 2002
May 25, 2002
162
163
BAIL_IF_MACRO(d == NULL, NULL, 0);
Aug 21, 2002
Aug 21, 2002
164
165
166
*fileExists = __PHYSFS_platformExists(d);
if (*fileExists)
retval = __PHYSFS_platformGetLastModTime(d);
Mar 14, 2005
Mar 14, 2005
167
allocator.Free(d);
Jan 28, 2010
Jan 28, 2010
168
return retval;
May 25, 2002
May 25, 2002
169
170
171
} /* DIR_getLastModTime */
Sep 26, 2004
Sep 26, 2004
172
173
174
static fvoid *doOpen(dvoid *opaque, const char *name,
void *(*openFunc)(const char *filename),
int *fileExists)
Jul 8, 2001
Jul 8, 2001
175
{
Sep 26, 2004
Sep 26, 2004
176
char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Sep 26, 2004
Sep 26, 2004
177
void *rc = NULL;
Jul 8, 2001
Jul 8, 2001
178
179
180
BAIL_IF_MACRO(f == NULL, NULL, NULL);
Aug 21, 2002
Aug 21, 2002
181
182
183
184
185
if (fileExists != NULL)
{
*fileExists = __PHYSFS_platformExists(f);
if (!(*fileExists))
{
Mar 14, 2005
Mar 14, 2005
186
allocator.Free(f);
Jan 28, 2010
Jan 28, 2010
187
return NULL;
Aug 21, 2002
Aug 21, 2002
188
189
190
} /* if */
} /* if */
Mar 25, 2002
Mar 25, 2002
191
rc = openFunc(f);
Mar 14, 2005
Mar 14, 2005
192
allocator.Free(f);
Jul 8, 2001
Jul 8, 2001
193
Jan 28, 2010
Jan 28, 2010
194
return ((fvoid *) rc);
Jul 8, 2001
Jul 8, 2001
195
196
197
} /* doOpen */
Sep 26, 2004
Sep 26, 2004
198
static fvoid *DIR_openRead(dvoid *opaque, const char *fnm, int *exist)
Jul 8, 2001
Jul 8, 2001
199
{
Jan 28, 2010
Jan 28, 2010
200
return doOpen(opaque, fnm, __PHYSFS_platformOpenRead, exist);
Jul 8, 2001
Jul 8, 2001
201
202
203
} /* DIR_openRead */
Sep 26, 2004
Sep 26, 2004
204
static fvoid *DIR_openWrite(dvoid *opaque, const char *filename)
Jul 8, 2001
Jul 8, 2001
205
{
Jan 28, 2010
Jan 28, 2010
206
return doOpen(opaque, filename, __PHYSFS_platformOpenWrite, NULL);
Jul 8, 2001
Jul 8, 2001
207
208
209
} /* DIR_openWrite */
Sep 26, 2004
Sep 26, 2004
210
static fvoid *DIR_openAppend(dvoid *opaque, const char *filename)
Jul 8, 2001
Jul 8, 2001
211
{
Jan 28, 2010
Jan 28, 2010
212
return doOpen(opaque, filename, __PHYSFS_platformOpenAppend, NULL);
Jul 8, 2001
Jul 8, 2001
213
214
215
} /* DIR_openAppend */
Sep 26, 2004
Sep 26, 2004
216
static int DIR_remove(dvoid *opaque, const char *name)
Jul 8, 2001
Jul 8, 2001
217
{
Sep 26, 2004
Sep 26, 2004
218
char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Jul 8, 2001
Jul 8, 2001
219
220
221
int retval;
BAIL_IF_MACRO(f == NULL, NULL, 0);
Mar 25, 2002
Mar 25, 2002
222
retval = __PHYSFS_platformDelete(f);
Mar 14, 2005
Mar 14, 2005
223
allocator.Free(f);
Jan 28, 2010
Jan 28, 2010
224
return retval;
Jul 8, 2001
Jul 8, 2001
225
226
227
} /* DIR_remove */
Sep 26, 2004
Sep 26, 2004
228
static int DIR_mkdir(dvoid *opaque, const char *name)
Jul 8, 2001
Jul 8, 2001
229
{
Sep 26, 2004
Sep 26, 2004
230
char *f = __PHYSFS_platformCvtToDependent((char *) opaque, name, NULL);
Jul 8, 2001
Jul 8, 2001
231
232
233
int retval;
BAIL_IF_MACRO(f == NULL, NULL, 0);
Aug 23, 2001
Aug 23, 2001
234
retval = __PHYSFS_platformMkDir(f);
Mar 14, 2005
Mar 14, 2005
235
allocator.Free(f);
Jan 28, 2010
Jan 28, 2010
236
return retval;
Jul 8, 2001
Jul 8, 2001
237
238
239
} /* DIR_mkdir */
Sep 26, 2004
Sep 26, 2004
240
static void DIR_dirClose(dvoid *opaque)
Jul 8, 2001
Jul 8, 2001
241
{
Mar 14, 2005
Mar 14, 2005
242
allocator.Free(opaque);
Jul 8, 2001
Jul 8, 2001
243
244
} /* DIR_dirClose */
Sep 29, 2004
Sep 29, 2004
245
246
247
248
249
250
const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_DIR =
{
"",
DIR_ARCHIVE_DESCRIPTION,
Jan 1, 2006
Jan 1, 2006
251
"Ryan C. Gordon <icculus@icculus.org>",
Sep 29, 2004
Sep 29, 2004
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
"http://icculus.org/physfs/",
};
const PHYSFS_Archiver __PHYSFS_Archiver_DIR =
{
&__PHYSFS_ArchiveInfo_DIR,
DIR_isArchive, /* isArchive() method */
DIR_openArchive, /* openArchive() method */
DIR_enumerateFiles, /* enumerateFiles() method */
DIR_exists, /* exists() method */
DIR_isDirectory, /* isDirectory() method */
DIR_isSymLink, /* isSymLink() method */
DIR_getLastModTime, /* getLastModTime() method */
DIR_openRead, /* openRead() method */
DIR_openWrite, /* openWrite() method */
DIR_openAppend, /* openAppend() method */
DIR_remove, /* remove() method */
DIR_mkdir, /* mkdir() method */
DIR_dirClose, /* dirClose() method */
DIR_read, /* read() method */
DIR_write, /* write() method */
DIR_eof, /* eof() method */
DIR_tell, /* tell() method */
DIR_seek, /* seek() method */
DIR_fileLength, /* fileLength() method */
DIR_fileClose /* fileClose() method */
};
Jul 7, 2001
Jul 7, 2001
282
/* end of dir.c ... */