From 6222a4a92dff9a1f4c9b4eac70104c15838d8a3a Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 25 Mar 2012 17:18:24 -0400 Subject: [PATCH] Add binary compatibility to PHYSFS_Io. --- src/archiver_iso9660.c | 4 ++-- src/archiver_lzma.c | 4 ++-- src/archiver_unpacked.c | 4 ++-- src/archiver_zip.c | 4 ++-- src/physfs.c | 13 +++++++------ src/physfs.h | 30 ++++++++++++++++++++---------- src/physfs_internal.h | 2 ++ 7 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/archiver_iso9660.c b/src/archiver_iso9660.c index 32747f60..1d0bfe84 100644 --- a/src/archiver_iso9660.c +++ b/src/archiver_iso9660.c @@ -526,6 +526,7 @@ static PHYSFS_sint64 ISO9660_length(PHYSFS_Io *io) static const PHYSFS_Io ISO9660_Io = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, ISO9660_read, ISO9660_write, ISO9660_seek, @@ -533,8 +534,7 @@ static const PHYSFS_Io ISO9660_Io = ISO9660_length, ISO9660_duplicate, ISO9660_flush, - ISO9660_destroy, - NULL + ISO9660_destroy }; diff --git a/src/archiver_lzma.c b/src/archiver_lzma.c index ba97f29d..837fd24f 100644 --- a/src/archiver_lzma.c +++ b/src/archiver_lzma.c @@ -427,6 +427,7 @@ static void LZMA_destroy(PHYSFS_Io *io) static const PHYSFS_Io LZMA_Io = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, LZMA_read, LZMA_write, LZMA_seek, @@ -434,8 +435,7 @@ static const PHYSFS_Io LZMA_Io = LZMA_length, LZMA_duplicate, LZMA_flush, - LZMA_destroy, - NULL + LZMA_destroy }; diff --git a/src/archiver_unpacked.c b/src/archiver_unpacked.c index f680d2c9..fdd58f7b 100644 --- a/src/archiver_unpacked.c +++ b/src/archiver_unpacked.c @@ -133,6 +133,7 @@ static void UNPK_destroy(PHYSFS_Io *io) static const PHYSFS_Io UNPK_Io = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, UNPK_read, UNPK_write, UNPK_seek, @@ -140,8 +141,7 @@ static const PHYSFS_Io UNPK_Io = UNPK_length, UNPK_duplicate, UNPK_flush, - UNPK_destroy, - NULL + UNPK_destroy }; diff --git a/src/archiver_zip.c b/src/archiver_zip.c index 7babfcb6..6c3904c7 100644 --- a/src/archiver_zip.c +++ b/src/archiver_zip.c @@ -394,6 +394,7 @@ static void ZIP_destroy(PHYSFS_Io *io) static const PHYSFS_Io ZIP_Io = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, ZIP_read, ZIP_write, ZIP_seek, @@ -401,8 +402,7 @@ static const PHYSFS_Io ZIP_Io = ZIP_length, ZIP_duplicate, ZIP_flush, - ZIP_destroy, - NULL + ZIP_destroy }; diff --git a/src/physfs.c b/src/physfs.c index a0c1d97e..c3c1be4f 100644 --- a/src/physfs.c +++ b/src/physfs.c @@ -174,6 +174,7 @@ static void nativeIo_destroy(PHYSFS_Io *io) static const PHYSFS_Io __PHYSFS_nativeIoInterface = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, nativeIo_read, nativeIo_write, nativeIo_seek, @@ -181,8 +182,7 @@ static const PHYSFS_Io __PHYSFS_nativeIoInterface = nativeIo_length, nativeIo_duplicate, nativeIo_flush, - nativeIo_destroy, - NULL + nativeIo_destroy }; PHYSFS_Io *__PHYSFS_createNativeIo(const char *path, const int mode) @@ -369,6 +369,7 @@ static void memoryIo_destroy(PHYSFS_Io *io) static const PHYSFS_Io __PHYSFS_memoryIoInterface = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, memoryIo_read, memoryIo_write, memoryIo_seek, @@ -376,8 +377,7 @@ static const PHYSFS_Io __PHYSFS_memoryIoInterface = memoryIo_length, memoryIo_duplicate, memoryIo_flush, - memoryIo_destroy, - NULL + memoryIo_destroy }; PHYSFS_Io *__PHYSFS_createMemoryIo(const void *buf, PHYSFS_uint64 len, @@ -512,6 +512,7 @@ static void handleIo_destroy(PHYSFS_Io *io) static const PHYSFS_Io __PHYSFS_handleIoInterface = { + CURRENT_PHYSFS_IO_API_VERSION, NULL, handleIo_read, handleIo_write, handleIo_seek, @@ -519,8 +520,7 @@ static const PHYSFS_Io __PHYSFS_handleIoInterface = handleIo_length, handleIo_duplicate, handleIo_flush, - handleIo_destroy, - NULL + handleIo_destroy }; static PHYSFS_Io *__PHYSFS_createHandleIo(PHYSFS_File *f) @@ -1494,6 +1494,7 @@ int PHYSFS_mountIo(PHYSFS_Io *io, const char *fname, const char *mountPoint, int appendToPath) { BAIL_IF_MACRO(!io, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(io->version != 0, PHYSFS_ERR_UNSUPPORTED, 0); return doMount(io, fname, mountPoint, appendToPath); } /* PHYSFS_mountIo */ diff --git a/src/physfs.h b/src/physfs.h index 6550855a..830ee55d 100644 --- a/src/physfs.h +++ b/src/physfs.h @@ -2809,6 +2809,26 @@ PHYSFS_DECL PHYSFS_sint64 PHYSFS_writeBytes(PHYSFS_File *handle, */ typedef struct PHYSFS_Io { + /** + * \brief Binary compatibility information. + * + * This must be set to zero at this time. Future versions of this + * struct will increment this field, so we know what a given + * implementation supports. We'll presumably keep supporting older + * versions as we offer new features, though. + */ + PHYSFS_uint32 version; + + /** + * \brief Instance data for this struct. + * + * Each instance has a pointer associated with it that can be used to + * store anything it likes. This pointer is per-instance of the stream, + * so presumably it will change when calling duplicate(). This can be + * deallocated during the destroy() method. + */ + void *opaque; + /** * \brief Read more data. * @@ -2936,16 +2956,6 @@ typedef struct PHYSFS_Io * \param s The i/o instance to destroy. */ void (*destroy)(struct PHYSFS_Io *io); - - /** - * \brief Instance data for this struct. - * - * Each instance has a pointer associated with it that can be used to - * store anything it likes. This pointer is per-instance of the stream, - * so presumably it will change when calling duplicate(). This can be - * deallocated during the destroy() method. - */ - void *opaque; } PHYSFS_Io; diff --git a/src/physfs_internal.h b/src/physfs_internal.h index 9b56b3f8..0943c24c 100644 --- a/src/physfs_internal.h +++ b/src/physfs_internal.h @@ -118,6 +118,8 @@ void __PHYSFS_smallFree(void *ptr); #define PHYSFS_SUPPORTS_ISO9660 0 #endif +/* The latest supported PHYSFS_Io::version value. */ +#define CURRENT_PHYSFS_IO_API_VERSION 0 /* Opaque data for file and dir handlers... */ typedef void PHYSFS_Dir;