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:
parent
7bb5175084
commit
52f9aad4d0
@ -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 );
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 );
|
||||||
|
Loading…
Reference in New Issue
Block a user