X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=a0dd2c8ef36a85acff3cb11265348bd6ccac52ce;hb=52bda2e01c2fe584bb98477d158be3ef68dfb210;hp=538cf4376f7a4ac2c20a762b88d3cd0ad5a18ab2;hpb=c71853932342a49f005a07537d1694becf72de23;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 538cf437..a0dd2c8e 100644 --- a/fs.c +++ b/fs.c @@ -22,8 +22,6 @@ Boston, MA 02111-1307, USA */ -#include "quakedef.h" - #include #include @@ -37,6 +35,8 @@ # include #endif +#include "quakedef.h" + #include "fs.h" #include "wad.h" @@ -188,6 +188,8 @@ typedef struct #define QFILE_FLAG_DEFLATED (1 << 1) /// file is actually already loaded data #define QFILE_FLAG_DATA (1 << 2) +/// real file will be removed on close +#define QFILE_FLAG_REMOVE (1 << 3) #define FILE_BUFF_SIZE 2048 typedef struct @@ -215,6 +217,8 @@ struct qfile_s ztoolkit_t* ztk; ///< For zipped files. const unsigned char *data; ///< For data files. + + const char *filename; ///< Kept around for QFILE_FLAG_REMOVE, unused otherwise }; @@ -665,7 +669,7 @@ FS_LoadPackPK3 Create a package entry associated with a PK3 file ==================== */ -pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle) +pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle, qboolean silent) { pk3_endOfCentralDir_t eocd; pack_t *pack; @@ -673,7 +677,8 @@ pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle) if (! PK3_GetEndOfCentralDir (packfile, packhandle, &eocd)) { - Con_Printf ("%s is not a PK3 file\n", packfile); + if(!silent) + Con_Printf ("%s is not a PK3 file\n", packfile); close(packhandle); return NULL; } @@ -727,7 +732,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile) #endif if (packhandle < 0) return NULL; - return FS_LoadPackPK3FromFD(packfile, packhandle); + return FS_LoadPackPK3FromFD(packfile, packhandle, false); } @@ -1279,7 +1284,7 @@ static void FS_AddSelfPack(void) if(fs_selfpack) { searchpath_t *search; - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); search->next = fs_searchpaths; search->pack = fs_selfpack; fs_searchpaths = search; @@ -1350,18 +1355,31 @@ void FS_Rescan (void) unlink (va("%s/qconsole.log", fs_gamedir)); // look for the pop.lmp file and set registered to true if it is found - if ((gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE) && !FS_FileExists("gfx/pop.lmp")) + if (FS_FileExists("gfx/pop.lmp")) + Cvar_Set ("registered", "1"); + switch(gamemode) { - if (fs_modified) - Con_Print("Playing shareware version, with modification.\nwarning: most mods require full quake data.\n"); + case GAME_NORMAL: + case GAME_HIPNOTIC: + case GAME_ROGUE: + if (!registered.integer) + { + if (fs_modified) + Con_Print("Playing shareware version, with modification.\nwarning: most mods require full quake data.\n"); + else + Con_Print("Playing shareware version.\n"); + } else - Con_Print("Playing shareware version.\n"); - } - else - { - Cvar_Set ("registered", "1"); - if (gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE) Con_Print("Playing registered version.\n"); + break; + case GAME_STEELSTORM: + if (registered.integer) + Con_Print("Playing registered version.\n"); + else + Con_Print("Playing shareware version.\n"); + break; + default: + break; } // unload all wads so that future queries will return the new data @@ -1483,7 +1501,6 @@ void FS_GameDir_f (void) FS_ChangeGameDirs(numgamedirs, gamedirs, true, true); } -static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking); static const char *FS_SysCheckGameDir(const char *gamedir) { static char buf[8192]; @@ -1610,7 +1627,7 @@ void FS_Init_SelfPack (void) fs_mempool = Mem_AllocPool("file management", 0, NULL); if(com_selffd >= 0) { - fs_selfpack = FS_LoadPackPK3FromFD(com_argv[0], com_selffd); + fs_selfpack = FS_LoadPackPK3FromFD(com_argv[0], com_selffd, true); if(fs_selfpack) { char *buf, *q; @@ -1622,13 +1639,16 @@ void FS_Init_SelfPack (void) const char **new_argv; int i = 0; int args_left = 256; + new_argv = (const char **)Mem_Alloc(fs_mempool, sizeof(*com_argv) * (com_argc + args_left + 2)); if(com_argc == 0) { - com_argv[0] = "dummy"; - com_argv[1] = NULL; + new_argv[0] = "dummy"; com_argc = 1; } - new_argv = (const char **)Mem_Alloc(fs_mempool, sizeof(*com_argv) * (com_argc + args_left + 1)); + else + { + memcpy((char *)(&new_argv[0]), &com_argv[0], sizeof(*com_argv) * com_argc); + } p = buf; while(COM_ParseToken_Console(&p)) { @@ -1636,11 +1656,10 @@ void FS_Init_SelfPack (void) break; q = (char *)Mem_Alloc(fs_mempool, strlen(com_token) + 1); strlcpy(q, com_token, strlen(com_token) + 1); - new_argv[i+1] = q; + new_argv[com_argc + i] = q; ++i; } - new_argv[0] = com_argv[0]; - memcpy(&new_argv[i+2], &com_argv[1], sizeof(*com_argv) * com_argc); + new_argv[i+com_argc] = NULL; com_argv = new_argv; com_argc = com_argc + i; } @@ -1909,7 +1928,7 @@ FS_SysOpen Internal function used to create a qfile_t and open the relevant non-packed file on disk ==================== */ -static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking) +qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking) { qfile_t* file; @@ -1922,6 +1941,8 @@ static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean non return NULL; } + file->filename = Mem_strdup(fs_mempool, filepath); + file->real_length = lseek (file->handle, 0, SEEK_END); // For files opened in append mode, we start at the end of the file @@ -2387,6 +2408,14 @@ int FS_Close (qfile_t* file) if (close (file->handle)) return EOF; + if (file->filename) + { + if (file->flags & QFILE_FLAG_REMOVE) + remove(file->filename); + + Mem_Free((void *) file->filename); + } + if (file->ztk) { qz_inflateEnd (&file->ztk->zstream); @@ -2397,6 +2426,10 @@ int FS_Close (qfile_t* file) return 0; } +void FS_RemoveOnClose(qfile_t* file) +{ + file->flags |= QFILE_FLAG_REMOVE; +} /* ==================== @@ -2900,9 +2933,11 @@ FS_WriteFile The filename will be prefixed by the current game directory ============ */ -qboolean FS_WriteFile (const char *filename, void *data, fs_offset_t len) +qboolean FS_WriteFileInBlocks (const char *filename, const void *const *data, const fs_offset_t *len, size_t count) { qfile_t *file; + size_t i; + fs_offset_t lentotal; file = FS_OpenRealFile(filename, "wb", false); if (!file) @@ -2911,12 +2946,21 @@ qboolean FS_WriteFile (const char *filename, void *data, fs_offset_t len) return false; } - Con_DPrintf("FS_WriteFile: %s (%u bytes)\n", filename, (unsigned int)len); - FS_Write (file, data, len); + lentotal = 0; + for(i = 0; i < count; ++i) + lentotal += len[i]; + Con_DPrintf("FS_WriteFile: %s (%u bytes)\n", filename, (unsigned int)lentotal); + for(i = 0; i < count; ++i) + FS_Write (file, data[i], len[i]); FS_Close (file); return true; } +qboolean FS_WriteFile (const char *filename, const void *data, fs_offset_t len) +{ + return FS_WriteFileInBlocks(filename, &data, &len, 1); +} + /* =============================================================================