]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
fix compile error
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 538cf4376f7a4ac2c20a762b88d3cd0ad5a18ab2..a2f057c9b5aca4b1d803ca7d1cd49f140ec40217 100644 (file)
--- 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);
+}
+
 
 /*
 =============================================================================