Skip to content

Latest commit

 

History

History
719 lines (611 loc) · 26.7 KB

physfs_internal.h

File metadata and controls

719 lines (611 loc) · 26.7 KB
 
Jul 6, 2001
Jul 6, 2001
1
2
3
4
/*
* Internal function/structure declaration. Do NOT include in your
* application.
*
Mar 11, 2007
Mar 11, 2007
5
* Please see the file LICENSE.txt in the source's root directory.
Jul 6, 2001
Jul 6, 2001
6
7
8
9
10
11
12
13
14
15
16
*
* This file written by Ryan C. Gordon.
*/
#ifndef _INCLUDE_PHYSFS_INTERNAL_H_
#define _INCLUDE_PHYSFS_INTERNAL_H_
#ifndef __PHYSICSFS_INTERNAL__
#error Do not include this header from your applications.
#endif
Jul 12, 2017
Jul 12, 2017
17
18
19
20
21
/* Turn off MSVC warnings that are aggressively anti-portability. */
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS 1
#endif
Mar 24, 2002
Mar 24, 2002
22
23
#include "physfs.h"
Sep 6, 2010
Sep 6, 2010
24
25
26
27
/* The holy trinity. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Mar 15, 2007
Mar 15, 2007
28
Mar 19, 2012
Mar 19, 2012
29
30
#include "physfs_platforms.h"
Nov 22, 2002
Nov 22, 2002
31
32
#include <assert.h>
Mar 19, 2007
Mar 19, 2007
33
/* !!! FIXME: remove this when revamping stack allocation code... */
Jul 6, 2017
Jul 6, 2017
34
#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__WATCOMC__)
Mar 19, 2007
Mar 19, 2007
35
36
37
#include <malloc.h>
#endif
Mar 20, 2012
Mar 20, 2012
38
#if PHYSFS_PLATFORM_SOLARIS
Apr 8, 2010
Apr 8, 2010
39
40
41
#include <alloca.h>
#endif
Mar 24, 2002
Mar 24, 2002
42
43
44
45
#ifdef __cplusplus
extern "C" {
#endif
Mar 12, 2008
Mar 12, 2008
46
#ifdef __GNUC__
Mar 12, 2008
Mar 12, 2008
47
#define PHYSFS_MINIMUM_GCC_VERSION(major, minor) \
Mar 12, 2008
Mar 12, 2008
48
49
( ((__GNUC__ << 16) + __GNUC_MINOR__) >= (((major) << 16) + (minor)) )
#else
Mar 12, 2008
Mar 12, 2008
50
#define PHYSFS_MINIMUM_GCC_VERSION(major, minor) (0)
Mar 12, 2008
Mar 12, 2008
51
52
#endif
Aug 21, 2010
Aug 21, 2010
53
54
55
56
57
58
59
60
#ifdef __cplusplus
/* C++ always has a real inline keyword. */
#elif (defined macintosh) && !(defined __MWERKS__)
# define inline
#elif (defined _MSC_VER)
# define inline __inline
#endif
Mar 19, 2012
Mar 19, 2012
61
#if PHYSFS_PLATFORM_LINUX && !defined(_FILE_OFFSET_BITS)
Mar 18, 2012
Mar 18, 2012
62
63
#define _FILE_OFFSET_BITS 64
#endif
Jul 9, 2017
Jul 9, 2017
64
Jul 12, 2017
Jul 12, 2017
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* All public APIs need to be in physfs.h with a PHYSFS_DECL.
All file-private symbols need to be marked "static".
Everything shared between PhysicsFS sources needs to be in this
file between the visibility pragma blocks. */
#if PHYSFS_MINIMUM_GCC_VERSION(4,0) || defined(__clang__)
#define PHYSFS_HAVE_PRAGMA_VISIBILITY 1
#endif
#if PHYSFS_HAVE_PRAGMA_VISIBILITY
#pragma GCC visibility push(hidden)
#endif
/* These are the build-in archivers. We list them all as "extern" here without
#ifdefs to keep it tidy, but obviously you need to make sure these are
wrapped in PHYSFS_SUPPORTS_* checks before actually referencing them. */
extern const PHYSFS_Archiver __PHYSFS_Archiver_DIR;
extern const PHYSFS_Archiver __PHYSFS_Archiver_ZIP;
Jul 22, 2017
Jul 22, 2017
82
extern const PHYSFS_Archiver __PHYSFS_Archiver_7Z;
Jul 12, 2017
Jul 12, 2017
83
84
85
86
87
88
89
90
91
extern const PHYSFS_Archiver __PHYSFS_Archiver_GRP;
extern const PHYSFS_Archiver __PHYSFS_Archiver_QPAK;
extern const PHYSFS_Archiver __PHYSFS_Archiver_HOG;
extern const PHYSFS_Archiver __PHYSFS_Archiver_MVL;
extern const PHYSFS_Archiver __PHYSFS_Archiver_WAD;
extern const PHYSFS_Archiver __PHYSFS_Archiver_SLB;
extern const PHYSFS_Archiver __PHYSFS_Archiver_ISO9660;
extern const PHYSFS_Archiver __PHYSFS_Archiver_VDF;
Jul 9, 2017
Jul 9, 2017
92
93
94
95
96
97
98
99
/* a real C99-compliant snprintf() is in Visual Studio 2015,
but just use this everywhere for binary compatibility. */
#if defined(_MSC_VER)
int __PHYSFS_msvc_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap);
int __PHYSFS_msvc_snprintf(char *outBuf, size_t size, const char *format, ...);
#define vsnprintf __PHYSFS_msvc_vsnprintf
#define snprintf __PHYSFS_msvc_snprintf
#endif
Mar 18, 2012
Mar 18, 2012
100
Mar 24, 2007
Mar 24, 2007
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Interface for small allocations. If you need a little scratch space for
* a throwaway buffer or string, use this. It will make small allocations
* on the stack if possible, and use allocator.Malloc() if they are too
* large. This helps reduce malloc pressure.
* There are some rules, though:
* NEVER return a pointer from this, as stack-allocated buffers go away
* when your function returns.
* NEVER allocate in a loop, as stack-allocated pointers will pile up. Call
* a function that uses smallAlloc from your loop, so the allocation can
* free each time.
* NEVER call smallAlloc with any complex expression (it's a macro that WILL
* have side effects...it references the argument multiple times). Use a
* variable or a literal.
* NEVER free a pointer from this with anything but smallFree. It will not
* be a valid pointer to the allocator, regardless of where the memory came
* from.
* NEVER realloc a pointer from this.
* NEVER forget to use smallFree: it may not be a pointer from the stack.
* NEVER forget to check for NULL...allocation can fail here, of course!
*/
Mar 10, 2012
Mar 10, 2012
122
#define __PHYSFS_SMALLALLOCTHRESHOLD 256
Mar 24, 2007
Mar 24, 2007
123
124
125
void *__PHYSFS_initSmallAlloc(void *ptr, PHYSFS_uint64 len);
#define __PHYSFS_smallAlloc(bytes) ( \
Mar 12, 2012
Mar 12, 2012
126
127
128
__PHYSFS_initSmallAlloc( \
(((bytes) < __PHYSFS_SMALLALLOCTHRESHOLD) ? \
alloca((size_t)((bytes)+sizeof(void*))) : NULL), (bytes)) \
Mar 24, 2007
Mar 24, 2007
129
130
131
132
133
)
void __PHYSFS_smallFree(void *ptr);
Mar 14, 2005
Mar 14, 2005
134
135
136
137
/* Use the allocation hooks. */
#define malloc(x) Do not use malloc() directly.
#define realloc(x, y) Do not use realloc() directly.
#define free(x) Do not use free() directly.
Mar 19, 2007
Mar 19, 2007
138
/* !!! FIXME: add alloca check here. */
Jul 28, 2002
Jul 28, 2002
139
Mar 23, 2012
Mar 23, 2012
140
141
142
143
#ifndef PHYSFS_SUPPORTS_ZIP
#define PHYSFS_SUPPORTS_ZIP 1
#endif
#ifndef PHYSFS_SUPPORTS_7Z
Jul 17, 2017
Jul 17, 2017
144
#define PHYSFS_SUPPORTS_7Z 1
Mar 23, 2012
Mar 23, 2012
145
146
#endif
#ifndef PHYSFS_SUPPORTS_GRP
Jul 8, 2017
Jul 8, 2017
147
#define PHYSFS_SUPPORTS_GRP 1
Mar 23, 2012
Mar 23, 2012
148
149
#endif
#ifndef PHYSFS_SUPPORTS_HOG
Jul 8, 2017
Jul 8, 2017
150
#define PHYSFS_SUPPORTS_HOG 1
Mar 23, 2012
Mar 23, 2012
151
152
#endif
#ifndef PHYSFS_SUPPORTS_MVL
Jul 8, 2017
Jul 8, 2017
153
#define PHYSFS_SUPPORTS_MVL 1
Mar 23, 2012
Mar 23, 2012
154
155
#endif
#ifndef PHYSFS_SUPPORTS_WAD
Jul 8, 2017
Jul 8, 2017
156
#define PHYSFS_SUPPORTS_WAD 1
Mar 23, 2012
Mar 23, 2012
157
#endif
Jul 16, 2017
Jul 16, 2017
158
159
160
#ifndef PHYSFS_SUPPORTS_QPAK
#define PHYSFS_SUPPORTS_QPAK 1
#endif
Nov 12, 2012
Nov 12, 2012
161
#ifndef PHYSFS_SUPPORTS_SLB
Jul 8, 2017
Jul 8, 2017
162
#define PHYSFS_SUPPORTS_SLB 1
Nov 12, 2012
Nov 12, 2012
163
#endif
Mar 23, 2012
Mar 23, 2012
164
#ifndef PHYSFS_SUPPORTS_ISO9660
Jul 8, 2017
Jul 8, 2017
165
#define PHYSFS_SUPPORTS_ISO9660 1
Mar 23, 2012
Mar 23, 2012
166
#endif
Jun 20, 2017
Jun 20, 2017
167
#ifndef PHYSFS_SUPPORTS_VDF
Jul 8, 2017
Jul 8, 2017
168
#define PHYSFS_SUPPORTS_VDF 1
Jun 20, 2017
Jun 20, 2017
169
#endif
Mar 23, 2012
Mar 23, 2012
170
Mar 25, 2012
Mar 25, 2012
171
172
/* The latest supported PHYSFS_Io::version value. */
#define CURRENT_PHYSFS_IO_API_VERSION 0
Jul 8, 2001
Jul 8, 2001
173
Nov 28, 2012
Nov 28, 2012
174
175
/* The latest supported PHYSFS_Archiver::version value. */
#define CURRENT_PHYSFS_ARCHIVER_API_VERSION 0
Dec 1, 2002
Dec 1, 2002
176
Feb 25, 2016
Feb 25, 2016
177
/* This byteorder stuff was lifted from SDL. https://www.libsdl.org/ */
Apr 9, 2004
Apr 9, 2004
178
179
180
#define PHYSFS_LIL_ENDIAN 1234
#define PHYSFS_BIG_ENDIAN 4321
Feb 25, 2016
Feb 25, 2016
181
182
183
184
185
186
187
188
189
190
#ifdef __linux__
#include <endian.h>
#define PHYSFS_BYTEORDER __BYTE_ORDER
#else /* __linux__ */
#if defined(__hppa__) || \
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
(defined(__MIPS__) && defined(__MISPEB__)) || \
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
defined(__sparc__)
#define PHYSFS_BYTEORDER PHYSFS_BIG_ENDIAN
Apr 9, 2004
Apr 9, 2004
191
#else
Feb 25, 2016
Feb 25, 2016
192
#define PHYSFS_BYTEORDER PHYSFS_LIL_ENDIAN
Apr 9, 2004
Apr 9, 2004
193
#endif
Feb 25, 2016
Feb 25, 2016
194
#endif /* __linux__ */
Apr 9, 2004
Apr 9, 2004
195
196
Aug 20, 2002
Aug 20, 2002
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*
* When sorting the entries in an archive, we use a modified QuickSort.
* When there are less then PHYSFS_QUICKSORT_THRESHOLD entries left to sort,
* we switch over to a BubbleSort for the remainder. Tweak to taste.
*
* You can override this setting by defining PHYSFS_QUICKSORT_THRESHOLD
* before #including "physfs_internal.h".
*/
#ifndef PHYSFS_QUICKSORT_THRESHOLD
#define PHYSFS_QUICKSORT_THRESHOLD 4
#endif
/*
* Sort an array (or whatever) of (max) elements. This uses a mixture of
* a QuickSort and BubbleSort internally.
* (cmpfn) is used to determine ordering, and (swapfn) does the actual
* swapping of elements in the list.
*/
Jun 1, 2012
Jun 1, 2012
215
216
217
void __PHYSFS_sort(void *entries, size_t max,
int (*cmpfn)(void *, size_t, size_t),
void (*swapfn)(void *, size_t, size_t));
Aug 20, 2002
Aug 20, 2002
218
Aug 23, 2001
Aug 23, 2001
219
/* These get used all over for lessening code clutter. */
Jul 6, 2017
Jul 6, 2017
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/* "ERRPASS" means "something else just set the error state for us" and is
just to make it clear where the responsibility for the error state lays. */
#define BAIL(e, r) do { if (e) PHYSFS_setErrorCode(e); return r; } while (0)
#define BAIL_ERRPASS(r) do { return r; } while (0)
#define BAIL_IF(c, e, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); return r; } } while (0)
#define BAIL_IF_ERRPASS(c, r) do { if (c) { return r; } } while (0)
#define BAIL_MUTEX(e, m, r) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } while (0)
#define BAIL_MUTEX_ERRPASS(m, r) do { __PHYSFS_platformReleaseMutex(m); return r; } while (0)
#define BAIL_IF_MUTEX(c, e, m, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } } while (0)
#define BAIL_IF_MUTEX_ERRPASS(c, m, r) do { if (c) { __PHYSFS_platformReleaseMutex(m); return r; } } while (0)
#define GOTO(e, g) do { if (e) PHYSFS_setErrorCode(e); goto g; } while (0)
#define GOTO_ERRPASS(g) do { goto g; } while (0)
#define GOTO_IF(c, e, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); goto g; } } while (0)
#define GOTO_IF_ERRPASS(c, g) do { if (c) { goto g; } } while (0)
#define GOTO_MUTEX(e, m, g) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } while (0)
#define GOTO_MUTEX_ERRPASS(m, g) do { __PHYSFS_platformReleaseMutex(m); goto g; } while (0)
#define GOTO_IF_MUTEX(c, e, m, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } } while (0)
#define GOTO_IF_MUTEX_ERRPASS(c, m, g) do { if (c) { __PHYSFS_platformReleaseMutex(m); goto g; } } while (0)
Jul 6, 2001
Jul 6, 2001
238
Mar 15, 2007
Mar 15, 2007
239
240
#define __PHYSFS_ARRAYLEN(x) ( (sizeof (x)) / (sizeof (x[0])) )
Aug 21, 2010
Aug 21, 2010
241
242
243
244
#ifdef PHYSFS_NO_64BIT_SUPPORT
#define __PHYSFS_SI64(x) ((PHYSFS_sint64) (x))
#define __PHYSFS_UI64(x) ((PHYSFS_uint64) (x))
#elif (defined __GNUC__)
Mar 21, 2007
Mar 21, 2007
245
246
#define __PHYSFS_SI64(x) x##LL
#define __PHYSFS_UI64(x) x##ULL
Mar 21, 2007
Mar 21, 2007
247
248
249
#elif (defined _MSC_VER)
#define __PHYSFS_SI64(x) x##i64
#define __PHYSFS_UI64(x) x##ui64
Jan 1, 2006
Jan 1, 2006
250
#else
Aug 21, 2010
Aug 21, 2010
251
252
#define __PHYSFS_SI64(x) ((PHYSFS_sint64) (x))
#define __PHYSFS_UI64(x) ((PHYSFS_uint64) (x))
Jan 1, 2006
Jan 1, 2006
253
254
#endif
Mar 12, 2008
Mar 12, 2008
255
Jan 1, 2006
Jan 1, 2006
256
257
258
259
260
261
262
263
/*
* Check if a ui64 will fit in the platform's address space.
* The initial sizeof check will optimize this macro out entirely on
* 64-bit (and larger?!) platforms, and the other condition will
* return zero or non-zero if the variable will fit in the platform's
* size_t, suitable to pass to malloc. This is kinda messy, but effective.
*/
#define __PHYSFS_ui64FitsAddressSpace(s) ( \
Aug 24, 2010
Aug 24, 2010
264
265
(sizeof (PHYSFS_uint64) <= sizeof (size_t)) || \
((s) < (__PHYSFS_UI64(0xFFFFFFFFFFFFFFFF) >> (64-(sizeof(size_t)*8)))) \
Jan 1, 2006
Jan 1, 2006
266
)
Jul 6, 2001
Jul 6, 2001
267
Mar 12, 2008
Mar 12, 2008
268
Mar 15, 2007
Mar 15, 2007
269
270
271
272
273
274
275
276
277
278
279
280
/*
* This is a strcasecmp() or stricmp() replacement that expects both strings
* to be in UTF-8 encoding. It will do "case folding" to decide if the
* Unicode codepoints in the strings match.
*
* It will report which string is "greater than" the other, but be aware that
* this doesn't necessarily mean anything: 'a' may be "less than" 'b', but
* a random Kanji codepoint has no meaningful alphabetically relationship to
* a Greek Lambda, but being able to assign a reliable "value" makes sorting
* algorithms possible, if not entirely sane. Most cases should treat the
* return value as "equal" or "not equal".
*/
Mar 22, 2012
Mar 22, 2012
281
int __PHYSFS_utf8stricmp(const char *s1, const char *s2);
Mar 15, 2007
Mar 15, 2007
282
283
/*
Mar 22, 2012
Mar 22, 2012
284
* This works like __PHYSFS_utf8stricmp(), but takes a character (NOT BYTE
Mar 15, 2007
Mar 15, 2007
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
* COUNT) argument, like strcasencmp().
*/
int __PHYSFS_utf8strnicmp(const char *s1, const char *s2, PHYSFS_uint32 l);
/*
* stricmp() that guarantees to only work with low ASCII. The C runtime
* stricmp() might try to apply a locale/codepage/etc, which we don't want.
*/
int __PHYSFS_stricmpASCII(const char *s1, const char *s2);
/*
* strnicmp() that guarantees to only work with low ASCII. The C runtime
* strnicmp() might try to apply a locale/codepage/etc, which we don't want.
*/
int __PHYSFS_strnicmpASCII(const char *s1, const char *s2, PHYSFS_uint32 l);
Feb 25, 2016
Feb 25, 2016
301
302
303
304
305
/*
* Like strdup(), but uses the current PhysicsFS allocator.
*/
char *__PHYSFS_strdup(const char *str);
Feb 25, 2016
Feb 25, 2016
306
307
308
309
310
/*
* Give a hash value for a C string (uses djb's xor hashing algorithm).
*/
PHYSFS_uint32 __PHYSFS_hashString(const char *str, size_t len);
Mar 15, 2007
Mar 15, 2007
311
Sep 23, 2004
Sep 23, 2004
312
/*
Mar 14, 2005
Mar 14, 2005
313
* The current allocator. Not valid before PHYSFS_init is called!
Sep 23, 2004
Sep 23, 2004
314
*/
Mar 14, 2005
Mar 14, 2005
315
extern PHYSFS_Allocator __PHYSFS_AllocatorHooks;
Jul 6, 2001
Jul 6, 2001
316
Mar 14, 2005
Mar 14, 2005
317
318
/* convenience macro to make this less cumbersome internally... */
#define allocator __PHYSFS_AllocatorHooks
Jul 6, 2001
Jul 6, 2001
319
Aug 30, 2010
Aug 30, 2010
320
321
322
323
324
325
326
/*
* Create a PHYSFS_Io for a file in the physical filesystem.
* This path is in platform-dependent notation. (mode) must be 'r', 'w', or
* 'a' for Read, Write, or Append.
*/
PHYSFS_Io *__PHYSFS_createNativeIo(const char *path, const int mode);
Aug 30, 2010
Aug 30, 2010
327
328
329
330
331
332
333
334
/*
* Create a PHYSFS_Io for a buffer of memory (READ-ONLY). If you already
* have one of these, just use its duplicate() method, and it'll increment
* its refcount without allocating a copy of the buffer.
*/
PHYSFS_Io *__PHYSFS_createMemoryIo(const void *buf, PHYSFS_uint64 len,
void (*destruct)(void *));
Aug 30, 2010
Aug 30, 2010
335
Mar 9, 2012
Mar 9, 2012
336
337
338
339
340
/*
* Read (len) bytes from (io) into (buf). Returns non-zero on success,
* zero on i/o error. Literally: "return (io->read(io, buf, len) == len);"
*/
int __PHYSFS_readAll(PHYSFS_Io *io, void *buf, const PHYSFS_uint64 len);
Sep 6, 2010
Sep 6, 2010
341
342
343
344
/* These are shared between some archivers. */
Jul 21, 2017
Jul 21, 2017
345
void UNPK_abandonArchive(void *opaque);
Nov 28, 2012
Nov 28, 2012
346
void UNPK_closeArchive(void *opaque);
Jul 21, 2017
Jul 21, 2017
347
void *UNPK_openArchive(PHYSFS_Io *io);
Jul 16, 2017
Jul 16, 2017
348
void *UNPK_addEntry(void *opaque, char *name, const int isdir,
Jul 22, 2017
Jul 22, 2017
349
const PHYSFS_sint64 ctime, const PHYSFS_sint64 mtime,
Jul 16, 2017
Jul 16, 2017
350
const PHYSFS_uint64 pos, const PHYSFS_uint64 len);
Nov 30, 2012
Nov 30, 2012
351
PHYSFS_Io *UNPK_openRead(void *opaque, const char *name);
Nov 28, 2012
Nov 28, 2012
352
353
354
355
PHYSFS_Io *UNPK_openWrite(void *opaque, const char *name);
PHYSFS_Io *UNPK_openAppend(void *opaque, const char *name);
int UNPK_remove(void *opaque, const char *name);
int UNPK_mkdir(void *opaque, const char *name);
Nov 30, 2012
Nov 30, 2012
356
int UNPK_stat(void *opaque, const char *fn, PHYSFS_Stat *st);
Jul 16, 2017
Jul 16, 2017
357
#define UNPK_enumerateFiles __PHYSFS_DirTreeEnumerateFiles
Sep 6, 2010
Sep 6, 2010
358
359
Jul 15, 2017
Jul 15, 2017
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
/* Optional API many archivers use this to manage their directory tree. */
/* !!! FIXME: document this better. */
typedef struct __PHYSFS_DirTreeEntry
{
char *name; /* Full path in archive. */
struct __PHYSFS_DirTreeEntry *hashnext; /* next item in hash bucket. */
struct __PHYSFS_DirTreeEntry *children; /* linked list of kids, if dir. */
struct __PHYSFS_DirTreeEntry *sibling; /* next item in same dir. */
int isdir;
} __PHYSFS_DirTreeEntry;
typedef struct __PHYSFS_DirTree
{
__PHYSFS_DirTreeEntry *root; /* root of directory tree. */
__PHYSFS_DirTreeEntry **hash; /* all entries hashed for fast lookup. */
size_t hashBuckets; /* number of buckets in hash. */
size_t entrylen; /* size in bytes of entries (including subclass). */
} __PHYSFS_DirTree;
Jul 21, 2017
Jul 21, 2017
382
int __PHYSFS_DirTreeInit(__PHYSFS_DirTree *dt, const size_t entrylen);
Jul 15, 2017
Jul 15, 2017
383
384
385
386
387
388
389
390
391
void *__PHYSFS_DirTreeAdd(__PHYSFS_DirTree *dt, char *name, const int isdir);
void *__PHYSFS_DirTreeFind(__PHYSFS_DirTree *dt, const char *path);
void __PHYSFS_DirTreeEnumerateFiles(void *opaque, const char *dname,
PHYSFS_EnumFilesCallback cb,
const char *origdir, void *callbackdata);
void __PHYSFS_DirTreeDeinit(__PHYSFS_DirTree *dt);
Jul 6, 2001
Jul 6, 2001
392
393
394
395
396
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*------------ ----------------*/
/*------------ You MUST implement the following functions ----------------*/
/*------------ if porting to a new platform. ----------------*/
Jul 15, 2001
Jul 15, 2001
397
/*------------ (see platform/unix.c for an example) ----------------*/
Jul 6, 2001
Jul 6, 2001
398
399
400
401
402
403
/*------------ ----------------*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*
Mar 15, 2012
Mar 15, 2012
404
405
406
* The dir separator; '/' on unix, '\\' on win32, ":" on MacOS, etc...
* Obviously, this isn't a function. If you need more than one char for this,
* you'll need to pull some old pieces of PhysicsFS out of revision control.
Jul 6, 2001
Jul 6, 2001
407
*/
Jul 6, 2017
Jul 6, 2017
408
#if PHYSFS_PLATFORM_WINDOWS || PHYSFS_PLATFORM_OS2
Mar 15, 2012
Mar 15, 2012
409
410
411
412
#define __PHYSFS_platformDirSeparator '\\'
#else
#define __PHYSFS_platformDirSeparator '/'
#endif
Mar 24, 2002
Mar 24, 2002
413
414
415
/*
* Initialize the platform. This is called when PHYSFS_init() is called from
Mar 18, 2012
Mar 18, 2012
416
* the application.
Mar 24, 2002
Mar 24, 2002
417
418
419
420
421
422
*
* Return zero if there was a catastrophic failure (which prevents you from
* functioning at all), and non-zero otherwise.
*/
int __PHYSFS_platformInit(void);
May 25, 2002
May 25, 2002
423
Mar 24, 2002
Mar 24, 2002
424
425
426
427
428
429
430
431
432
433
/*
* Deinitialize the platform. This is called when PHYSFS_deinit() is called
* from the application. You can use this to clean up anything you've
* allocated in your platform driver.
*
* Return zero if there was a catastrophic failure (which prevents you from
* functioning at all), and non-zero otherwise.
*/
int __PHYSFS_platformDeinit(void);
May 25, 2002
May 25, 2002
434
Mar 24, 2002
Mar 24, 2002
435
436
437
438
439
440
441
442
443
444
445
/*
* Open a file for reading. (filename) is in platform-dependent notation. The
* file pointer should be positioned on the first byte of the file.
*
* The return value will be some platform-specific datatype that is opaque to
* the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32.
*
* The same file can be opened for read multiple times, and each should have
* a unique file handle; this is frequently employed to prevent race
* conditions in the archivers.
*
Nov 30, 2012
Nov 30, 2012
446
* Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.
Mar 24, 2002
Mar 24, 2002
447
448
449
*/
void *__PHYSFS_platformOpenRead(const char *filename);
May 25, 2002
May 25, 2002
450
Mar 24, 2002
Mar 24, 2002
451
452
453
454
455
456
457
458
459
460
461
462
/*
* Open a file for writing. (filename) is in platform-dependent notation. If
* the file exists, it should be truncated to zero bytes, and if it doesn't
* exist, it should be created as a zero-byte file. The file pointer should
* be positioned on the first byte of the file.
*
* The return value will be some platform-specific datatype that is opaque to
* the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32,
* etc.
*
* Opening a file for write multiple times has undefined results.
*
Nov 30, 2012
Nov 30, 2012
463
* Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.
Mar 24, 2002
Mar 24, 2002
464
465
466
*/
void *__PHYSFS_platformOpenWrite(const char *filename);
May 25, 2002
May 25, 2002
467
Mar 24, 2002
Mar 24, 2002
468
469
470
471
472
473
474
475
476
477
478
479
480
/*
* Open a file for appending. (filename) is in platform-dependent notation. If
* the file exists, the file pointer should be place just past the end of the
* file, so that the first write will be one byte after the current end of
* the file. If the file doesn't exist, it should be created as a zero-byte
* file. The file pointer should be positioned on the first byte of the file.
*
* The return value will be some platform-specific datatype that is opaque to
* the caller; it could be a (FILE *) under Unix, or a (HANDLE *) under win32,
* etc.
*
* Opening a file for append multiple times has undefined results.
*
Nov 30, 2012
Nov 30, 2012
481
* Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened.
Mar 24, 2002
Mar 24, 2002
482
483
484
485
486
*/
void *__PHYSFS_platformOpenAppend(const char *filename);
/*
* Read more data from a platform-specific file handle. (opaque) should be
Aug 21, 2010
Aug 21, 2010
487
488
489
490
491
492
* cast to whatever data type your platform uses. Read a maximum of (len)
* 8-bit bytes to the area pointed to by (buf). If there isn't enough data
* available, return the number of bytes read, and position the file pointer
* immediately after those bytes.
* On success, return (len) and position the file pointer immediately past
* the end of the last read byte. Return (-1) if there is a catastrophic
Nov 30, 2012
Nov 30, 2012
493
* error, and call PHYSFS_setErrorCode() to describe the problem; the file
Aug 21, 2010
Aug 21, 2010
494
495
496
* pointer should not move in such a case. A partial read is success; only
* return (-1) on total failure; presumably, the next read call after a
* partial read will fail as such.
Mar 24, 2002
Mar 24, 2002
497
*/
Aug 21, 2010
Aug 21, 2010
498
PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len);
Mar 24, 2002
Mar 24, 2002
499
500
501
/*
* Write more data to a platform-specific file handle. (opaque) should be
Aug 21, 2010
Aug 21, 2010
502
503
504
505
* cast to whatever data type your platform uses. Write a maximum of (len)
* 8-bit bytes from the area pointed to by (buffer). If there is a problem,
* return the number of bytes written, and position the file pointer
* immediately after those bytes. Return (-1) if there is a catastrophic
Nov 30, 2012
Nov 30, 2012
506
* error, and call PHYSFS_setErrorCode() to describe the problem; the file
Aug 21, 2010
Aug 21, 2010
507
508
509
* pointer should not move in such a case. A partial write is success; only
* return (-1) on total failure; presumably, the next write call after a
* partial write will fail as such.
Mar 24, 2002
Mar 24, 2002
510
*/
Mar 25, 2002
Mar 25, 2002
511
PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
Aug 21, 2010
Aug 21, 2010
512
PHYSFS_uint64 len);
Mar 24, 2002
Mar 24, 2002
513
514
515
516
517
518
519
520
521
/*
* Set the file pointer to a new position. (opaque) should be cast to
* whatever data type your platform uses. (pos) specifies the number
* of 8-bit bytes to seek to from the start of the file. Seeking past the
* end of the file is an error condition, and you should check for it.
*
* Not all file types can seek; this is to be expected by the caller.
*
Nov 30, 2012
Nov 30, 2012
522
* On error, call PHYSFS_setErrorCode() and return zero. On success, return
Mar 24, 2002
Mar 24, 2002
523
524
525
526
* a non-zero value.
*/
int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos);
May 25, 2002
May 25, 2002
527
Mar 24, 2002
Mar 24, 2002
528
529
530
531
532
533
534
/*
* Get the file pointer's position, in an 8-bit byte offset from the start of
* the file. (opaque) should be cast to whatever data type your platform
* uses.
*
* Not all file types can "tell"; this is to be expected by the caller.
*
Nov 30, 2012
Nov 30, 2012
535
* On error, call PHYSFS_setErrorCode() and return -1. On success, return >= 0.
Mar 24, 2002
Mar 24, 2002
536
537
538
*/
PHYSFS_sint64 __PHYSFS_platformTell(void *opaque);
May 25, 2002
May 25, 2002
539
Mar 24, 2002
Mar 24, 2002
540
541
542
543
544
545
/*
* Determine the current size of a file, in 8-bit bytes, from an open file.
*
* The caller expects that this information may not be available for all
* file types on all platforms.
*
Nov 30, 2012
Nov 30, 2012
546
* Return -1 if you can't do it, and call PHYSFS_setErrorCode(). Otherwise,
Mar 24, 2002
Mar 24, 2002
547
548
549
550
* return the file length in 8-bit bytes.
*/
PHYSFS_sint64 __PHYSFS_platformFileLength(void *handle);
Feb 15, 2010
Feb 15, 2010
551
552
553
554
/*
* !!! FIXME: comment me.
*/
Nov 30, 2012
Nov 30, 2012
555
int __PHYSFS_platformStat(const char *fn, PHYSFS_Stat *stat);
Feb 15, 2010
Feb 15, 2010
556
Mar 24, 2002
Mar 24, 2002
557
558
559
560
561
562
563
564
565
566
/*
* Flush any pending writes to disk. (opaque) should be cast to whatever data
* type your platform uses. Be sure to check for errors; the caller expects
* that this function can fail if there was a flushing error, etc.
*
* Return zero on failure, non-zero on success.
*/
int __PHYSFS_platformFlush(void *opaque);
/*
Aug 30, 2010
Aug 30, 2010
567
568
569
* Close file and deallocate resources. (opaque) should be cast to whatever
* data type your platform uses. This should close the file in any scenario:
* flushing is a separate function call, and this function should never fail.
Mar 24, 2002
Mar 24, 2002
570
*
Aug 30, 2010
Aug 30, 2010
571
572
* You should clean up all resources associated with (opaque); the pointer
* will be considered invalid after this call.
Mar 24, 2002
Mar 24, 2002
573
*/
Aug 30, 2010
Aug 30, 2010
574
void __PHYSFS_platformClose(void *opaque);
Mar 24, 2002
Mar 24, 2002
575
Jul 6, 2001
Jul 6, 2001
576
/*
Sep 29, 2004
Sep 29, 2004
577
578
579
580
581
* Platform implementation of PHYSFS_getCdRomDirsCallback()...
* CD directories are discovered and reported to the callback one at a time.
* Pointers passed to the callback are assumed to be invalid to the
* application after the callback returns, so you can free them or whatever.
* Callback does not assume results will be sorted in any meaningful way.
Jul 6, 2001
Jul 6, 2001
582
*/
Sep 29, 2004
Sep 29, 2004
583
void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data);
Jul 6, 2001
Jul 6, 2001
584
585
586
587
588
/*
* Calculate the base dir, if your platform needs special consideration.
* Just return NULL if the standard routines will suffice. (see
* calculateBaseDir() in physfs.c ...)
Mar 23, 2012
Mar 23, 2012
589
* Your string must end with a dir separator if you don't return NULL.
Mar 11, 2012
Mar 11, 2012
590
* Caller will allocator.Free() the retval if it's not NULL.
Jul 6, 2001
Jul 6, 2001
591
*/
Jul 8, 2001
Jul 8, 2001
592
char *__PHYSFS_platformCalcBaseDir(const char *argv0);
Jul 6, 2001
Jul 6, 2001
593
Mar 22, 2012
Mar 22, 2012
594
/*
Jul 6, 2001
Jul 6, 2001
595
* Get the platform-specific user dir.
Mar 24, 2012
Mar 24, 2012
596
597
598
* As of PhysicsFS 2.1, returning NULL means fatal error.
* Your string must end with a dir separator if you don't return NULL.
* Caller will allocator.Free() the retval if it's not NULL.
Jul 6, 2001
Jul 6, 2001
599
*/
Mar 22, 2012
Mar 22, 2012
600
char *__PHYSFS_platformCalcUserDir(void);
Jul 6, 2001
Jul 6, 2001
601
Mar 22, 2012
Mar 22, 2012
602
603
604
605
/* This is the cached version from PHYSFS_init(). This is a fast call. */
const char *__PHYSFS_getUserDir(void); /* not deprecated internal version. */
Mar 24, 2012
Mar 24, 2012
606
Mar 22, 2012
Mar 22, 2012
607
/*
Mar 24, 2012
Mar 24, 2012
608
609
610
611
612
613
* Get the platform-specific pref dir.
* Returning NULL means fatal error.
* Your string must end with a dir separator if you don't return NULL.
* Caller will allocator.Free() the retval if it's not NULL.
* Caller will make missing directories if necessary; this just reports
* the final path.
Mar 22, 2012
Mar 22, 2012
614
615
616
617
*/
char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app);
Jul 6, 2001
Jul 6, 2001
618
/*
Sep 6, 2009
Sep 6, 2009
619
620
* Return a pointer that uniquely identifies the current thread.
* On a platform without threading, (0x1) will suffice. These numbers are
Jul 6, 2001
Jul 6, 2001
621
* arbitrary; the only requirement is that no two threads have the same
Sep 6, 2009
Sep 6, 2009
622
* pointer.
Jul 6, 2001
Jul 6, 2001
623
*/
Sep 6, 2009
Sep 6, 2009
624
void *__PHYSFS_platformGetThreadID(void);
Jul 6, 2001
Jul 6, 2001
625
May 25, 2002
May 25, 2002
626
Jul 8, 2001
Jul 8, 2001
627
628
/*
* Enumerate a directory of files. This follows the rules for the
Feb 25, 2016
Feb 25, 2016
629
* PHYSFS_Archiver::enumerateFiles() method, except that the
Jul 8, 2001
Jul 8, 2001
630
* (dirName) that is passed to this function is converted to
Sep 26, 2004
Sep 26, 2004
631
* platform-DEPENDENT notation by the caller. The PHYSFS_Archiver version
Jul 16, 2001
Jul 16, 2001
632
* uses platform-independent notation. Note that ".", "..", and other
Nov 29, 2012
Nov 29, 2012
633
* meta-entries should always be ignored.
Jul 8, 2001
Jul 8, 2001
634
*/
Sep 29, 2004
Sep 29, 2004
635
void __PHYSFS_platformEnumerateFiles(const char *dirname,
Sep 18, 2005
Sep 18, 2005
636
637
PHYSFS_EnumFilesCallback callback,
const char *origdir,
Sep 29, 2004
Sep 29, 2004
638
void *callbackdata);
Jul 8, 2001
Jul 8, 2001
639
Aug 23, 2001
Aug 23, 2001
640
641
642
643
644
645
646
/*
* Make a directory in the actual filesystem. (path) is specified in
* platform-dependent notation. On error, return zero and set the error
* message. Return non-zero on success.
*/
int __PHYSFS_platformMkDir(const char *path);
May 25, 2002
May 25, 2002
647
Mar 25, 2002
Mar 25, 2002
648
649
650
651
652
653
654
655
656
657
658
659
660
661
/*
* Remove a file or directory entry in the actual filesystem. (path) is
* specified in platform-dependent notation. Note that this deletes files
* _and_ directories, so you might need to do some determination.
* Non-empty directories should report an error and not delete themselves
* or their contents.
*
* Deleting a symlink should remove the link, not what it points to.
*
* On error, return zero and set the error message. Return non-zero on success.
*/
int __PHYSFS_platformDelete(const char *path);
Mar 30, 2002
Mar 30, 2002
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
/*
* Create a platform-specific mutex. This can be whatever datatype your
* platform uses for mutexes, but it is cast to a (void *) for abstractness.
*
* Return (NULL) if you couldn't create one. Systems without threads can
* return any arbitrary non-NULL value.
*/
void *__PHYSFS_platformCreateMutex(void);
/*
* Destroy a platform-specific mutex, and clean up any resources associated
* with it. (mutex) is a value previously returned by
* __PHYSFS_platformCreateMutex(). This can be a no-op on single-threaded
* platforms.
*/
void __PHYSFS_platformDestroyMutex(void *mutex);
/*
* Grab possession of a platform-specific mutex. Mutexes should be recursive;
* that is, the same thread should be able to call this function multiple
* times in a row without causing a deadlock. This function should block
* until a thread can gain possession of the mutex.
*
* Return non-zero if the mutex was grabbed, zero if there was an
* unrecoverable problem grabbing it (this should not be a matter of
* timing out! We're talking major system errors; block until the mutex
* is available otherwise.)
Apr 2, 2002
Apr 2, 2002
689
*
Nov 30, 2012
Nov 30, 2012
690
* _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this
Apr 2, 2002
Apr 2, 2002
691
692
* function, you'll cause an infinite recursion. This means you can't
* use the BAIL_*MACRO* macros, either.
Mar 30, 2002
Mar 30, 2002
693
694
695
696
697
698
699
700
*/
int __PHYSFS_platformGrabMutex(void *mutex);
/*
* Relinquish possession of the mutex when this method has been called
* once for each time that platformGrabMutex was called. Once possession has
* been released, the next thread in line to grab the mutex (if any) may
* proceed.
Apr 2, 2002
Apr 2, 2002
701
*
Nov 30, 2012
Nov 30, 2012
702
* _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this
Apr 2, 2002
Apr 2, 2002
703
704
* function, you'll cause an infinite recursion. This means you can't
* use the BAIL_*MACRO* macros, either.
Mar 30, 2002
Mar 30, 2002
705
706
707
*/
void __PHYSFS_platformReleaseMutex(void *mutex);
Jul 12, 2017
Jul 12, 2017
708
709
710
711
#if PHYSFS_HAVE_PRAGMA_VISIBILITY
#pragma GCC visibility pop
#endif
Jul 6, 2001
Jul 6, 2001
712
#ifdef __cplusplus
Mar 24, 2002
Mar 24, 2002
713
}
Jul 6, 2001
Jul 6, 2001
714
715
716
717
718
#endif
#endif
/* end of physfs_internal.h ... */