X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=1a071c2cc7d69d2f2122fd6f45531f0b0cad4eb1;hb=aa33d8f8642530f7f266d6cde1422f95aa74b2be;hp=98b12b58252437404ca694c34163324b56d6f8fb;hpb=1a7d8abc3f25b6c33757358a6e467a8683e2a6b0;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 98b12b58..1a071c2c 100644 --- a/fs.c +++ b/fs.c @@ -2,7 +2,6 @@ DarkPlaces file system Copyright (C) 2003-2005 Mathieu Olivier - Copyright (C) 1999,2000 contributors of the QuakeForge project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -44,6 +43,11 @@ # define O_BINARY 0 #endif +// In case the system doesn't support the O_NONBLOCK flag +#ifndef O_NONBLOCK +# define O_NONBLOCK 0 +#endif + /* @@ -90,7 +94,11 @@ CONSTANTS #define MAX_WBITS 15 #define Z_OK 0 #define Z_STREAM_END 1 -#define ZLIB_VERSION "1.1.4" +#define ZLIB_VERSION "1.2.3" + +// Uncomment the following line if the zlib DLL you have still uses +// the 1.1.x series calling convention on Win32 (WINAPI) +//#define ZLIB_USES_WINAPI /* @@ -127,12 +135,10 @@ typedef struct } z_stream; -typedef enum -{ - QFILE_FLAG_NONE = 0, - QFILE_FLAG_PACKED = (1 << 0), // inside a package (PAK or PK3) - QFILE_FLAG_DEFLATED = (1 << 1) // file is compressed using the deflate algorithm (PK3 only) -} qfile_flags_t; +// inside a package (PAK or PK3) +#define QFILE_FLAG_PACKED (1 << 0) +// file is compressed using the deflate algorithm (PK3 only) +#define QFILE_FLAG_DEFLATED (1 << 1) #define FILE_BUFF_SIZE 2048 typedef struct @@ -146,7 +152,7 @@ typedef struct struct qfile_s { - qfile_flags_t flags; + int flags; int handle; // file descriptor fs_offset_t real_length; // uncompressed file size (for files opened in "read" mode) fs_offset_t position; // current position in the file @@ -154,7 +160,7 @@ struct qfile_s int ungetc; // single stored character from ungetc, cleared to EOF when read // Contents buffer - size_t buff_ind, buff_len; // buffer current index and length + fs_offset_t buff_ind, buff_len; // buffer current index and length qbyte buff [FILE_BUFF_SIZE]; // For zipped files @@ -195,20 +201,18 @@ typedef struct // Packages in memory -typedef enum -{ - PACKFILE_FLAG_NONE = 0, - PACKFILE_FLAG_TRUEOFFS = (1 << 0), // the offset in packfile_t is the true contents offset - PACKFILE_FLAG_DEFLATED = (1 << 1) // file compressed using the deflate algorithm -} packfile_flags_t; +// the offset in packfile_t is the true contents offset +#define PACKFILE_FLAG_TRUEOFFS (1 << 0) +// file compressed using the deflate algorithm +#define PACKFILE_FLAG_DEFLATED (1 << 1) typedef struct { char name [MAX_QPATH]; - packfile_flags_t flags; - size_t offset; - size_t packsize; // size in the package - size_t realsize; // real file size (uncompressed) + int flags; + fs_offset_t offset; + fs_offset_t packsize; // size in the package + fs_offset_t realsize; // real file size (uncompressed) } packfile_t; typedef struct pack_s @@ -245,7 +249,7 @@ void FS_Ls_f(void); static packfile_t* FS_AddFileToPack (const char* name, pack_t* pack, fs_offset_t offset, fs_offset_t packsize, - fs_offset_t realsize, packfile_flags_t flags); + fs_offset_t realsize, int flags); /* @@ -271,6 +275,8 @@ char fs_basedir[MAX_OSPATH]; qboolean fs_modified; // set true if using non-id files +cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"}; + /* ============================================================================= @@ -281,7 +287,7 @@ PRIVATE FUNCTIONS - PK3 HANDLING */ // Functions exported from zlib -#ifdef WIN32 +#if defined(WIN32) && defined(ZLIB_USES_WINAPI) # define ZEXPORT WINAPI #else # define ZEXPORT @@ -332,8 +338,15 @@ qboolean PK3_OpenLibrary (void) { const char* dllnames [] = { -#ifdef WIN32 +#if defined(WIN64) + "zlib64.dll", +#elif defined(WIN32) +# ifdef ZLIB_USES_WINAPI + "zlibwapi.dll", "zlib.dll", +# else + "zlib1.dll", +# endif #elif defined(MACOSX) "libz.dylib", #else @@ -382,7 +395,7 @@ qboolean PK3_GetEndOfCentralDir (const char *packfile, int packhandle, pk3_endOf maxsize = filesize; else maxsize = ZIP_MAX_COMMENTS_SIZE + ZIP_END_CDIR_SIZE; - buffer = Mem_Alloc (tempmempool, maxsize); + buffer = (qbyte *)Mem_Alloc (tempmempool, maxsize); lseek (packhandle, filesize - maxsize, SEEK_SET); if (read (packhandle, buffer, maxsize) != (fs_offset_t) maxsize) { @@ -436,7 +449,7 @@ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd) fs_offset_t remaining; // Load the central directory in memory - central_dir = Mem_Alloc (tempmempool, eocd->cdir_size); + central_dir = (qbyte *)Mem_Alloc (tempmempool, eocd->cdir_size); lseek (pack->handle, eocd->cdir_offset, SEEK_SET); read (pack->handle, central_dir, eocd->cdir_size); @@ -486,7 +499,7 @@ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd) { char filename [sizeof (pack->files[0].name)]; fs_offset_t offset, packsize, realsize; - packfile_flags_t flags; + int flags; // Extract the name (strip it if necessary) namesize = min(namesize, (int)sizeof (filename) - 1); @@ -564,12 +577,12 @@ pack_t *FS_LoadPackPK3 (const char *packfile) #endif // Create a package structure in memory - pack = Mem_Alloc(fs_mempool, sizeof (pack_t)); + pack = (pack_t *)Mem_Alloc(fs_mempool, sizeof (pack_t)); pack->ignorecase = true; // PK3 ignores case strlcpy (pack->filename, packfile, sizeof (pack->filename)); pack->handle = packhandle; pack->numfiles = eocd.nbentries; - pack->files = Mem_Alloc(fs_mempool, eocd.nbentries * sizeof(packfile_t)); + pack->files = (packfile_t *)Mem_Alloc(fs_mempool, eocd.nbentries * sizeof(packfile_t)); pack->next = packlist; packlist = pack; @@ -638,7 +651,7 @@ Add a file to the list of files contained into a package */ static packfile_t* FS_AddFileToPack (const char* name, pack_t* pack, fs_offset_t offset, fs_offset_t packsize, - fs_offset_t realsize, packfile_flags_t flags) + fs_offset_t realsize, int flags) { int (*strcmp_funct) (const char* str1, const char* str2); int left, right, middle; @@ -775,16 +788,16 @@ pack_t *FS_LoadPackPAK (const char *packfile) return NULL; } - pack = Mem_Alloc(fs_mempool, sizeof (pack_t)); + pack = (pack_t *)Mem_Alloc(fs_mempool, sizeof (pack_t)); pack->ignorecase = false; // PAK is case sensitive strlcpy (pack->filename, packfile, sizeof (pack->filename)); pack->handle = packhandle; pack->numfiles = 0; - pack->files = Mem_Alloc(fs_mempool, numpackfiles * sizeof(packfile_t)); + pack->files = (packfile_t *)Mem_Alloc(fs_mempool, numpackfiles * sizeof(packfile_t)); pack->next = packlist; packlist = pack; - info = Mem_Alloc(tempmempool, sizeof(*info) * numpackfiles); + info = (dpackfile_t *)Mem_Alloc(tempmempool, sizeof(*info) * numpackfiles); lseek (packhandle, header.dirofs, SEEK_SET); read (packhandle, (void *)info, header.dirlen); @@ -832,7 +845,7 @@ void FS_AddGameDirectory (const char *dir) pak = FS_LoadPackPAK (pakfile); if (pak) { - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); search->pack = pak; search->next = fs_searchpaths; fs_searchpaths = search; @@ -851,7 +864,7 @@ void FS_AddGameDirectory (const char *dir) pak = FS_LoadPackPK3 (pakfile); if (pak) { - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); search->pack = pak; search->next = fs_searchpaths; fs_searchpaths = search; @@ -864,7 +877,7 @@ void FS_AddGameDirectory (const char *dir) // Add the directory to the search path // (unpacked files have the priority over packed files) - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); strlcpy (search->filename, dir, sizeof (search->filename)); search->next = fs_searchpaths; fs_searchpaths = search; @@ -939,7 +952,7 @@ void FS_Init (void) if (strstr(com_argv[0], ".app/")) { char *split; - char temp[4096]; + split = strstr(com_argv[0], ".app/"); while (split > com_argv[0] && *split != '/') split--; @@ -974,7 +987,7 @@ void FS_Init (void) if (!com_argv[i] || com_argv[i][0] == '+' || com_argv[i][0] == '-') break; - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); if (!strcasecmp (FS_FileExtension(com_argv[i]), "pak")) { search->pack = FS_LoadPackPAK (com_argv[i]); @@ -1113,12 +1126,10 @@ static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean non } } -#ifndef WIN32 if (nonblocking) opt |= O_NONBLOCK; -#endif - file = Mem_Alloc (fs_mempool, sizeof (*file)); + file = (qfile_t *)Mem_Alloc (fs_mempool, sizeof (*file)); memset (file, 0, sizeof (*file)); file->ungetc = EOF; @@ -1188,7 +1199,7 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) return NULL; } - file = Mem_Alloc (fs_mempool, sizeof (*file)); + file = (qfile_t *)Mem_Alloc (fs_mempool, sizeof (*file)); memset (file, 0, sizeof (*file)); file->handle = dup_handle; file->flags = QFILE_FLAG_PACKED; @@ -1204,7 +1215,7 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) file->flags |= QFILE_FLAG_DEFLATED; // We need some more variables - ztk = Mem_Alloc (fs_mempool, sizeof (*ztk)); + ztk = (ztoolkit_t *)Mem_Alloc (fs_mempool, sizeof (*ztk)); ztk->comp_length = pfile->packsize; @@ -1489,7 +1500,7 @@ fs_offset_t FS_Write (qfile_t* file, const void* data, size_t datasize) FS_Purge (file); // Write the buffer and update the position - result = write (file->handle, data, datasize); + result = write (file->handle, data, (fs_offset_t)datasize); file->position = lseek (file->handle, 0, SEEK_CUR); if (file->real_length < file->position) file->real_length = file->position; @@ -1545,7 +1556,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) // If the file isn't compressed if (! (file->flags & QFILE_FLAG_DEFLATED)) { - int nb; + fs_offset_t nb; // We must take care to not read after the end of the file count = file->real_length - file->position; @@ -1578,7 +1589,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) file->position += nb; // Copy the requested data in "buffer" (as much as we can) - count = (buffersize > file->buff_len) ? file->buff_len : buffersize; + count = (fs_offset_t)buffersize > file->buff_len ? file->buff_len : (fs_offset_t)buffersize; memcpy (&((qbyte*)buffer)[done], file->buff, count); file->buff_ind = count; done += count; @@ -1604,11 +1615,11 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) if (file->position == file->real_length) return done; - count = ztk->comp_length - ztk->in_position; + count = (fs_offset_t)(ztk->comp_length - ztk->in_position); if (count > (fs_offset_t)sizeof (ztk->input)) count = (fs_offset_t)sizeof (ztk->input); - lseek (file->handle, file->offset + ztk->in_position, SEEK_SET); - if (read (file->handle, ztk->input, count) != (fs_offset_t)count) + lseek (file->handle, file->offset + (fs_offset_t)ztk->in_position, SEEK_SET); + if (read (file->handle, ztk->input, count) != count) { Con_Printf ("FS_Read: unexpected end of file"); break; @@ -1638,11 +1649,11 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) } ztk->in_ind = ztk->in_len - ztk->zstream.avail_in; - file->buff_len = sizeof (file->buff) - ztk->zstream.avail_out; + file->buff_len = (fs_offset_t)sizeof (file->buff) - ztk->zstream.avail_out; file->position += file->buff_len; // Copy the requested data in "buffer" (as much as we can) - count = (buffersize > file->buff_len) ? file->buff_len : buffersize; + count = (fs_offset_t)buffersize > file->buff_len ? file->buff_len : (fs_offset_t)buffersize; memcpy (&((qbyte*)buffer)[done], file->buff, count); file->buff_ind = count; } @@ -1661,7 +1672,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) ztk->in_ind = ztk->in_len - ztk->zstream.avail_in; // How much data did it inflate? - count = buffersize - ztk->zstream.avail_out; + count = (fs_offset_t)(buffersize - ztk->zstream.avail_out); file->position += count; // Purge cached data @@ -1722,13 +1733,13 @@ int FS_VPrintf (qfile_t* file, const char* format, va_list ap) char *tempbuff = NULL; buff_size = 1024; - tempbuff = Mem_Alloc (tempmempool, buff_size); + tempbuff = (char *)Mem_Alloc (tempmempool, buff_size); len = dpvsnprintf (tempbuff, buff_size, format, ap); while (len < 0) { Mem_Free (tempbuff); buff_size *= 2; - tempbuff = Mem_Alloc (tempmempool, buff_size); + tempbuff = (char *)Mem_Alloc (tempmempool, buff_size); len = dpvsnprintf (tempbuff, buff_size, format, ap); } @@ -1792,14 +1803,14 @@ int FS_Seek (qfile_t* file, fs_offset_t offset, int whence) switch (whence) { case SEEK_CUR: - offset += (long)(file->position - file->buff_len + file->buff_ind); + offset += file->position - file->buff_len + file->buff_ind; break; case SEEK_SET: break; case SEEK_END: - offset += (long)file->real_length; + offset += file->real_length; break; default: @@ -1809,8 +1820,7 @@ int FS_Seek (qfile_t* file, fs_offset_t offset, int whence) return -1; // If we have the data in our read buffer, we don't need to actually seek - if (file->position - (fs_offset_t)file->buff_len <= offset - && offset <= file->position) + if (file->position - file->buff_len <= offset && offset <= file->position) { file->buff_ind = offset + file->buff_len - file->position; return 0; @@ -1849,7 +1859,7 @@ int FS_Seek (qfile_t* file, fs_offset_t offset, int whence) // We need a big buffer to force inflating into it directly buffersize = 2 * sizeof (file->buff); - buffer = Mem_Alloc (tempmempool, buffersize); + buffer = (qbyte *)Mem_Alloc (tempmempool, buffersize); // Skip all data until we reach the requested offset while (offset > file->position) @@ -1916,7 +1926,7 @@ qbyte *FS_LoadFile (const char *path, mempool_t *pool, qboolean quiet) if (!file) return NULL; - buf = Mem_Alloc (pool, fs_filesize + 1); + buf = (qbyte *)Mem_Alloc (pool, fs_filesize + 1); buf[fs_filesize] = '\0'; FS_Read (file, buf, fs_filesize); @@ -2100,7 +2110,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) separator = max(slash, backslash); separator = max(separator, colon); basepathlength = separator ? (separator + 1 - pattern) : 0; - basepath = Mem_Alloc (tempmempool, basepathlength + 1); + basepath = (char *)Mem_Alloc (tempmempool, basepathlength + 1); if (basepathlength) memcpy(basepath, pattern, basepathlength); basepath[basepathlength] = 0; @@ -2187,7 +2197,7 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet) numfiles++; numchars += (int)strlen(listtemp->text) + 1; } - search = Z_Malloc(sizeof(fssearch_t) + numchars + numfiles * sizeof(char *)); + search = (fssearch_t *)Z_Malloc(sizeof(fssearch_t) + numchars + numfiles * sizeof(char *)); search->filenames = (char **)((char *)search + sizeof(fssearch_t)); search->filenamesbuffer = (char *)((char *)search + sizeof(fssearch_t) + numfiles * sizeof(char *)); search->numfilenames = (int)numfiles;