Skip to content

Latest commit

 

History

History
283 lines (218 loc) · 7.84 KB

dir.c

File metadata and controls

283 lines (218 loc) · 7.84 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);
Mar 25, 2002
Mar 25, 2002
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);
Mar 25, 2002
Mar 25, 2002
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
{
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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);
Jul 8, 2001
Jul 8, 2001
68
69
70
71
72
73
74
75
76
77
78
return(1);
} /* DIR_fileClose */
static int DIR_isArchive(const char *filename, int forWriting)
{
/* directories ARE archives in this driver... */
return(__PHYSFS_platformIsDirectory(filename));
} /* 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
Jul 8, 2001
Jul 8, 2001
98
99
100
101
return(retval);
} /* 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);
Jul 8, 2001
Jul 8, 2001
124
125
126
127
return(retval);
} /* 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);
Jul 8, 2001
Jul 8, 2001
138
139
140
141
return(retval);
} /* 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);
Jul 8, 2001
Jul 8, 2001
152
153
154
155
return(retval);
} /* 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);
May 25, 2002
May 25, 2002
168
169
170
171
return(retval);
} /* 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);
Aug 21, 2002
Aug 21, 2002
187
188
189
190
return(NULL);
} /* 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
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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
{
Sep 26, 2004
Sep 26, 2004
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);
Jul 8, 2001
Jul 8, 2001
224
225
226
227
return(retval);
} /* 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);
Jul 8, 2001
Jul 8, 2001
236
237
238
239
return(retval);
} /* 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 ... */