mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-29 16:24:16 +00:00
filesystem: remove excessive filename field from archive structs, use common in searchpath_t. Small optimizations for PAK
This commit is contained in:
parent
f1ec612819
commit
9397301a73
@ -65,54 +65,23 @@ typedef struct
|
|||||||
|
|
||||||
struct pack_s
|
struct pack_s
|
||||||
{
|
{
|
||||||
string filename;
|
|
||||||
int handle;
|
int handle;
|
||||||
int numfiles;
|
int numfiles;
|
||||||
time_t filetime; // common for all packed files
|
time_t filetime; // common for all packed files
|
||||||
dpackfile_t *files;
|
dpackfile_t files[1]; // flexible
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
FS_AddFileToPack
|
FS_SortPak
|
||||||
|
|
||||||
Add a file to the list of files contained into a package
|
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
static dpackfile_t *FS_AddFileToPack( const char *name, pack_t *pack, fs_offset_t offset, fs_offset_t size )
|
static int FS_SortPak( const void *_a, const void *_b )
|
||||||
{
|
{
|
||||||
int left, right, middle;
|
const dpackfile_t *a = _a, *b = _b;
|
||||||
dpackfile_t *pfile;
|
|
||||||
|
|
||||||
// look for the slot we should put that file into (binary search)
|
return Q_stricmp( a->name, b->name );
|
||||||
left = 0;
|
|
||||||
right = pack->numfiles - 1;
|
|
||||||
|
|
||||||
while( left <= right )
|
|
||||||
{
|
|
||||||
int diff;
|
|
||||||
|
|
||||||
middle = (left + right) / 2;
|
|
||||||
diff = Q_stricmp( pack->files[middle].name, name );
|
|
||||||
|
|
||||||
// If we found the file, there's a problem
|
|
||||||
if( !diff ) Con_Reportf( S_WARN "package %s contains the file %s several times\n", pack->filename, name );
|
|
||||||
|
|
||||||
// If we're too far in the list
|
|
||||||
if( diff > 0 ) right = middle - 1;
|
|
||||||
else left = middle + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We have to move the right of the list by one slot to free the one we need
|
|
||||||
pfile = &pack->files[left];
|
|
||||||
memmove( pfile + 1, pfile, (pack->numfiles - left) * sizeof( *pfile ));
|
|
||||||
pack->numfiles++;
|
|
||||||
|
|
||||||
Q_strncpy( pfile->name, name, sizeof( pfile->name ));
|
|
||||||
pfile->filepos = offset;
|
|
||||||
pfile->filelen = size;
|
|
||||||
|
|
||||||
return pfile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -129,9 +98,8 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
|||||||
{
|
{
|
||||||
dpackheader_t header;
|
dpackheader_t header;
|
||||||
int packhandle;
|
int packhandle;
|
||||||
int i, numpackfiles;
|
int numpackfiles;
|
||||||
pack_t *pack;
|
pack_t *pack;
|
||||||
dpackfile_t *info;
|
|
||||||
fs_size_t c;
|
fs_size_t c;
|
||||||
|
|
||||||
packhandle = open( packfile, O_RDONLY|O_BINARY );
|
packhandle = open( packfile, O_RDONLY|O_BINARY );
|
||||||
@ -188,28 +156,25 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
info = (dpackfile_t *)Mem_Malloc( fs_mempool, sizeof( *info ) * numpackfiles );
|
pack = (pack_t *)Mem_Calloc( fs_mempool, sizeof( pack_t ) + sizeof( dpackfile_t ) * ( numpackfiles - 1 ));
|
||||||
lseek( packhandle, header.dirofs, SEEK_SET );
|
lseek( packhandle, header.dirofs, SEEK_SET );
|
||||||
|
|
||||||
if( header.dirlen != read( packhandle, (void *)info, header.dirlen ))
|
if( header.dirlen != read( packhandle, (void *)pack->files, header.dirlen ))
|
||||||
{
|
{
|
||||||
Con_Reportf( "%s is an incomplete PAK, not loading\n", packfile );
|
Con_Reportf( "%s is an incomplete PAK, not loading\n", packfile );
|
||||||
if( error ) *error = PAK_LOAD_CORRUPTED;
|
if( error )
|
||||||
|
*error = PAK_LOAD_CORRUPTED;
|
||||||
close( packhandle );
|
close( packhandle );
|
||||||
Mem_Free( info );
|
Mem_Free( pack );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pack = (pack_t *)Mem_Calloc( fs_mempool, sizeof( pack_t ));
|
// TODO: validate directory?
|
||||||
Q_strncpy( pack->filename, packfile, sizeof( pack->filename ));
|
|
||||||
pack->files = (dpackfile_t *)Mem_Calloc( fs_mempool, numpackfiles * sizeof( dpackfile_t ));
|
|
||||||
pack->filetime = FS_SysFileTime( packfile );
|
pack->filetime = FS_SysFileTime( packfile );
|
||||||
pack->handle = packhandle;
|
pack->handle = packhandle;
|
||||||
pack->numfiles = 0;
|
pack->numfiles = numpackfiles;
|
||||||
|
qsort( pack->files, pack->numfiles, sizeof( pack->files[0] ), FS_SortPak );
|
||||||
// parse the directory
|
|
||||||
for( i = 0; i < numpackfiles; i++ )
|
|
||||||
FS_AddFileToPack( info[i].name, pack, info[i].filepos, info[i].filelen );
|
|
||||||
|
|
||||||
#ifdef XASH_REDUCE_FD
|
#ifdef XASH_REDUCE_FD
|
||||||
// will reopen when needed
|
// will reopen when needed
|
||||||
@ -217,8 +182,8 @@ static pack_t *FS_LoadPackPAK( const char *packfile, int *error )
|
|||||||
pack->handle = -1;
|
pack->handle = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( error ) *error = PAK_LOAD_OK;
|
if( error )
|
||||||
Mem_Free( info );
|
*error = PAK_LOAD_OK;
|
||||||
|
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
@ -236,7 +201,7 @@ static file_t *FS_OpenFile_PAK( searchpath_t *search, const char *filename, cons
|
|||||||
|
|
||||||
pfile = &search->pack->files[pack_ind];
|
pfile = &search->pack->files[pack_ind];
|
||||||
|
|
||||||
return FS_OpenHandle( search->pack->filename, search->pack->handle, pfile->filepos, pfile->filelen );
|
return FS_OpenHandle( search->filename, search->pack->handle, pfile->filepos, pfile->filelen );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -339,7 +304,7 @@ FS_PrintInfo_PAK
|
|||||||
*/
|
*/
|
||||||
static void FS_PrintInfo_PAK( searchpath_t *search, char *dst, size_t size )
|
static void FS_PrintInfo_PAK( searchpath_t *search, char *dst, size_t size )
|
||||||
{
|
{
|
||||||
Q_snprintf( dst, size, "%s (%i files)", search->pack->filename, search->pack->numfiles );
|
Q_snprintf( dst, size, "%s (%i files)", search->filename, search->pack->numfiles );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -381,7 +346,7 @@ qboolean FS_AddPak_Fullpath( const char *pakfile, qboolean *already_loaded, int
|
|||||||
|
|
||||||
for( search = fs_searchpaths; search; search = search->next )
|
for( search = fs_searchpaths; search; search = search->next )
|
||||||
{
|
{
|
||||||
if( search->type == SEARCHPATH_PAK && !Q_stricmp( search->pack->filename, pakfile ))
|
if( search->type == SEARCHPATH_PAK && !Q_stricmp( search->filename, pakfile ))
|
||||||
{
|
{
|
||||||
if( already_loaded ) *already_loaded = true;
|
if( already_loaded ) *already_loaded = true;
|
||||||
return true; // already loaded
|
return true; // already loaded
|
||||||
@ -399,10 +364,11 @@ qboolean FS_AddPak_Fullpath( const char *pakfile, qboolean *already_loaded, int
|
|||||||
string fullpath;
|
string fullpath;
|
||||||
|
|
||||||
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ));
|
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ));
|
||||||
|
Q_strncpy( search->filename, pakfile, sizeof( search->filename ));
|
||||||
search->pack = pak;
|
search->pack = pak;
|
||||||
search->type = SEARCHPATH_PAK;
|
search->type = SEARCHPATH_PAK;
|
||||||
search->next = fs_searchpaths;
|
search->next = fs_searchpaths;
|
||||||
search->flags |= flags;
|
search->flags = flags;
|
||||||
|
|
||||||
search->pfnPrintInfo = FS_PrintInfo_PAK;
|
search->pfnPrintInfo = FS_PrintInfo_PAK;
|
||||||
search->pfnClose = FS_Close_PAK;
|
search->pfnClose = FS_Close_PAK;
|
||||||
|
@ -71,7 +71,6 @@ typedef struct
|
|||||||
|
|
||||||
struct wfile_s
|
struct wfile_s
|
||||||
{
|
{
|
||||||
string filename;
|
|
||||||
int infotableofs;
|
int infotableofs;
|
||||||
int numlumps;
|
int numlumps;
|
||||||
poolhandle_t mempool; // W_ReadLump temp buffers
|
poolhandle_t mempool; // W_ReadLump temp buffers
|
||||||
@ -204,7 +203,7 @@ Add a file to the list of files contained into a package
|
|||||||
and sort LAT in alpha-bethical order
|
and sort LAT in alpha-bethical order
|
||||||
====================
|
====================
|
||||||
*/
|
*/
|
||||||
static dlumpinfo_t *W_AddFileToWad( const char *name, wfile_t *wad, dlumpinfo_t *newlump )
|
static dlumpinfo_t *W_AddFileToWad( const char *wadfile, const char *name, wfile_t *wad, dlumpinfo_t *newlump )
|
||||||
{
|
{
|
||||||
int left, right;
|
int left, right;
|
||||||
dlumpinfo_t *plump;
|
dlumpinfo_t *plump;
|
||||||
@ -224,7 +223,7 @@ static dlumpinfo_t *W_AddFileToWad( const char *name, wfile_t *wad, dlumpinfo_t
|
|||||||
diff = 1;
|
diff = 1;
|
||||||
else if( wad->lumps[middle].type > newlump->type )
|
else if( wad->lumps[middle].type > newlump->type )
|
||||||
diff = -1;
|
diff = -1;
|
||||||
else Con_Reportf( S_WARN "Wad %s contains the file %s several times\n", wad->filename, name );
|
else Con_Reportf( S_WARN "Wad %s contains the file %s several times\n", wadfile, name );
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're too far in the list
|
// If we're too far in the list
|
||||||
@ -313,7 +312,6 @@ static wfile_t *W_Open( const char *filename, int *error )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// copy wad name
|
// copy wad name
|
||||||
Q_strncpy( wad->filename, filename, sizeof( wad->filename ));
|
|
||||||
wad->filetime = FS_SysFileTime( filename );
|
wad->filetime = FS_SysFileTime( filename );
|
||||||
wad->mempool = Mem_AllocPool( filename );
|
wad->mempool = Mem_AllocPool( filename );
|
||||||
|
|
||||||
@ -366,7 +364,7 @@ static wfile_t *W_Open( const char *filename, int *error )
|
|||||||
|
|
||||||
if( FS_Read( wad->handle, srclumps, lat_size ) != lat_size )
|
if( FS_Read( wad->handle, srclumps, lat_size ) != lat_size )
|
||||||
{
|
{
|
||||||
Con_Reportf( S_ERROR "W_ReadLumpTable: %s has corrupted lump allocation table\n", wad->filename );
|
Con_Reportf( S_ERROR "W_ReadLumpTable: %s has corrupted lump allocation table\n", filename );
|
||||||
if( error ) *error = WAD_LOAD_CORRUPTED;
|
if( error ) *error = WAD_LOAD_CORRUPTED;
|
||||||
Mem_Free( srclumps );
|
Mem_Free( srclumps );
|
||||||
FS_CloseWAD( wad );
|
FS_CloseWAD( wad );
|
||||||
@ -394,7 +392,7 @@ static wfile_t *W_Open( const char *filename, int *error )
|
|||||||
if( srclumps[i].type == 68 && !Q_stricmp( srclumps[i].name, "conchars" ))
|
if( srclumps[i].type == 68 && !Q_stricmp( srclumps[i].name, "conchars" ))
|
||||||
srclumps[i].type = TYP_GFXPIC;
|
srclumps[i].type = TYP_GFXPIC;
|
||||||
|
|
||||||
W_AddFileToWad( name, wad, &srclumps[i] );
|
W_AddFileToWad( filename, name, wad, &srclumps[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
// release source lumps
|
// release source lumps
|
||||||
@ -423,7 +421,7 @@ FS_PrintInfo_WAD
|
|||||||
*/
|
*/
|
||||||
static void FS_PrintInfo_WAD( searchpath_t *search, char *dst, size_t size )
|
static void FS_PrintInfo_WAD( searchpath_t *search, char *dst, size_t size )
|
||||||
{
|
{
|
||||||
Q_snprintf( dst, size, "%s (%i files)", search->wad->filename, search->wad->numlumps );
|
Q_snprintf( dst, size, "%s (%i files)", search->filename, search->wad->numlumps );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -456,7 +454,7 @@ static int FS_FindFile_WAD( searchpath_t *search, const char *path )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make wadname from wad fullpath
|
// make wadname from wad fullpath
|
||||||
COM_FileBase( search->wad->filename, shortname );
|
COM_FileBase( search->filename, shortname );
|
||||||
COM_DefaultExtension( shortname, ".wad" );
|
COM_DefaultExtension( shortname, ".wad" );
|
||||||
|
|
||||||
// quick reject by wadname
|
// quick reject by wadname
|
||||||
@ -509,7 +507,7 @@ static void FS_Search_WAD( searchpath_t *search, stringlist_t *list, const char
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make wadname from wad fullpath
|
// make wadname from wad fullpath
|
||||||
COM_FileBase( search->wad->filename, temp2 );
|
COM_FileBase( search->filename, temp2 );
|
||||||
COM_DefaultExtension( temp2, ".wad" );
|
COM_DefaultExtension( temp2, ".wad" );
|
||||||
|
|
||||||
// quick reject by wadname
|
// quick reject by wadname
|
||||||
@ -575,7 +573,7 @@ qboolean FS_AddWad_Fullpath( const char *wadfile, qboolean *already_loaded, int
|
|||||||
|
|
||||||
for( search = fs_searchpaths; search; search = search->next )
|
for( search = fs_searchpaths; search; search = search->next )
|
||||||
{
|
{
|
||||||
if( search->type == SEARCHPATH_WAD && !Q_stricmp( search->wad->filename, wadfile ))
|
if( search->type == SEARCHPATH_WAD && !Q_stricmp( search->filename, wadfile ))
|
||||||
{
|
{
|
||||||
if( already_loaded ) *already_loaded = true;
|
if( already_loaded ) *already_loaded = true;
|
||||||
return true; // already loaded
|
return true; // already loaded
|
||||||
@ -591,10 +589,11 @@ qboolean FS_AddWad_Fullpath( const char *wadfile, qboolean *already_loaded, int
|
|||||||
if( wad )
|
if( wad )
|
||||||
{
|
{
|
||||||
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ));
|
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ));
|
||||||
|
Q_strncpy( search->filename, wadfile, sizeof( search->filename ));
|
||||||
search->wad = wad;
|
search->wad = wad;
|
||||||
search->type = SEARCHPATH_WAD;
|
search->type = SEARCHPATH_WAD;
|
||||||
search->next = fs_searchpaths;
|
search->next = fs_searchpaths;
|
||||||
search->flags |= flags;
|
search->flags = flags;
|
||||||
|
|
||||||
search->pfnPrintInfo = FS_PrintInfo_WAD;
|
search->pfnPrintInfo = FS_PrintInfo_WAD;
|
||||||
search->pfnClose = FS_Close_WAD;
|
search->pfnClose = FS_Close_WAD;
|
||||||
@ -608,12 +607,10 @@ qboolean FS_AddWad_Fullpath( const char *wadfile, qboolean *already_loaded, int
|
|||||||
Con_Reportf( "Adding wadfile: %s (%i files)\n", wadfile, wad->numlumps );
|
Con_Reportf( "Adding wadfile: %s (%i files)\n", wadfile, wad->numlumps );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
if( errorcode != WAD_LOAD_NO_FILES )
|
||||||
if( errorcode != WAD_LOAD_NO_FILES )
|
Con_Reportf( S_ERROR "FS_AddWad_Fullpath: unable to load wad \"%s\"\n", wadfile );
|
||||||
Con_Reportf( S_ERROR "FS_AddWad_Fullpath: unable to load wad \"%s\"\n", wadfile );
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -120,7 +120,6 @@ typedef struct zipfile_s
|
|||||||
|
|
||||||
struct zip_s
|
struct zip_s
|
||||||
{
|
{
|
||||||
string filename;
|
|
||||||
int handle;
|
int handle;
|
||||||
int numfiles;
|
int numfiles;
|
||||||
time_t filetime;
|
time_t filetime;
|
||||||
@ -381,7 +380,6 @@ static zip_t *FS_LoadZip( const char *zipfile, int *error )
|
|||||||
info[i].offset = info[i].offset + header.filename_len + header.extrafield_len + sizeof( header );
|
info[i].offset = info[i].offset + header.filename_len + header.extrafield_len + sizeof( header );
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_strncpy( zip->filename, zipfile, sizeof( zip->filename ) );
|
|
||||||
zip->filetime = FS_SysFileTime( zipfile );
|
zip->filetime = FS_SysFileTime( zipfile );
|
||||||
zip->numfiles = numpackfiles;
|
zip->numfiles = numpackfiles;
|
||||||
zip->files = info;
|
zip->files = info;
|
||||||
@ -419,7 +417,7 @@ file_t *FS_OpenFile_ZIP( searchpath_t *search, const char *filename, const char
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FS_OpenHandle( search->zip->filename, search->zip->handle, pfile->offset, pfile->size );
|
return FS_OpenHandle( search->filename, search->zip->handle, pfile->offset, pfile->size );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -586,7 +584,7 @@ FS_PrintInfo_ZIP
|
|||||||
*/
|
*/
|
||||||
void FS_PrintInfo_ZIP( searchpath_t *search, char *dst, size_t size )
|
void FS_PrintInfo_ZIP( searchpath_t *search, char *dst, size_t size )
|
||||||
{
|
{
|
||||||
Q_snprintf( dst, size, "%s (%i files)", search->zip->filename, search->zip->numfiles );
|
Q_snprintf( dst, size, "%s (%i files)", search->filename, search->zip->numfiles );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -683,7 +681,7 @@ qboolean FS_AddZip_Fullpath( const char *zipfile, qboolean *already_loaded, int
|
|||||||
|
|
||||||
for( search = fs_searchpaths; search; search = search->next )
|
for( search = fs_searchpaths; search; search = search->next )
|
||||||
{
|
{
|
||||||
if( search->type == SEARCHPATH_ZIP && !Q_stricmp( search->zip->filename, zipfile ))
|
if( search->type == SEARCHPATH_ZIP && !Q_stricmp( search->filename, zipfile ))
|
||||||
{
|
{
|
||||||
if( already_loaded ) *already_loaded = true;
|
if( already_loaded ) *already_loaded = true;
|
||||||
return true; // already loaded
|
return true; // already loaded
|
||||||
@ -701,10 +699,11 @@ qboolean FS_AddZip_Fullpath( const char *zipfile, qboolean *already_loaded, int
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ) );
|
search = (searchpath_t *)Mem_Calloc( fs_mempool, sizeof( searchpath_t ) );
|
||||||
|
Q_strncpy( search->filename, zipfile, sizeof( search->filename ));
|
||||||
search->zip = zip;
|
search->zip = zip;
|
||||||
search->type = SEARCHPATH_ZIP;
|
search->type = SEARCHPATH_ZIP;
|
||||||
search->next = fs_searchpaths;
|
search->next = fs_searchpaths;
|
||||||
search->flags |= flags;
|
search->flags = flags;
|
||||||
|
|
||||||
search->pfnPrintInfo = FS_PrintInfo_ZIP;
|
search->pfnPrintInfo = FS_PrintInfo_ZIP;
|
||||||
search->pfnClose = FS_Close_ZIP;
|
search->pfnClose = FS_Close_ZIP;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user