X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=fs.c;h=58c5ed0a0ab763c3aca028185f94c3306c7b5e30;hb=fc39109e7d165c83de276dbd5e9fcbbdfcd12c3d;hp=67ffa9fd2cf34056a3a3eb8e6113ac48edcfcb8f;hpb=f9d8bc7ea04ff91fcbd90fe50a299b37724b349b;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 67ffa9fd..58c5ed0a 100644 --- a/fs.c +++ b/fs.c @@ -114,11 +114,11 @@ TYPES // been cast to "void*" for a matter of simplicity typedef struct { - qbyte *next_in; // next input byte + unsigned char *next_in; // next input byte unsigned int avail_in; // number of bytes available at next_in unsigned long total_in; // total nb of input bytes read so far - qbyte *next_out; // next output byte should be put there + unsigned char *next_out; // next output byte should be put there unsigned int avail_out; // remaining free space at next_out unsigned long total_out; // total nb of bytes output so far @@ -147,7 +147,7 @@ typedef struct size_t comp_length; // length of the compressed file size_t in_ind, in_len; // input buffer current index and length size_t in_position; // position in the compressed file - qbyte input [FILE_BUFF_SIZE]; + unsigned char input [FILE_BUFF_SIZE]; } ztoolkit_t; struct qfile_s @@ -161,7 +161,7 @@ struct qfile_s // Contents buffer fs_offset_t buff_ind, buff_len; // buffer current index and length - qbyte buff [FILE_BUFF_SIZE]; + unsigned char buff [FILE_BUFF_SIZE]; // For zipped files ztoolkit_t* ztk; @@ -262,8 +262,6 @@ VARIABLES mempool_t *fs_mempool; -fs_offset_t fs_filesize; - pack_t *packlist = NULL; searchpath_t *fs_searchpaths = NULL; @@ -275,7 +273,7 @@ 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"}; +cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp", "prefix name for saved screenshots (changes based on -game commandline, as well as which game mode is running)"}; /* @@ -381,8 +379,8 @@ Extract the end of the central directory from a PK3 package */ qboolean PK3_GetEndOfCentralDir (const char *packfile, int packhandle, pk3_endOfCentralDir_t *eocd) { - long filesize, maxsize; - qbyte *buffer, *ptr; + fs_offset_t filesize, maxsize; + unsigned char *buffer, *ptr; int ind; // Get the package size @@ -395,7 +393,7 @@ qboolean PK3_GetEndOfCentralDir (const char *packfile, int packhandle, pk3_endOf maxsize = filesize; else maxsize = ZIP_MAX_COMMENTS_SIZE + ZIP_END_CDIR_SIZE; - buffer = (qbyte *)Mem_Alloc (tempmempool, maxsize); + buffer = (unsigned char *)Mem_Alloc (tempmempool, maxsize); lseek (packhandle, filesize - maxsize, SEEK_SET); if (read (packhandle, buffer, maxsize) != (fs_offset_t) maxsize) { @@ -444,12 +442,12 @@ Extract the file list from a PK3 file */ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd) { - qbyte *central_dir, *ptr; + unsigned char *central_dir, *ptr; unsigned int ind; fs_offset_t remaining; // Load the central directory in memory - central_dir = (qbyte *)Mem_Alloc (tempmempool, eocd->cdir_size); + central_dir = (unsigned char *)Mem_Alloc (tempmempool, eocd->cdir_size); lseek (pack->handle, eocd->cdir_offset, SEEK_SET); read (pack->handle, central_dir, eocd->cdir_size); @@ -552,7 +550,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile) if (! PK3_GetEndOfCentralDir (packfile, packhandle, &eocd)) { - Con_Printf ("%s is not a PK3 file", packfile); + Con_Printf ("%s is not a PK3 file\n", packfile); close(packhandle); return NULL; } @@ -560,7 +558,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile) // Multi-volume ZIP archives are NOT allowed if (eocd.disknum != 0 || eocd.cdir_disknum != 0) { - Con_Printf ("%s is a multi-volume ZIP archive", packfile); + Con_Printf ("%s is a multi-volume ZIP archive\n", packfile); close(packhandle); return NULL; } @@ -570,7 +568,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile) #if MAX_FILES_IN_PACK < 65535 if (eocd.nbentries > MAX_FILES_IN_PACK) { - Con_Printf ("%s contains too many files (%hu)", packfile, eocd.nbentries); + Con_Printf ("%s contains too many files (%hu)\n", packfile, eocd.nbentries); close(packhandle); return NULL; } @@ -589,7 +587,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile) real_nb_files = PK3_BuildFileList (pack, &eocd); if (real_nb_files < 0) { - Con_Printf ("%s is not a valid PK3 file", packfile); + Con_Printf ("%s is not a valid PK3 file\n", packfile); close(pack->handle); Mem_Free(pack); return NULL; @@ -609,7 +607,7 @@ Find where the true file data offset is */ qboolean PK3_GetTrueFileOffset (packfile_t *pfile, pack_t *pack) { - qbyte buffer [ZIP_LOCAL_CHUNK_BASE_SIZE]; + unsigned char buffer [ZIP_LOCAL_CHUNK_BASE_SIZE]; fs_offset_t count; // Already found? @@ -621,7 +619,7 @@ qboolean PK3_GetTrueFileOffset (packfile_t *pfile, pack_t *pack) count = read (pack->handle, buffer, ZIP_LOCAL_CHUNK_BASE_SIZE); if (count != ZIP_LOCAL_CHUNK_BASE_SIZE || BuffBigLong (buffer) != ZIP_DATA_HEADER) { - Con_Printf ("Can't retrieve file %s in package %s", pfile->name, pack->filename); + Con_Printf ("Can't retrieve file %s in package %s\n", pfile->name, pack->filename); return false; } @@ -765,7 +763,7 @@ pack_t *FS_LoadPackPAK (const char *packfile) read (packhandle, (void *)&header, sizeof(header)); if (memcmp(header.id, "PACK", 4)) { - Con_Printf ("%s is not a packfile", packfile); + Con_Printf ("%s is not a packfile\n", packfile); close(packhandle); return NULL; } @@ -774,7 +772,7 @@ pack_t *FS_LoadPackPAK (const char *packfile) if (header.dirlen % sizeof(dpackfile_t)) { - Con_Printf ("%s has an invalid directory size", packfile); + Con_Printf ("%s has an invalid directory size\n", packfile); close(packhandle); return NULL; } @@ -783,7 +781,7 @@ pack_t *FS_LoadPackPAK (const char *packfile) if (numpackfiles > MAX_FILES_IN_PACK) { - Con_Printf ("%s has %i files", packfile, numpackfiles); + Con_Printf ("%s has %i files\n", packfile, numpackfiles); close(packhandle); return NULL; } @@ -896,7 +894,7 @@ void FS_AddGameHierarchy (const char *dir) #endif // Add the common game directory - FS_AddGameDirectory (va("%s/%s/", fs_basedir, dir)); + FS_AddGameDirectory (va("%s%s/", fs_basedir, dir)); #ifndef WIN32 // Add the personal game directory @@ -944,7 +942,7 @@ void FS_Init (void) fs_mempool = Mem_AllocPool("file management", 0, NULL); - strcpy(fs_basedir, "."); + strcpy(fs_basedir, ""); strcpy(fs_gamedir, ""); #ifdef MACOSX @@ -975,6 +973,10 @@ void FS_Init (void) fs_basedir[i-1] = 0; } + // add a path separator to the end of the basedir if it lacks one + if (fs_basedir[0] && fs_basedir[strlen(fs_basedir) - 1] != '/' && fs_basedir[strlen(fs_basedir) - 1] != '\\') + strlcat(fs_basedir, "/", sizeof(fs_basedir)); + // -path [] ... // Fully specifies the exact search path, overriding the generated one // COMMANDLINEOPTION: Filesystem: -path specifies the full search path manually, overriding the generated one, example: -path c:\quake\id1 c:\quake\pak0.pak c:\quake\pak1.pak (not recommended) @@ -993,7 +995,7 @@ void FS_Init (void) search->pack = FS_LoadPackPAK (com_argv[i]); if (!search->pack) { - Con_Printf ("Couldn't load packfile: %s", com_argv[i]); + Con_Printf ("Couldn't load packfile: %s\n", com_argv[i]); Mem_Free(search); continue; } @@ -1003,7 +1005,7 @@ void FS_Init (void) search->pack = FS_LoadPackPK3 (com_argv[i]); if (!search->pack) { - Con_Printf ("Couldn't load packfile: %s", com_argv[i]); + Con_Printf ("Couldn't load packfile: %s\n", com_argv[i]); Mem_Free(search); continue; } @@ -1056,9 +1058,9 @@ void FS_Init_Commands(void) { Cvar_RegisterVariable (&scr_screenshot_name); - Cmd_AddCommand ("path", FS_Path_f); - Cmd_AddCommand ("dir", FS_Dir_f); - Cmd_AddCommand ("ls", FS_Ls_f); + Cmd_AddCommand ("path", FS_Path_f, "print searchpath (game directories and archives)"); + Cmd_AddCommand ("dir", FS_Dir_f, "list files in searchpath matching an * filename pattern, one per line"); + Cmd_AddCommand ("ls", FS_Ls_f, "list files in searchpath matching an * filename pattern, multiple per line"); // set the default screenshot name to either the mod name or the // gamemode screenshot name @@ -1167,8 +1169,6 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) pfile = &pack->files[pack_ind]; - fs_filesize = 0; - // If we don't have the true offset, get it now if (! (pfile->flags & PACKFILE_FLAG_TRUEOFFS)) if (!PK3_GetTrueFileOffset (pfile, pack)) @@ -1187,7 +1187,7 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) // the dup() call to avoid having to close the dup_handle on error here if (lseek (pack->handle, pfile->offset, SEEK_SET) == -1) { - Con_Printf ("FS_OpenPackedFile: can't lseek to %s in %s (offset: %d)", + Con_Printf ("FS_OpenPackedFile: can't lseek to %s in %s (offset: %d)\n", pfile->name, pack->filename, pfile->offset); return NULL; } @@ -1195,7 +1195,7 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) dup_handle = dup (pack->handle); if (dup_handle < 0) { - Con_Printf ("FS_OpenPackedFile: can't dup package's handle (pack: %s)", pack->filename); + Con_Printf ("FS_OpenPackedFile: can't dup package's handle (pack: %s)\n", pack->filename); return NULL; } @@ -1234,7 +1234,7 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) */ if (qz_inflateInit2 (&ztk->zstream, -MAX_WBITS) != Z_OK) { - Con_Printf ("FS_OpenPackedFile: inflate init error (file: %s)", pfile->name); + Con_Printf ("FS_OpenPackedFile: inflate init error (file: %s)\n", pfile->name); close(dup_handle); Mem_Free(file); return NULL; @@ -1246,8 +1246,6 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind) file->ztk = ztk; } - fs_filesize = pfile->realsize; - return file; } @@ -1333,8 +1331,8 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet) // Found it if (!diff) { - if (!quiet) - Con_DPrintf("FS_FindFile: %s in %s\n", + if (!quiet && developer.integer >= 10) + Con_Printf("FS_FindFile: %s in %s\n", pak->files[middle].name, pak->filename); if (index != NULL) @@ -1355,8 +1353,8 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet) dpsnprintf(netpath, sizeof(netpath), "%s%s", search->filename, name); if (FS_SysFileExists (netpath)) { - if (!quiet) - Con_DPrintf("FS_FindFile: %s\n", netpath); + if (!quiet && developer.integer >= 10) + Con_Printf("FS_FindFile: %s\n", netpath); if (index != NULL) *index = -1; @@ -1365,8 +1363,8 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet) } } - if (!quiet) - Con_DPrintf("FS_FindFile: can't find %s\n", name); + if (!quiet && developer.integer >= 10) + Con_Printf("FS_FindFile: can't find %s\n", name); if (index != NULL) *index = -1; @@ -1379,8 +1377,6 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet) FS_OpenReadFile Look for a file in the search paths and open it in read-only mode - -Sets fs_filesize =========== */ qfile_t *FS_OpenReadFile (const char *filename, qboolean quiet, qboolean nonblocking) @@ -1392,10 +1388,7 @@ qfile_t *FS_OpenReadFile (const char *filename, qboolean quiet, qboolean nonbloc // Not found? if (search == NULL) - { - fs_filesize = 0; return NULL; - } // Found in the filesystem? if (pack_ind < 0) @@ -1427,8 +1420,6 @@ Open a file. The syntax is the same as fopen */ qfile_t* FS_Open (const char* filepath, const char* mode, qboolean quiet, qboolean nonblocking) { - qfile_t* file; - if (FS_CheckNastyPath(filepath)) { Con_Printf("FS_Open(\"%s\", \"%s\", %s): nasty filename rejected\n", filepath, mode, quiet ? "true" : "false"); @@ -1441,20 +1432,16 @@ qfile_t* FS_Open (const char* filepath, const char* mode, qboolean quiet, qboole char real_path [MAX_OSPATH]; // Open the file on disk directly - dpsnprintf (real_path, sizeof (real_path), "%s%s", fs_gamedir, filepath); + dpsnprintf (real_path, sizeof (real_path), "%s/%s", fs_gamedir, filepath); // Create directories up to the file FS_CreatePath (real_path); return FS_SysOpen (real_path, mode, nonblocking); } - // Else, we look at the various search paths and open the file in read-only mode - file = FS_OpenReadFile (filepath, quiet, nonblocking); - if (file != NULL) - fs_filesize = file->real_length; - - return file; + else + return FS_OpenReadFile (filepath, quiet, nonblocking); } @@ -1567,7 +1554,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) if (count > (fs_offset_t)buffersize) count = (fs_offset_t)buffersize; lseek (file->handle, file->offset + file->position, SEEK_SET); - nb = read (file->handle, &((qbyte*)buffer)[done], count); + nb = read (file->handle, &((unsigned char*)buffer)[done], count); if (nb > 0) { done += nb; @@ -1590,7 +1577,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) // Copy the requested data in "buffer" (as much as we can) count = (fs_offset_t)buffersize > file->buff_len ? file->buff_len : (fs_offset_t)buffersize; - memcpy (&((qbyte*)buffer)[done], file->buff, count); + memcpy (&((unsigned char*)buffer)[done], file->buff, count); file->buff_ind = count; done += count; } @@ -1621,7 +1608,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) 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"); + Con_Printf ("FS_Read: unexpected end of file\n"); break; } @@ -1644,7 +1631,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) error = qz_inflate (&ztk->zstream, Z_SYNC_FLUSH); if (error != Z_OK && error != Z_STREAM_END) { - Con_Printf ("FS_Read: Can't inflate file"); + Con_Printf ("FS_Read: Can't inflate file\n"); break; } ztk->in_ind = ztk->in_len - ztk->zstream.avail_in; @@ -1654,19 +1641,19 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize) // Copy the requested data in "buffer" (as much as we can) count = (fs_offset_t)buffersize > file->buff_len ? file->buff_len : (fs_offset_t)buffersize; - memcpy (&((qbyte*)buffer)[done], file->buff, count); + memcpy (&((unsigned char*)buffer)[done], file->buff, count); file->buff_ind = count; } // Else, we inflate directly in "buffer" else { - ztk->zstream.next_out = &((qbyte*)buffer)[done]; + ztk->zstream.next_out = &((unsigned char*)buffer)[done]; ztk->zstream.avail_out = (unsigned int)buffersize; error = qz_inflate (&ztk->zstream, Z_SYNC_FLUSH); if (error != Z_OK && error != Z_STREAM_END) { - Con_Printf ("FS_Read: Can't inflate file"); + Con_Printf ("FS_Read: Can't inflate file\n"); break; } ztk->in_ind = ztk->in_len - ztk->zstream.avail_in; @@ -1729,18 +1716,17 @@ Print a string into a file int FS_VPrintf (qfile_t* file, const char* format, va_list ap) { int len; - fs_offset_t buff_size; - char *tempbuff = NULL; + fs_offset_t buff_size = MAX_INPUTLINE; + char *tempbuff; - buff_size = 1024; - tempbuff = (char *)Mem_Alloc (tempmempool, buff_size); - len = dpvsnprintf (tempbuff, buff_size, format, ap); - while (len < 0) + for (;;) { - Mem_Free (tempbuff); - buff_size *= 2; tempbuff = (char *)Mem_Alloc (tempmempool, buff_size); len = dpvsnprintf (tempbuff, buff_size, format, ap); + if (len >= 0 && len < buff_size) + break; + Mem_Free (tempbuff); + buff_size *= 2; } len = write (file->handle, tempbuff, len); @@ -1796,7 +1782,7 @@ Move the position index in a file int FS_Seek (qfile_t* file, fs_offset_t offset, int whence) { ztoolkit_t *ztk; - qbyte* buffer; + unsigned char* buffer; fs_offset_t buffersize; // Compute the file offset @@ -1859,7 +1845,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 = (qbyte *)Mem_Alloc (tempmempool, buffersize); + buffer = (unsigned char *)Mem_Alloc (tempmempool, buffersize); // Skip all data until we reach the requested offset while (offset > file->position) @@ -1917,21 +1903,24 @@ Filename are relative to the quake directory. Always appends a 0 byte. ============ */ -qbyte *FS_LoadFile (const char *path, mempool_t *pool, qboolean quiet) +unsigned char *FS_LoadFile (const char *path, mempool_t *pool, qboolean quiet, fs_offset_t *filesizepointer) { qfile_t *file; - qbyte *buf; + unsigned char *buf = NULL; + fs_offset_t filesize = 0; file = FS_Open (path, "rb", quiet, false); - if (!file) - return NULL; - - buf = (qbyte *)Mem_Alloc (pool, fs_filesize + 1); - buf[fs_filesize] = '\0'; - - FS_Read (file, buf, fs_filesize); - FS_Close (file); + if (file) + { + filesize = file->real_length; + buf = (unsigned char *)Mem_Alloc (pool, filesize + 1); + buf[filesize] = '\0'; + FS_Read (file, buf, filesize); + FS_Close (file); + } + if (filesizepointer) + *filesizepointer = filesize; return buf; } @@ -2233,7 +2222,7 @@ int FS_ListDirectory(const char *pattern, int oneperline) int linebufpos; int i, j, k, l; const char *name; - char linebuf[4096]; + char linebuf[MAX_INPUTLINE]; fssearch_t *search; search = FS_Search(pattern, true, true); if (!search)