]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
329
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 90ba0702bd5b88a617d8ca6dfdc8f7dfe4091287..d507299576be4b750d7c4ffd89e8b519642680c2 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -25,8 +25,6 @@
 
 #include "quakedef.h"
 
-#include <stdlib.h>
-#include <string.h>
 #include <limits.h>
 #include <fcntl.h>
 
@@ -262,7 +260,7 @@ int fs_filesize;
 
 pack_t *packlist = NULL;
 
-searchpath_t *fs_searchpaths;
+searchpath_t *fs_searchpaths = NULL;
 
 #define MAX_FILES_IN_PACK      65536
 
@@ -552,7 +550,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile)
        strlcpy (pack->filename, packfile, sizeof (pack->filename));
        pack->handle = packhandle;
        pack->numfiles = eocd.nbentries;
-       pack->mempool = Mem_AllocPool (packfile);
+       pack->mempool = Mem_AllocPool (packfile, 0, NULL);
        pack->files = Mem_Alloc (pack->mempool, eocd.nbentries * sizeof(packfile_t));
        pack->next = packlist;
        packlist = pack;
@@ -746,7 +744,7 @@ pack_t *FS_LoadPackPAK (const char *packfile)
        strlcpy (pack->filename, packfile, sizeof (pack->filename));
        pack->handle = packhandle;
        pack->numfiles = 0;
-       pack->mempool = Mem_AllocPool(packfile);
+       pack->mempool = Mem_AllocPool(packfile, 0, NULL);
        pack->files = Mem_Alloc(pack->mempool, numpackfiles * sizeof(packfile_t));
        pack->next = packlist;
        packlist = pack;
@@ -868,7 +866,7 @@ char *FS_FileExtension (const char *in)
                separator = backslash;
        if (separator < colon)
                separator = colon;
-       if (dot < separator)
+       if (dot == NULL || dot < separator)
                return "";
        dot++;
        for (i = 0;i < 7 && dot[i];i++)
@@ -888,45 +886,29 @@ void FS_Init (void)
        int i;
        searchpath_t *search;
 
-       fs_mempool = Mem_AllocPool("file management");
-       pak_mempool = Mem_AllocPool("paks");
+       fs_mempool = Mem_AllocPool("file management", 0, NULL);
+       pak_mempool = Mem_AllocPool("paks", 0, NULL);
+
+       Cvar_RegisterVariable (&scr_screenshot_name);
 
        Cmd_AddCommand ("path", FS_Path_f);
        Cmd_AddCommand ("dir", FS_Dir_f);
        Cmd_AddCommand ("ls", FS_Ls_f);
 
        strcpy(fs_basedir, ".");
+       strcpy(fs_gamedir, ".");
 
        PK3_OpenLibrary ();
 
        // -basedir <path>
        // Overrides the system supplied base directory (under GAMENAME)
        i = COM_CheckParm ("-basedir");
-       if (i && i < com_argc-1)
-               strlcpy (fs_basedir, com_argv[i+1], sizeof (fs_basedir));
-
-       i = strlen (fs_basedir);
-       if (i > 0 && (fs_basedir[i-1] == '\\' || fs_basedir[i-1] == '/'))
-               fs_basedir[i-1] = 0;
-
-       // start up with GAMENAME by default (id1)
-       strlcpy (com_modname, GAMENAME, sizeof (com_modname));
-       FS_AddGameDirectory (va("%s/"GAMENAME, fs_basedir));
-       if (gamedirname[0])
-       {
-               fs_modified = true;
-               strlcpy (com_modname, gamedirname, sizeof (com_modname));
-               FS_AddGameDirectory (va("%s/%s", fs_basedir, gamedirname));
-       }
-
-       // -game <gamedir>
-       // Adds basedir/gamedir as an override game
-       i = COM_CheckParm ("-game");
        if (i && i < com_argc-1)
        {
-               fs_modified = true;
-               strlcpy (com_modname, com_argv[i+1], sizeof (com_modname));
-               FS_AddGameDirectory (va("%s/%s", fs_basedir, com_argv[i+1]));
+               strlcpy (fs_basedir, com_argv[i+1], sizeof (fs_basedir));
+               i = strlen (fs_basedir);
+               if (i > 0 && (fs_basedir[i-1] == '\\' || fs_basedir[i-1] == '/'))
+                       fs_basedir[i-1] = 0;
        }
 
        // -path <dir or packfile> [<dir or packfile>] ...
@@ -935,7 +917,6 @@ void FS_Init (void)
        if (i)
        {
                fs_modified = true;
-               fs_searchpaths = NULL;
                while (++i < com_argc)
                {
                        if (!com_argv[i] || com_argv[i][0] == '+' || com_argv[i][0] == '-')
@@ -959,6 +940,37 @@ void FS_Init (void)
                        search->next = fs_searchpaths;
                        fs_searchpaths = search;
                }
+               return;
+       }
+
+       // start up with GAMENAME by default (id1)
+       strlcpy (com_modname, GAMENAME, sizeof (com_modname));
+       FS_AddGameDirectory (va("%s/"GAMENAME, fs_basedir));
+       Cvar_SetQuick (&scr_screenshot_name, gamescreenshotname);
+
+       // add the game-specific path, if any
+       if (gamedirname[0])
+       {
+               fs_modified = true;
+               strlcpy (com_modname, gamedirname, sizeof (com_modname));
+               FS_AddGameDirectory (va("%s/%s", fs_basedir, gamedirname));
+       }
+
+       // -game <gamedir>
+       // Adds basedir/gamedir as an override game
+       // LordHavoc: now supports multiple -game directories
+       for (i = 1;i < com_argc;i++)
+       {
+               if (!com_argv[i])
+                       continue;
+               if (!strcmp (com_argv[i], "-game") && i < com_argc-1)
+               {
+                       i++;
+                       fs_modified = true;
+                       strlcpy (com_modname, com_argv[i], sizeof (com_modname));
+                       FS_AddGameDirectory (va("%s/%s", fs_basedir, com_argv[i]));
+                       Cvar_SetQuick (&scr_screenshot_name, com_modname);
+               }
        }
 }
 
@@ -1445,6 +1457,19 @@ int FS_Printf(qfile_t* file, const char* format, ...)
 }
 
 
+/*
+====================
+FS_VPrintf
+
+Print a string into a file
+====================
+*/
+int FS_VPrintf(qfile_t* file, const char* format, va_list ap)
+{
+       return vfprintf (file->stream, format, ap);
+}
+
+
 /*
 ====================
 FS_Getc
@@ -1900,7 +1925,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
        if (separator < colon)
                separator = colon;
        basepathlength = separator - pattern;
-       basepath = Z_Malloc(basepathlength + 1);
+       basepath = Mem_Alloc (tempmempool, basepathlength + 1);
        if (basepathlength)
                memcpy(basepath, pattern, basepathlength);
        basepath[basepathlength] = 0;
@@ -2004,7 +2029,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
                        stringlistfree(liststart);
        }
 
-       Z_Free(basepath);
+       Mem_Free(basepath);
        return search;
 }
 
@@ -2025,7 +2050,7 @@ int FS_ListDirectory(const char *pattern, int oneperline)
        const char *name;
        char linebuf[4096];
        fssearch_t *search;
-       search = FS_Search(pattern, true, false);
+       search = FS_Search(pattern, true, true);
        if (!search)
                return 0;
        numfiles = search->numfilenames;