X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=52796a95418b38b25d39b7a0685524704faea3bd;hb=bd31e3b2322a06cd4c7e079f7bdb29a4863e61bd;hp=c9e6d565494550f0283ca713320c82f79e670b5f;hpb=30dfc144d33d1b0ac7a60a088bc9715fa17971da;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index c9e6d565..52796a95 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 }; @@ -1350,18 +1354,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 +1500,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]; @@ -1622,25 +1638,27 @@ 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 = 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)) { if(i >= args_left) break; - q = Mem_Alloc(fs_mempool, strlen(com_token) + 1); + 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 +1927,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 +1940,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 +2407,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 +2425,10 @@ int FS_Close (qfile_t* file) return 0; } +void FS_RemoveOnClose(qfile_t* file) +{ + file->flags |= QFILE_FLAG_REMOVE; +} /* ==================== @@ -2900,9 +2932,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 +2945,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); +} + /* =============================================================================