]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
add Blub's r_track_sprites for SPR_LABEL*
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 74329aaf779185b2c82ce6e165fa21144e357592..362b36ad71c1b5cd0093ecf5b617d66c2123b4ce 100644 (file)
--- a/fs.c
+++ b/fs.c
 # define O_NONBLOCK 0
 #endif
 
+// largefile support for Win32
+#ifdef WIN32
+# define lseek _lseeki64
+#endif
 
 /*
 
@@ -274,7 +278,6 @@ char fs_gamedir[MAX_OSPATH];
 char fs_basedir[MAX_OSPATH];
 
 // list of active game directories (empty if not running a mod)
-#define MAX_GAMEDIRS 16
 int fs_numgamedirs = 0;
 char fs_gamedirs[MAX_GAMEDIRS][MAX_QPATH];
 
@@ -1080,12 +1083,18 @@ FS_ClearSearchPath
 */
 void FS_ClearSearchPath (void)
 {
+       // unload all packs and directory information, close all pack files
+       // (if a qfile is still reading a pack it won't be harmed because it used
+       //  dup() to get its own handle already)
        while (fs_searchpaths)
        {
                searchpath_t *search = fs_searchpaths;
                fs_searchpaths = search->next;
                if (search->pack)
                {
+                       // close the file
+                       close(search->pack->handle);
+                       // free any memory associated with it
                        if (search->pack->files)
                                Mem_Free(search->pack->files);
                        Mem_Free(search->pack);
@@ -1216,6 +1225,9 @@ qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean
                }
        }
 
+       // halt demo playback to close the file
+       CL_Disconnect();
+
        Host_SaveConfig_f();
 
        fs_numgamedirs = numgamedirs;
@@ -1228,8 +1240,8 @@ qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean
        // exec the new config
        Host_LoadConfig_f();
 
-       // reinitialize the loaded sounds
-       S_Reload_f();
+       // unload all sounds so they will be reloaded from the new files as needed
+       S_UnloadAllSounds_f();
 
        // reinitialize renderer (this reloads hud/console background/etc)
        R_Modules_Restart();
@@ -1267,11 +1279,7 @@ void FS_GameDir_f (void)
        for (i = 0;i < numgamedirs;i++)
                strlcpy(gamedirs[i], Cmd_Argv(i+1), sizeof(gamedirs[i]));
 
-       // allow gamedir change during demo loop
-       if (cls.demoplayback)
-               CL_Disconnect();
-
-       if (cls.state == ca_connected || sv.active)
+       if ((cls.state == ca_connected && !cls.demoplayback) || sv.active)
        {
                // actually, changing during game would work fine, but would be stupid
                Con_Printf("Can not change gamedir while client is connected or server is running!\n");
@@ -1400,6 +1408,10 @@ FS_Shutdown
 */
 void FS_Shutdown (void)
 {
+       // close all pack files and such
+       // (hopefully there aren't any other open files, but they'll be cleaned up
+       //  by the OS anyway)
+       FS_ClearSearchPath();
        Mem_FreePool (&fs_mempool);
 }
 
@@ -1886,12 +1898,12 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize)
        if (file->buff_ind < file->buff_len)
        {
                count = file->buff_len - file->buff_ind;
+               count = ((fs_offset_t)buffersize > count) ? count : (fs_offset_t)buffersize;
+               done += count;
+               memcpy (buffer, &file->buff[file->buff_ind], count);
+               file->buff_ind += count;
 
-               done += ((fs_offset_t)buffersize > count) ? count : (fs_offset_t)buffersize;
-               memcpy (buffer, &file->buff[file->buff_ind], done);
-               file->buff_ind += done;
-
-               buffersize -= done;
+               buffersize -= count;
                if (buffersize == 0)
                        return done;
        }
@@ -2103,7 +2115,7 @@ Get the next character of a file
 */
 int FS_Getc (qfile_t* file)
 {
-       char c;
+       unsigned char c;
 
        if (FS_Read (file, &c, 1) != 1)
                return EOF;