From 3ba2b7d192704aa6070d1efaed00163ec4bba9ed Mon Sep 17 00:00:00 2001 From: criptych Date: Fri, 2 Jul 2021 00:29:28 -0400 Subject: [PATCH] Add support for mount priority --- src/physfs.c | 40 +++++++++++++++++++++------------------- src/physfs.h | 25 +++++++++++++------------ 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/physfs.c b/src/physfs.c index 7fd4456..ef2507e 100644 --- a/src/physfs.c +++ b/src/physfs.c @@ -48,6 +48,7 @@ typedef struct __PHYSFS_DIRHANDLE__ size_t rootlen; /* subdirectory of archiver to use as root of archive (NULL for actual root) */ const PHYSFS_Archiver *funcs; /* Ptr to archiver info for this handle. */ struct __PHYSFS_DIRHANDLE__ *next; /* linked list stuff. */ + int priority; } DirHandle; @@ -1749,7 +1750,7 @@ int PHYSFS_setRoot(const char *archive, const char *subdir) static int doMount(PHYSFS_Io *io, const char *fname, - const char *mountPoint, int appendToPath) + const char *mountPoint, int priority) { DirHandle *dh; DirHandle *prev = NULL; @@ -1767,23 +1768,24 @@ static int doMount(PHYSFS_Io *io, const char *fname, /* already in search path? */ if ((i->dirName != NULL) && (strcmp(fname, i->dirName) == 0)) BAIL_MUTEX_ERRPASS(stateLock, 1); - prev = i; + if ((priority < 0) || ((priority > 0) && (i->priority <= priority))) + prev = i; } /* for */ dh = createDirHandle(io, fname, mountPoint, 0); BAIL_IF_MUTEX_ERRPASS(!dh, stateLock, 0); - if (appendToPath) - { - if (prev == NULL) - searchPath = dh; - else - prev->next = dh; - } /* if */ - else + dh->priority = priority; + + if (prev == NULL) { dh->next = searchPath; searchPath = dh; + } /* if */ + else + { + dh->next = prev->next; + prev->next = dh; } /* else */ __PHYSFS_platformReleaseMutex(stateLock); @@ -1792,18 +1794,18 @@ static int doMount(PHYSFS_Io *io, const char *fname, int PHYSFS_mountIo(PHYSFS_Io *io, const char *fname, - const char *mountPoint, int appendToPath) + const char *mountPoint, int priority) { BAIL_IF(!io, PHYSFS_ERR_INVALID_ARGUMENT, 0); BAIL_IF(!fname, PHYSFS_ERR_INVALID_ARGUMENT, 0); BAIL_IF(io->version != 0, PHYSFS_ERR_UNSUPPORTED, 0); - return doMount(io, fname, mountPoint, appendToPath); + return doMount(io, fname, mountPoint, priority); } /* PHYSFS_mountIo */ int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), const char *fname, const char *mountPoint, - int appendToPath) + int priority) { int retval = 0; PHYSFS_Io *io = NULL; @@ -1813,7 +1815,7 @@ int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), io = __PHYSFS_createMemoryIo(buf, len, del); BAIL_IF_ERRPASS(!io, 0); - retval = doMount(io, fname, mountPoint, appendToPath); + retval = doMount(io, fname, mountPoint, priority); if (!retval) { /* docs say not to call (del) in case of failure, so cheat. */ @@ -1827,7 +1829,7 @@ int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), int PHYSFS_mountHandle(PHYSFS_File *file, const char *fname, - const char *mountPoint, int appendToPath) + const char *mountPoint, int priority) { int retval = 0; PHYSFS_Io *io = NULL; @@ -1837,7 +1839,7 @@ int PHYSFS_mountHandle(PHYSFS_File *file, const char *fname, io = __PHYSFS_createHandleIo(file); BAIL_IF_ERRPASS(!io, 0); - retval = doMount(io, fname, mountPoint, appendToPath); + retval = doMount(io, fname, mountPoint, priority); if (!retval) { /* docs say not to destruct in case of failure, so cheat. */ @@ -1849,16 +1851,16 @@ int PHYSFS_mountHandle(PHYSFS_File *file, const char *fname, } /* PHYSFS_mountHandle */ -int PHYSFS_mount(const char *newDir, const char *mountPoint, int appendToPath) +int PHYSFS_mount(const char *newDir, const char *mountPoint, int priority) { BAIL_IF(!newDir, PHYSFS_ERR_INVALID_ARGUMENT, 0); - return doMount(NULL, newDir, mountPoint, appendToPath); + return doMount(NULL, newDir, mountPoint, priority); } /* PHYSFS_mount */ int PHYSFS_addToSearchPath(const char *newDir, int appendToPath) { - return PHYSFS_mount(newDir, NULL, appendToPath); + return PHYSFS_mount(newDir, NULL, appendToPath ? -1 : 0); } /* PHYSFS_addToSearchPath */ diff --git a/src/physfs.h b/src/physfs.h index d182ff7..ac71aa8 100644 --- a/src/physfs.h +++ b/src/physfs.h @@ -2184,7 +2184,7 @@ PHYSFS_DECL int PHYSFS_setAllocator(const PHYSFS_Allocator *allocator); /** - * \fn int PHYSFS_mount(const char *newDir, const char *mountPoint, int appendToPath) + * \fn int PHYSFS_mount(const char *newDir, const char *mountPoint, int priority) * \brief Add an archive or directory to the search path. * * If this is a duplicate, the entry is not added again, even though the @@ -2218,7 +2218,8 @@ PHYSFS_DECL int PHYSFS_setAllocator(const PHYSFS_Allocator *allocator); * \param mountPoint Location in the interpolated tree that this archive * will be "mounted", in platform-independent notation. * NULL or "" is equivalent to "/". - * \param appendToPath nonzero to append to search path, zero to prepend. + * \param priority Archive priority. Positive inserts archive AFTER others + * with the same priority; negative appends, zero prepends. * \return nonzero if added to path, zero on failure (bogus archive, dir * missing, etc). Use PHYSFS_getLastErrorCode() to obtain * the specific error. @@ -2230,7 +2231,7 @@ PHYSFS_DECL int PHYSFS_setAllocator(const PHYSFS_Allocator *allocator); */ PHYSFS_DECL int PHYSFS_mount(const char *newDir, const char *mountPoint, - int appendToPath); + int priority); /** * \fn int PHYSFS_getMountPoint(const char *dir) @@ -3226,7 +3227,7 @@ typedef struct PHYSFS_Io /** - * \fn int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, const char *mountPoint, int appendToPath) + * \fn int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, const char *mountPoint, int priority) * \brief Add an archive, built on a PHYSFS_Io, to the search path. * * \warning Unless you have some special, low-level need, you should be using @@ -3256,7 +3257,7 @@ typedef struct PHYSFS_Io * \param mountPoint Location in the interpolated tree that this archive * will be "mounted", in platform-independent notation. * NULL or "" is equivalent to "/". - * \param appendToPath nonzero to append to search path, zero to prepend. + * \param priority Archive priority; see PHYSFS_mount. * \return nonzero if added to path, zero on failure (bogus archive, stream * i/o issue, etc). Use PHYSFS_getLastErrorCode() to obtain * the specific error. @@ -3266,11 +3267,11 @@ typedef struct PHYSFS_Io * \sa PHYSFS_getMountPoint */ PHYSFS_DECL int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, - const char *mountPoint, int appendToPath); + const char *mountPoint, int priority); /** - * \fn int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), const char *newDir, const char *mountPoint, int appendToPath) + * \fn int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), const char *newDir, const char *mountPoint, int priority) * \brief Add an archive, contained in a memory buffer, to the search path. * * \warning Unless you have some special, low-level need, you should be using @@ -3304,7 +3305,7 @@ PHYSFS_DECL int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, * \param mountPoint Location in the interpolated tree that this archive * will be "mounted", in platform-independent notation. * NULL or "" is equivalent to "/". - * \param appendToPath nonzero to append to search path, zero to prepend. + * \param priority Archive priority; see PHYSFS_mount. * \return nonzero if added to path, zero on failure (bogus archive, etc). * Use PHYSFS_getLastErrorCode() to obtain the specific error. * @@ -3314,11 +3315,11 @@ PHYSFS_DECL int PHYSFS_mountIo(PHYSFS_Io *io, const char *newDir, */ PHYSFS_DECL int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, void (*del)(void *), const char *newDir, - const char *mountPoint, int appendToPath); + const char *mountPoint, int priority); /** - * \fn int PHYSFS_mountHandle(PHYSFS_File *file, const char *newDir, const char *mountPoint, int appendToPath) + * \fn int PHYSFS_mountHandle(PHYSFS_File *file, const char *newDir, const char *mountPoint, int priority) * \brief Add an archive, contained in a PHYSFS_File handle, to the search path. * * \warning Unless you have some special, low-level need, you should be using @@ -3362,7 +3363,7 @@ PHYSFS_DECL int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, * \param mountPoint Location in the interpolated tree that this archive * will be "mounted", in platform-independent notation. * NULL or "" is equivalent to "/". - * \param appendToPath nonzero to append to search path, zero to prepend. + * \param priority Archive priority; see PHYSFS_mount. * \return nonzero if added to path, zero on failure (bogus archive, etc). * Use PHYSFS_getLastErrorCode() to obtain the specific error. * @@ -3371,7 +3372,7 @@ PHYSFS_DECL int PHYSFS_mountMemory(const void *buf, PHYSFS_uint64 len, * \sa PHYSFS_getMountPoint */ PHYSFS_DECL int PHYSFS_mountHandle(PHYSFS_File *file, const char *newDir, - const char *mountPoint, int appendToPath); + const char *mountPoint, int priority); /**