Browse Source

filesystem: properly support compressed archives in FS_LoadFile

pull/2/head
Alibek Omarov 2 years ago
parent
commit
e791d44dd8
  1. 38
      filesystem/filesystem.c
  2. 10
      filesystem/filesystem_internal.h

38
filesystem/filesystem.c

@ -2265,34 +2265,42 @@ Always appends a 0 byte.
*/ */
byte *FS_LoadFile( const char *path, fs_offset_t *filesizeptr, qboolean gamedironly ) byte *FS_LoadFile( const char *path, fs_offset_t *filesizeptr, qboolean gamedironly )
{ {
file_t *file; searchpath_t *search;
byte *buf = NULL; file_t *file;
fs_offset_t filesize = 0; char netpath[MAX_SYSPATH];
int pack_ind;
if( !fs_searchpaths || FS_CheckNastyPath( path ))
return NULL;
search = FS_FindFile( path, &pack_ind, netpath, sizeof( netpath ), gamedironly );
if( !search )
return NULL;
// custom load file function for compressed files
if( search->pfnLoadFile )
return search->pfnLoadFile( search, netpath, pack_ind, filesizeptr );
file = FS_Open( path, "rb", gamedironly ); file = search->pfnOpenFile( search, netpath, "rb", pack_ind );
if( file ) if( file )
{ {
filesize = file->real_length; fs_offset_t filesize = file->real_length;
byte *buf;
buf = (byte *)Mem_Malloc( fs_mempool, filesize + 1 ); buf = (byte *)Mem_Malloc( fs_mempool, filesize + 1 );
buf[filesize] = '\0'; buf[filesize] = '\0';
FS_Read( file, buf, filesize ); FS_Read( file, buf, filesize );
FS_Close( file ); FS_Close( file );
}
else
{
buf = FS_LoadWADFile( path, &filesize, gamedironly );
if( !buf ) if( filesizeptr )
buf = FS_LoadZIPFile( path, &filesize, gamedironly ); *filesizeptr = filesize;
return buf;
} }
if( filesizeptr ) return NULL;
*filesizeptr = filesize;
return buf;
} }
qboolean CRC32_File( dword *crcvalue, const char *filename ) qboolean CRC32_File( dword *crcvalue, const char *filename )

10
filesystem/filesystem_internal.h

@ -90,6 +90,7 @@ typedef struct searchpath_s
int (*pfnFileTime)( struct searchpath_s *search, const char *filename ); int (*pfnFileTime)( struct searchpath_s *search, const char *filename );
int (*pfnFindFile)( struct searchpath_s *search, const char *path, char *fixedname, size_t len ); int (*pfnFindFile)( struct searchpath_s *search, const char *path, char *fixedname, size_t len );
void (*pfnSearch)( struct searchpath_s *search, stringlist_t *list, const char *pattern, int caseinsensitive ); void (*pfnSearch)( struct searchpath_s *search, stringlist_t *list, const char *pattern, int caseinsensitive );
byte *(*pfnLoadFile)( struct searchpath_s *search, const char *path, int pack_ind, fs_offset_t *filesize );
} searchpath_t; } searchpath_t;
extern fs_globals_t FI; extern fs_globals_t FI;
@ -196,20 +197,11 @@ qboolean FS_AddPak_Fullpath( const char *pakfile, qboolean *already_loaded, int
// //
// wad.c // wad.c
// //
byte *FS_LoadWADFile( const char *path, fs_offset_t *sizeptr, qboolean gamedironly );
qboolean FS_AddWad_Fullpath( const char *wadfile, qboolean *already_loaded, int flags ); qboolean FS_AddWad_Fullpath( const char *wadfile, qboolean *already_loaded, int flags );
//
// watch.c
//
qboolean FS_WatchInitialize( void );
int FS_AddWatch( const char *path, fs_event_callback_t callback );
void FS_WatchFrame( void );
// //
// zip.c // zip.c
// //
byte *FS_LoadZIPFile( const char *path, fs_offset_t *sizeptr, qboolean gamedironly );
qboolean FS_AddZip_Fullpath( const char *zipfile, qboolean *already_loaded, int flags ); qboolean FS_AddZip_Fullpath( const char *zipfile, qboolean *already_loaded, int flags );
// //

Loading…
Cancel
Save