Add binary compatibility to PHYSFS_Io.
authorRyan C. Gordon <icculus@icculus.org>
Sun, 25 Mar 2012 17:18:24 -0400
changeset 1280 bd174b99fa5b
parent 1279 5fc8dff2909b
child 1281 cd136b8d3b1a
Add binary compatibility to PHYSFS_Io.
src/archiver_iso9660.c
src/archiver_lzma.c
src/archiver_unpacked.c
src/archiver_zip.c
src/physfs.c
src/physfs.h
src/physfs_internal.h
--- a/src/archiver_iso9660.c	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/archiver_iso9660.c	Sun Mar 25 17:18:24 2012 -0400
@@ -526,6 +526,7 @@
 
 static const PHYSFS_Io ISO9660_Io =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     ISO9660_read,
     ISO9660_write,
     ISO9660_seek,
@@ -533,8 +534,7 @@
     ISO9660_length,
     ISO9660_duplicate,
     ISO9660_flush,
-    ISO9660_destroy,
-    NULL
+    ISO9660_destroy
 };
 
 
--- a/src/archiver_lzma.c	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/archiver_lzma.c	Sun Mar 25 17:18:24 2012 -0400
@@ -427,6 +427,7 @@
 
 static const PHYSFS_Io LZMA_Io =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     LZMA_read,
     LZMA_write,
     LZMA_seek,
@@ -434,8 +435,7 @@
     LZMA_length,
     LZMA_duplicate,
     LZMA_flush,
-    LZMA_destroy,
-    NULL
+    LZMA_destroy
 };
 
 
--- a/src/archiver_unpacked.c	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/archiver_unpacked.c	Sun Mar 25 17:18:24 2012 -0400
@@ -133,6 +133,7 @@
 
 static const PHYSFS_Io UNPK_Io =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     UNPK_read,
     UNPK_write,
     UNPK_seek,
@@ -140,8 +141,7 @@
     UNPK_length,
     UNPK_duplicate,
     UNPK_flush,
-    UNPK_destroy,
-    NULL
+    UNPK_destroy
 };
 
 
--- a/src/archiver_zip.c	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/archiver_zip.c	Sun Mar 25 17:18:24 2012 -0400
@@ -394,6 +394,7 @@
 
 static const PHYSFS_Io ZIP_Io =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     ZIP_read,
     ZIP_write,
     ZIP_seek,
@@ -401,8 +402,7 @@
     ZIP_length,
     ZIP_duplicate,
     ZIP_flush,
-    ZIP_destroy,
-    NULL
+    ZIP_destroy
 };
 
 
--- a/src/physfs.c	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/physfs.c	Sun Mar 25 17:18:24 2012 -0400
@@ -174,6 +174,7 @@
 
 static const PHYSFS_Io __PHYSFS_nativeIoInterface =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     nativeIo_read,
     nativeIo_write,
     nativeIo_seek,
@@ -181,8 +182,7 @@
     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 const PHYSFS_Io __PHYSFS_memoryIoInterface =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     memoryIo_read,
     memoryIo_write,
     memoryIo_seek,
@@ -376,8 +377,7 @@
     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 const PHYSFS_Io __PHYSFS_handleIoInterface =
 {
+    CURRENT_PHYSFS_IO_API_VERSION, NULL,
     handleIo_read,
     handleIo_write,
     handleIo_seek,
@@ -519,8 +520,7 @@
     handleIo_length,
     handleIo_duplicate,
     handleIo_flush,
-    handleIo_destroy,
-    NULL
+    handleIo_destroy
 };
 
 static PHYSFS_Io *__PHYSFS_createHandleIo(PHYSFS_File *f)
@@ -1494,6 +1494,7 @@
                    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 */
 
--- a/src/physfs.h	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/physfs.h	Sun Mar 25 17:18:24 2012 -0400
@@ -2810,6 +2810,26 @@
 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.
      *
      * Read (len) bytes from the interface, at the current i/o position, and
@@ -2936,16 +2956,6 @@
      *   \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;
 
 
--- a/src/physfs_internal.h	Sun Mar 25 16:15:10 2012 -0400
+++ b/src/physfs_internal.h	Sun Mar 25 17:18:24 2012 -0400
@@ -118,6 +118,8 @@
 #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;