]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
corrected a few LittleLongs to LittleFloat in md3 loading (EEP those were bad)
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index fa3babce07cd8682506849b686d8c26145b608d8..d73791214fafb5ccd097cd3e96b2d56f313b0c6c 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -193,7 +193,7 @@ typedef struct
 
 
 // Packages in memory
-typedef enum 
+typedef enum
 {
        FILE_FLAG_NONE          = 0,
        FILE_FLAG_TRUEOFFS      = (1 << 0),     // the offset in packfile_t is the true contents offset
@@ -213,6 +213,7 @@ typedef struct pack_s
 {
        char filename [MAX_OSPATH];
        FILE *handle;
+       int ignorecase; // LordHavoc: pk3 ignores case
        int numfiles;
        packfile_t *files;
        mempool_t *mempool;
@@ -382,7 +383,7 @@ qboolean PK3_GetEndOfCentralDir (const char *packfile, FILE *packhandle, pk3_end
                maxsize = ZIP_MAX_COMMENTS_SIZE + ZIP_END_CDIR_SIZE;
        buffer = Mem_Alloc (tempmempool, maxsize);
        fseek (packhandle, filesize - maxsize, SEEK_SET);
-       if (fread (buffer, 1, maxsize, packhandle) != maxsize)
+       if (fread (buffer, 1, maxsize, packhandle) != (unsigned long) maxsize)
        {
                Mem_Free (buffer);
                return false;
@@ -474,7 +475,7 @@ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd)
                if ((ptr[8] & 0x29) == 0 && (ptr[38] & 0x18) == 0)
                {
                        // Still enough bytes for the name?
-                       if (remaining < namesize || namesize >= sizeof (*pack->files))
+                       if ((size_t) remaining < namesize || namesize >= sizeof (*pack->files))
                        {
                                Mem_Free (central_dir);
                                return -1;
@@ -537,11 +538,13 @@ pack_t *FS_LoadPackPK3 (const char *packfile)
        if (eocd.disknum != 0 || eocd.cdir_disknum != 0)
                Sys_Error ("%s is a multi-volume ZIP archive", packfile);
 
-       if (eocd.nbentries > MAX_FILES_IN_PACK)
-               Sys_Error ("%s contains too many files (%hu)", packfile, eocd.nbentries);
+       // LordHavoc: was always false because nbentries is an unsigned short and MAX_FILES_IN_PACK is 65536
+       //if (eocd.nbentries > (unsigned int) MAX_FILES_IN_PACK)
+       //      Sys_Error ("%s contains too many files (%hu)", packfile, eocd.nbentries);
 
        // Create a package structure in memory
        pack = Mem_Alloc (pak_mempool, sizeof (pack_t));
+       pack->ignorecase = true; // LordHavoc: pk3 ignores case
        strcpy (pack->filename, packfile);
        pack->handle = packhandle;
        pack->numfiles = eocd.nbentries;
@@ -682,6 +685,7 @@ pack_t *FS_LoadPackPAK (const char *packfile)
                Sys_Error ("%s has %i files", packfile, numpackfiles);
 
        pack = Mem_Alloc(pak_mempool, sizeof (pack_t));
+       pack->ignorecase = false; // LordHavoc: pak is case sensitive
        strcpy (pack->filename, packfile);
        pack->handle = packhandle;
        pack->numfiles = numpackfiles;
@@ -789,15 +793,23 @@ FS_FileExtension
 char *FS_FileExtension (const char *in)
 {
        static char exten[8];
+       const char *slash, *backslash, *colon, *dot, *separator;
        int i;
 
-       while (*in && *in != '.')
-               in++;
-       if (!*in)
+       slash = strrchr(in, '/');
+       backslash = strrchr(in, '\\');
+       colon = strrchr(in, ':');
+       dot = strrchr(in, '.');
+       separator = slash;
+       if (separator < backslash)
+               separator = backslash;
+       if (separator < colon)
+               separator = colon;
+       if (dot < separator)
                return "";
-       in++;
-       for (i=0 ; i<7 && *in ; i++,in++)
-               exten[i] = *in;
+       dot++;
+       for (i = 0;i < 7 && dot[i];i++)
+               exten[i] = dot[i];
        exten[i] = 0;
        return exten;
 }
@@ -964,7 +976,7 @@ qfile_t *FS_FOpenFile (const char *filename, qboolean quiet)
        searchpath_t *search;
        char netpath[MAX_OSPATH];
        pack_t *pak;
-       int i, filenamelen;
+       int i, filenamelen, matched;
 
        filenamelen = strlen (filename);
 
@@ -979,7 +991,12 @@ qfile_t *FS_FOpenFile (const char *filename, qboolean quiet)
                        // look through all the pak file elements
                        pak = search->pack;
                        for (i=0 ; i<pak->numfiles ; i++)
-                               if (!strcmp (pak->files[i].name, filename))  // found it?
+                       {
+                               if (pak->ignorecase)
+                                       matched = !strcasecmp (pak->files[i].name, filename);
+                               else
+                                       matched = !strcmp (pak->files[i].name, filename);
+                               if (matched)  // found it?
                                {
                                        qfile_t *file;
 
@@ -1023,8 +1040,8 @@ qfile_t *FS_FOpenFile (const char *filename, qboolean quiet)
                                                 * windowBits is passed < 0 to tell that there is no zlib header.
                                                 * Note that in this case inflate *requires* an extra "dummy" byte
                                                 * after the compressed stream in order to complete decompression and
-                                                * return Z_STREAM_END. 
-                                                * In unzip, i don't wait absolutely Z_STREAM_END because I known the 
+                                                * return Z_STREAM_END.
+                                                * In unzip, i don't wait absolutely Z_STREAM_END because I known the
                                                 * size of both compressed and uncompressed data
                                                 */
                                                if (qz_inflateInit2 (&ztk->zstream, -MAX_WBITS) != Z_OK)
@@ -1038,6 +1055,7 @@ qfile_t *FS_FOpenFile (const char *filename, qboolean quiet)
 
                                        return file;
                                }
+                       }
                }
                else
                {
@@ -1331,7 +1349,7 @@ int FS_Seek (qfile_t* file, long offset, int whence)
                ztoolkit_t *ztk = file->z;
                size_t crt_offset;
                qbyte buffer [sizeof (ztk->output)];  // it's big to force inflating into buffer directly
-               
+
                crt_offset = ztk->out_position - ztk->out_max + ztk->out_ind;
 
                switch (whence)
@@ -1352,7 +1370,7 @@ int FS_Seek (qfile_t* file, long offset, int whence)
                }
 
                // If we need to go back in the file
-               if (offset <= crt_offset)
+               if (offset <= (long) crt_offset)
                {
                        // If we still have the data we need in the output buffer
                        if (crt_offset - offset <= ztk->out_ind)
@@ -1378,11 +1396,11 @@ int FS_Seek (qfile_t* file, long offset, int whence)
                }
 
                // Skip all data until we reach the requested offset
-               while (crt_offset < offset)
+               while ((long) crt_offset < offset)
                {
                        size_t diff = offset - crt_offset;
                        size_t count, len;
-                       
+
                        count = (diff > sizeof (buffer)) ? sizeof (buffer) : diff;
                        len = FS_Read (file, buffer, count);
                        if (len != count)
@@ -1411,7 +1429,7 @@ int FS_Seek (qfile_t* file, long offset, int whence)
                default:
                        return -1;
        }
-       if (offset < 0 || offset > file->length)
+       if (offset < 0 || offset > (long) file->length)
                return -1;
 
        if (fseek (file->stream, file->offset + offset, SEEK_SET) == -1)
@@ -1460,7 +1478,7 @@ char* FS_Gets (qfile_t* file, char* buffer, int buffersize)
        if (! (file->flags & FS_FLAG_PACKED))
                return fgets (buffer, buffersize, file->stream);
 
-       for (ind = 0; ind < buffersize - 1; ind++)
+       for (ind = 0; ind < (size_t) buffersize - 1; ind++)
        {
                int c = FS_Getc (file);
                switch (c)
@@ -1548,7 +1566,7 @@ int FS_Eof (qfile_t* file)
 
                return (file->position == file->length);
        }
-       
+
        return feof (file->stream);
 }