X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=49ca69bfa1e287adfa735dcc6b6224957819e989;hb=9f81c8847d7d63d95a95cd73c64ea53c8b93e1f8;hp=093d0ac9ad3a7cec37d5bd7d803d6d9efaf3e164;hpb=1e1dbc1c5b89ae4ab8cdd9b32dc6413c67f5dd84;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 093d0ac9..49ca69bf 100644 --- a/fs.c +++ b/fs.c @@ -25,8 +25,6 @@ #include "quakedef.h" -#include -#include #include #include @@ -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 @@ -317,11 +315,7 @@ Unload the Zlib DLL */ void PK3_CloseLibrary (void) { - if (!zlib_dll) - return; - - Sys_UnloadLibrary (zlib_dll); - zlib_dll = NULL; + Sys_UnloadLibrary (&zlib_dll); } @@ -335,7 +329,6 @@ Try to load the Zlib DLL qboolean PK3_OpenLibrary (void) { const char* dllname; - const dllfunction_t *func; // Already loaded? if (zlib_dll) @@ -347,27 +340,14 @@ qboolean PK3_OpenLibrary (void) dllname = "libz.so"; #endif - // Initializations - for (func = zlibfuncs; func && func->name != NULL; func++) - *func->funcvariable = NULL; - // Load the DLL - if (! (zlib_dll = Sys_LoadLibrary (dllname))) + if (! Sys_LoadLibrary (dllname, &zlib_dll, zlibfuncs)) { - Con_Printf("Can't find %s. Compressed files support disabled\n", dllname); + Con_Printf ("Compressed files support disabled\n"); return false; } - // Get the function adresses - for (func = zlibfuncs; func && func->name != NULL; func++) - if (!(*func->funcvariable = (void *) Sys_GetProcAddress (zlib_dll, func->name))) - { - Con_Printf("missing function \"%s\" - broken Zlib library!\n", func->name); - PK3_CloseLibrary (); - return false; - } - - Con_Printf("%s loaded. Compressed files support enabled\n", dllname); + Con_Printf ("Compressed files support enabled\n"); return true; } @@ -570,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; @@ -764,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; @@ -886,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++) @@ -906,54 +886,39 @@ 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 // Overrides the system supplied base directory (under GAMENAME) +// COMMANDLINEOPTION: Filesystem: -basedir chooses what base directory the game data is in, inside this there should be a data directory for the game (for example id1) 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 - // 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 [] ... // Fully specifies the exact search path, overriding the generated one +// COMMANDLINEOPTION: Filesystem: -path specifies the full search path manually, overriding the generated one, example: -path c:\quake\id1 c:\quake\pak0.pak c:\quake\pak1.pak (not recommended) i = COM_CheckParm ("-path"); if (i) { fs_modified = true; - fs_searchpaths = NULL; while (++i < com_argc) { if (!com_argv[i] || com_argv[i][0] == '+' || com_argv[i][0] == '-') @@ -977,6 +942,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 + // 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); + } } } @@ -1463,6 +1459,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 @@ -1918,7 +1927,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; @@ -2022,7 +2031,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) stringlistfree(liststart); } - Z_Free(basepath); + Mem_Free(basepath); return search; } @@ -2043,7 +2052,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;