X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=a2f057c9b5aca4b1d803ca7d1cd49f140ec40217;hb=f59bcc296e498a2b3851eed449c4de9df178e553;hp=538cf4376f7a4ac2c20a762b88d3cd0ad5a18ab2;hpb=c71853932342a49f005a07537d1694becf72de23;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 538cf437..a2f057c9 100644 --- a/fs.c +++ b/fs.c @@ -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 }; @@ -1622,13 +1626,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 +1643,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; } @@ -1922,6 +1928,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 +2395,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 +2413,10 @@ int FS_Close (qfile_t* file) return 0; } +void FS_RemoveOnClose(qfile_t* file) +{ + file->flags |= QFILE_FLAG_REMOVE; +} /* ==================== @@ -2900,9 +2920,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 +2933,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); +} + /* =============================================================================