2
0
mirror of https://github.com/FWGS/xash3d-fwgs synced 2024-11-22 09:56:22 +01:00

filesystem: add new call to fs_stdio C API to check whether we support that archive format

This commit is contained in:
Alibek Omarov 2024-07-30 02:03:15 +03:00
parent 7bb5175084
commit 52f9aad4d0
4 changed files with 47 additions and 18 deletions

View File

@ -61,10 +61,10 @@ static char fs_gamedir[MAX_SYSPATH]; // game current directory
// so raw WADs takes precedence over WADs included into PAKs and PK3s // so raw WADs takes precedence over WADs included into PAKs and PK3s
const fs_archive_t g_archives[] = const fs_archive_t g_archives[] =
{ {
{ "pak", SEARCHPATH_PAK, FS_AddPak_Fullpath, true }, { "pak", SEARCHPATH_PAK, FS_AddPak_Fullpath, true, true },
{ "pk3", SEARCHPATH_ZIP, FS_AddZip_Fullpath, true }, { "pk3", SEARCHPATH_ZIP, FS_AddZip_Fullpath, true, true },
{ "pk3dir", SEARCHPATH_PK3DIR, FS_AddDir_Fullpath, true }, { "pk3dir", SEARCHPATH_PK3DIR, FS_AddDir_Fullpath, true, false },
{ "wad", SEARCHPATH_WAD, FS_AddWad_Fullpath, false }, { "wad", SEARCHPATH_WAD, FS_AddWad_Fullpath, false, true },
{ NULL }, // end marker { NULL }, // end marker
}; };
@ -2653,19 +2653,9 @@ return NULL for file in pack
const char *FS_GetDiskPath( const char *name, qboolean gamedironly ) const char *FS_GetDiskPath( const char *name, qboolean gamedironly )
{ {
static char diskpath[MAX_SYSPATH]; static char diskpath[MAX_SYSPATH];
char fullpath[MAX_SYSPATH];
searchpath_t *search;
search = FS_FindFile( name, NULL, fullpath, sizeof( fullpath ), gamedironly ); if( FS_GetFullDiskPath( diskpath, sizeof( diskpath ), name, gamedironly ))
if( search )
{
if( search->type != SEARCHPATH_PLAIN ) // file in pack or wad
return NULL;
Q_snprintf( diskpath, sizeof( diskpath ), "%s/%s", search->filename, fullpath );
return diskpath; return diskpath;
}
return NULL; return NULL;
} }
@ -2687,7 +2677,7 @@ qboolean FS_GetFullDiskPath( char *buffer, size_t size, const char *name, qboole
if( search && search->type == SEARCHPATH_PLAIN ) if( search && search->type == SEARCHPATH_PLAIN )
{ {
Q_snprintf( buffer, size, "%s/%s", search->filename, temp ); Q_snprintf( buffer, size, "%s%s", search->filename, temp );
return true; return true;
} }
@ -2931,6 +2921,25 @@ static const char *FS_ArchivePath( file_t *f )
return "plain"; return "plain";
} }
static qboolean FS_IsArchiveExtensionSupported( const char *ext, uint flags )
{
int i;
if( ext == NULL )
return false;
for( i = 0; i < ( sizeof( g_archives ) / sizeof( g_archives[0] )) - 1; i++ )
{
if( FBitSet( flags, IAES_ONLY_REAL_ARCHIVES ) && !g_archives[i].real_archive )
continue;
if( !Q_stricmp( ext, g_archives[i].ext ))
return true;
}
return false;
}
void FS_InitMemory( void ) void FS_InitMemory( void )
{ {
fs_mempool = Mem_AllocPool( "FileSystem Pool" ); fs_mempool = Mem_AllocPool( "FileSystem Pool" );
@ -3059,6 +3068,8 @@ const fs_api_t g_api =
FS_GetFullDiskPath, FS_GetFullDiskPath,
FS_LoadFileMalloc, FS_LoadFileMalloc,
FS_IsArchiveExtensionSupported,
}; };
int EXPORT GetFSAPI( int version, fs_api_t *api, fs_globals_t **globals, fs_interface_t *engfuncs ); int EXPORT GetFSAPI( int version, fs_api_t *api, fs_globals_t **globals, fs_interface_t *engfuncs );

View File

@ -50,6 +50,13 @@ enum
FS_GAMEDIRONLY_SEARCH_FLAGS = FS_GAMEDIR_PATH | FS_CUSTOM_PATH | FS_GAMERODIR_PATH FS_GAMEDIRONLY_SEARCH_FLAGS = FS_GAMEDIR_PATH | FS_CUSTOM_PATH | FS_GAMERODIR_PATH
}; };
// IsArchiveExtensionSupported flags
enum
{
// excludes directories and pk3dir, i.e. archives that cannot be represented as a single file
IAES_ONLY_REAL_ARCHIVES = BIT( 0 ),
};
typedef struct typedef struct
{ {
int numfilenames; int numfilenames;
@ -135,8 +142,6 @@ typedef struct fs_globals_t
int numgames; int numgames;
} fs_globals_t; } fs_globals_t;
typedef void (*fs_event_callback_t)( const char *path );
typedef struct fs_api_t typedef struct fs_api_t
{ {
qboolean (*InitStdio)( qboolean unused_set_to_true, const char *rootdir, const char *basedir, const char *gamedir, const char *rodir ); qboolean (*InitStdio)( qboolean unused_set_to_true, const char *rootdir, const char *basedir, const char *gamedir, const char *rodir );
@ -199,6 +204,9 @@ typedef struct fs_api_t
// like LoadFile but returns pointer that can be free'd using standard library function // like LoadFile but returns pointer that can be free'd using standard library function
byte *(*LoadFileMalloc)( const char *path, fs_offset_t *filesizeptr, qboolean gamedironly ); byte *(*LoadFileMalloc)( const char *path, fs_offset_t *filesizeptr, qboolean gamedironly );
// queries supported archive formats
qboolean (*IsArchiveExtensionSupported)( const char *ext, uint flags );
} fs_api_t; } fs_api_t;
typedef struct fs_interface_t typedef struct fs_interface_t

View File

@ -114,6 +114,7 @@ typedef struct fs_archive_s
int type; int type;
FS_ADDARCHIVE_FULLPATH pfnAddArchive_Fullpath; FS_ADDARCHIVE_FULLPATH pfnAddArchive_Fullpath;
qboolean load_wads; // load wads from this archive qboolean load_wads; // load wads from this archive
qboolean real_archive;
} fs_archive_t; } fs_archive_t;
extern fs_globals_t FI; extern fs_globals_t FI;

View File

@ -57,6 +57,15 @@ static int TestNoInit( void )
p = g_fs.LoadDirectFile( "hehe", NULL ); p = g_fs.LoadDirectFile( "hehe", NULL );
if( p ) free( p ); if( p ) free( p );
if( !g_fs.IsArchiveExtensionSupported( "pk3", 0 )) return 0;
if( !g_fs.IsArchiveExtensionSupported( "wad", 0 )) return 0;
if( !g_fs.IsArchiveExtensionSupported( "pak", 0 )) return 0;
if( !g_fs.IsArchiveExtensionSupported( "pk3dir", 0 )) return 0;
if( !g_fs.IsArchiveExtensionSupported( "pk3", IAES_ONLY_REAL_ARCHIVES )) return 0;
if( g_fs.IsArchiveExtensionSupported( "pk3dir", IAES_ONLY_REAL_ARCHIVES )) return 0;
if( g_fs.IsArchiveExtensionSupported( "vpk", 0)) return 0;
g_fs.FileExists( "asdcv", 0 ); g_fs.FileExists( "asdcv", 0 );
g_fs.FileTime( "zxcasdfd", 0 ); g_fs.FileTime( "zxcasdfd", 0 );
g_fs.FileSize( "asdqwe", 1 ); g_fs.FileSize( "asdqwe", 1 );