shithub: duke3d

Download patch

ref: 61a0ad733e08c9a03a7ee5e1db2c72e19a7a05e8
parent: ce68b45e19a6a013db19fea91bb806b67f744138
author: Fabien Sanglard <[email protected]>
date: Thu Jan 31 19:17:40 EST 2013

Structured filesystem finished.

--- a/Engine/src/filesystem.c
+++ b/Engine/src/filesystem.c
@@ -15,52 +15,27 @@
 
 char game_dir[512];
 
-
+//The multiplayer module in game.dll needs direct access to the crc32 (sic).
 int32_t groupefil_crc32[MAXGROUPFILES];
 
-/*
 
- uint8_t  toupperlookup[256] =
-{
-	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
-	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
-	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
-	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
-	0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
-	0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
-	0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
-	0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x7b,0x7c,0x7d,0x7e,0x7f,
-	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
-	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
-	0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
-	0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
-	0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
-	0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
-	0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
-	0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
-};
+// A typical GRP index entry:
+//     - 12 bytes for filename
+//     -  4 for filesize
+typedef uint8_t grpIndexEntry_t[16]; 
 
-/*
-int32_t numgroupfiles = 0;			// number of GRP files actually used.
-int32_t gnumfiles[MAXGROUPFILES];	// number of files on grp
-int32_t groupfil[MAXGROUPFILES] = {-1,-1,-1,-1}; // grp file handles
-int32_t groupfilpos[MAXGROUPFILES];
-*/
-
-typedef uint8_t grpIndexEntry_t[16]; //12 bytes for filename + 4 for filesize
-
 typedef struct grpArchive_s{
     
-    int32_t  numFiles           ;//Number of files in the archive.
+    int32_t  numFiles             ;//Number of files in the archive.
     grpIndexEntry_t  *gfilelist   ;//Array containing the filenames.
-    int32_t  *gfileoffs         ;//Array containing the file offsets.
-    int32_t  *gfilesize         ;//Array containing the file offsets.
-    //uint8_t  *rawData           ;//Mem address from where files offsets start.
-    int fileDescriptor          ;//The fd used for open,read operations.
-    uint32_t crc32              ;//Hash to recognize GRP: Duke Shareware, Duke plutonimum etc...
+    int32_t  *fileOffsets         ;//Array containing the file offsets.
+    int32_t  *filesizes           ;//Array containing the file offsets.
+    int fileDescriptor            ;//The fd used for open,read operations.
+    uint32_t crc32                ;//Hash to recognize GRP: Duke Shareware, Duke plutonimum etc...
     
 } grpArchive_t;
 
+//All GRP opened are in this structure
 typedef struct grpSet_s{
     grpArchive_t archives[MAXGROUPFILES];
     int32_t num;
@@ -70,24 +45,8 @@
 // but also that the content will be set to 0.
 static grpSet_t grpSet;
 
-/*
-uint8_t  *gfilelist[MAXGROUPFILES];	// name list + size list of all the files in grp
-int32_t *gfileoffs[MAXGROUPFILES];	// offset of the files
-uint8_t  *groupfil_memory[MAXGROUPFILES]; // addresses of raw GRP files in memory
-int32_t groupefil_crc32[MAXGROUPFILES];
 
-uint8_t  filegrp[MAXOPENFILES];
-int32_t filepos[MAXOPENFILES];
-int32_t filehan[MAXOPENFILES] =
-{
-	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-};
-*/
 
-
 int32_t initgroupfile(const char  *filename)
 {
 	uint8_t         buf[16]                 ;
@@ -147,14 +106,14 @@
     
     
     archive->gfilelist = kmalloc(archive->numFiles * sizeof(grpIndexEntry_t));
-    archive->gfileoffs = kmalloc(archive->numFiles * sizeof(int32_t));
-    archive->gfilesize = kmalloc(archive->numFiles * sizeof(int32_t));
+    archive->fileOffsets = kmalloc(archive->numFiles * sizeof(int32_t));
+    archive->filesizes = kmalloc(archive->numFiles * sizeof(int32_t));
     
     // Load the full index 16 bytes per file (12bytes for name + 4 bytes for the size).
     read(archive->fileDescriptor,archive->gfilelist, archive->numFiles * 16);
     
     //Initialize all file offset and pointers.
-    j = 12 + archive->numFiles * sizeof(grpIndexEntry_t);
+    j = 12 + 4 + archive->numFiles * sizeof(grpIndexEntry_t);
     for(i=0;i<archive->numFiles;i++){
         
         k = BUILDSWAP_INTEL32(*((int32_t *)&archive->gfilelist[i][12])); // get size
@@ -162,11 +121,11 @@
         // Now that the filesize has been read, we can replace it with '0' and hence have a
         // valid, null terminated character string that will be usable.
         archive->gfilelist[i][12] = '\0';
-        archive->gfilesize[i] = k;
-        archive->gfileoffs[i] = j; // absolute offset list of all files.
+        archive->filesizes[i] = k;
+        archive->fileOffsets[i] = j; // absolute offset list of all files.
         j += k;
     }
-    //archive->gfileoffs[archive->numFiles-1] = j;
+    //archive->fileOffsets[archive->numFiles-1] = j;
 	
     
 	// Compute CRC32 of the whole grp and implicitely caches the GRP in memory through windows caching service.
@@ -200,8 +159,8 @@
     
 	for( i=0 ; i < grpSet.num ;i++){
         free(grpSet.archives[i].gfilelist);
-        free(grpSet.archives[i].gfileoffs);
-        free(grpSet.archives[i].gfilesize);
+        free(grpSet.archives[i].fileOffsets);
+        free(grpSet.archives[i].filesizes);
         memset(&grpSet.archives[i], 0, sizeof(grpArchive_t));
     }
     
@@ -288,16 +247,16 @@
     return (crc);
 }
 
-
+// The engine can open files transparently on the filesystem or on the GRPsystem
 enum fileType_e{ SYSTEM_FILE, GRP_FILE} ;
 
 //An entry in the array tracking open files
 typedef struct openFile_s{
     enum fileType_e type ;
-    int fd        ;         //This can be either the fileDescriptor or the fileIndex in a GRP.
-    int cursor    ;
-    int grpID     ;
-    int used      ;
+    int fd        ;  //Either the fileDescriptor or the fileIndex in a GRP depending on the type.
+    int cursor    ;  //lseek cursor
+    int grpID     ;  //GRP id
+    int used      ;  //Marker 1=used
 } openFile_t;
 
 
@@ -311,7 +270,7 @@
 
     grpArchive_t* archive;
     
-    //Search a few slot
+    //Search a free slot
 	newhandle = MAXOPENFILES-1;
 	while (openFiles[newhandle].used && newhandle >= 0)
 		newhandle--;
@@ -379,11 +338,11 @@
     archive = & grpSet.archives[openFile->grpID];
         
     lseek(archive->fileDescriptor,
-          archive->gfileoffs[openFile->fd] + openFile->cursor,
+          archive->fileOffsets[openFile->fd] + openFile->cursor,
           SEEK_SET);
     
     //Adjust leng so we cannot read more than filesystem-cursor location.
-    leng = min(leng,archive->gfilesize[openFile->fd]-openFile->cursor);
+    leng = min(leng,archive->filesizes[openFile->fd]-openFile->cursor);
     
     leng = read(archive->fileDescriptor,buffer,leng);
     
@@ -436,7 +395,7 @@
 	
     switch(whence){
         case SEEK_SET: openFiles[handle].cursor = offset; break;
-        case SEEK_END: openFiles[handle].cursor = archive->gfilesize[openFiles[handle].fd]; break;
+        case SEEK_END: openFiles[handle].cursor = archive->filesizes[openFiles[handle].fd]; break;
         case SEEK_CUR: openFiles[handle].cursor += offset; break;
     }
     
@@ -469,7 +428,7 @@
     
     else{
         grpArchive_t* archive = &grpSet.archives[ openFile->grpID ];
-        return archive->gfilesize[openFile->fd];
+        return archive->filesizes[openFile->fd];
     }
     
 }