changeset 1037:d674ddc0fc82

Change PACK file format to use 64 bit fileoffsets. Also switch some fields around for nicety. This breaks compatibility, so bump version.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 01 Mar 2015 16:59:00 +0200
parents 1a0a327d8fed
children 3c1ca37809e3
files src/dmpack.c src/dmpack.h tools/packed.c
diffstat 3 files changed, 13 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/dmpack.c	Sun Mar 01 16:57:50 2015 +0200
+++ b/src/dmpack.c	Sun Mar 01 16:59:00 2015 +0200
@@ -96,7 +96,7 @@
     if (!dm_fread_str(pack->file, (Uint8 *) &hdr.ident, sizeof(hdr.ident)) ||
         !dm_fread_le16(pack->file, &hdr.version) ||
         !dm_fread_le32(pack->file, &hdr.dirEntries) ||
-        !dm_fread_le32(pack->file, &hdr.dirOffset))
+        !dm_fread_le64(pack->file, &hdr.dirOffset))
     {
         ret = DMERR_FREAD;
         goto out;
@@ -135,9 +135,9 @@
         }
 
         if (!dm_fread_str(pack->file, (Uint8 *) &entry->filename, DMRES_NAME_LEN) ||
+            !dm_fread_le64(pack->file, &entry->offset) ||
+            !dm_fread_le32(pack->file, &entry->length) ||
             !dm_fread_le32(pack->file, &entry->size) ||
-            !dm_fread_le32(pack->file, &entry->offset) ||
-            !dm_fread_le32(pack->file, &entry->length) ||
             !dm_fread_le32(pack->file, &entry->flags))
         {
             ret = DMERR_FREAD;
--- a/src/dmpack.h	Sun Mar 01 16:57:50 2015 +0200
+++ b/src/dmpack.h	Sun Mar 01 16:59:00 2015 +0200
@@ -10,17 +10,18 @@
 
 
 #define	DPACK_IDENT     "TNSPDPCK"      // Magic ident
-#define	DPACK_VERSION   (0x0120)        // Version
+#define	DPACK_VERSION   (0x0200)        // Version
 
 
 typedef struct _DMPackEntry
 {
-    Uint32  size;              // Size (UNCOMPRESSED)
-    Uint32  offset;            // Offset in pack file
-    Uint32  length;            // (Compressed) data length
     char    filename[DMRES_NAME_LEN + 1]; // +1 for NUL byte
+    Uint64  offset;            // Offset in pack file
+    Uint32  length;            // Compressed data length
+    Uint32  size;              // Size of UNCOMPRESSED data
+    Uint32  flags;             // Stored flags, see DMF_* in dmres.h
 
-    Uint32  flags, privFlags;
+    Uint32  privFlags;  // PrivFlags are not stored
     struct _DMPackEntry *next, *prev;
 } DMPackEntry;
 
@@ -38,7 +39,7 @@
     char    ident[8];          // Magic identifier
     Uint16  version;           // Version
     Uint32  dirEntries;        // Number of entries
-    Uint32  dirOffset;         // Offset of the directory
+    Uint64  dirOffset;         // Offset of the directory
 } DMPackFileHeader;
 
 
--- a/tools/packed.c	Sun Mar 01 16:57:50 2015 +0200
+++ b/tools/packed.c	Sun Mar 01 16:59:00 2015 +0200
@@ -217,7 +217,7 @@
     if (!dm_fwrite_str(pack->file, (Uint8 *) & hdr.ident, sizeof(hdr.ident)) ||
         !dm_fwrite_le16(pack->file, hdr.version) ||
         !dm_fwrite_le32(pack->file, hdr.dirEntries) ||
-        !dm_fwrite_le32(pack->file, hdr.dirOffset))
+        !dm_fwrite_le64(pack->file, hdr.dirOffset))
         return DMERR_FWRITE;
 
     // Write the directory
@@ -229,9 +229,9 @@
     {
         // Write one entry
         if (!dm_fwrite_str(pack->file, node->filename, DMRES_NAME_LEN) ||
+            !dm_fwrite_le64(pack->file, node->offset) ||
+            !dm_fwrite_le32(pack->file, node->length) ||
             !dm_fwrite_le32(pack->file, node->size) ||
-            !dm_fwrite_le32(pack->file, node->offset) ||
-            !dm_fwrite_le32(pack->file, node->length) ||
             !dm_fwrite_le32(pack->file, node->flags))
             return DMERR_FWRITE;