Merge "which" command upstream from Tremulous, patch provided by Chris Schwarz

This commit is contained in:
Thilo Schulz 2011-02-10 23:07:07 +00:00
parent 2c57226d9f
commit 4dc750aedb
3 changed files with 75 additions and 0 deletions

2
README
View File

@ -236,6 +236,8 @@ New commands
net_restart - restart network subsystem to change latched settings net_restart - restart network subsystem to change latched settings
game_restart <fs_game> - Switch to another mod game_restart <fs_game> - Switch to another mod
which <filename/path> - print out the path on disk to a loaded item
------------------------------------------------------------ Miscellaneous ----- ------------------------------------------------------------ Miscellaneous -----
Using shared libraries instead of qvm Using shared libraries instead of qvm

View File

@ -2440,6 +2440,74 @@ void FS_TouchFile_f( void ) {
} }
} }
/*
============
FS_Which_f
============
*/
void FS_Which_f( void ) {
searchpath_t *search;
char *netpath;
pack_t *pak;
fileInPack_t *pakFile;
directory_t *dir;
long hash;
FILE *temp;
char *filename;
char buf[ MAX_OSPATH ];
hash = 0;
filename = Cmd_Argv(1);
if ( !filename[0] ) {
Com_Printf( "Usage: which <file>\n" );
return;
}
// qpaths are not supposed to have a leading slash
if ( filename[0] == '/' || filename[0] == '\\' ) {
filename++;
}
// just wants to see if file is there
for ( search = fs_searchpaths ; search ; search = search->next ) {
if ( search->pack ) {
hash = FS_HashFileName(filename, search->pack->hashSize);
}
// is the element a pak file?
if ( search->pack && search->pack->hashTable[hash] ) {
// look through all the pak file elements
pak = search->pack;
pakFile = pak->hashTable[hash];
do {
// case and separator insensitive comparisons
if ( !FS_FilenameCompare( pakFile->name, filename ) ) {
// found it!
Com_Printf( "File \"%s\" found in \"%s\"\n", filename, pak->pakFilename );
return;
}
pakFile = pakFile->next;
} while(pakFile != NULL);
} else if ( search->dir ) {
dir = search->dir;
netpath = FS_BuildOSPath( dir->path, dir->gamedir, filename );
temp = fopen (netpath, "rb");
if ( !temp ) {
continue;
}
fclose(temp);
Com_sprintf( buf, sizeof( buf ), "%s/%s", dir->path, dir->gamedir );
FS_ReplaceSeparators( buf );
Com_Printf( "File \"%s\" found at \"%s\"\n", filename, buf );
return;
}
}
Com_Printf( "File not found: \"%s\"\n", filename );
return;
}
//=========================================================================== //===========================================================================
@ -2719,6 +2787,7 @@ void FS_Shutdown( qboolean closemfp ) {
Cmd_RemoveCommand( "dir" ); Cmd_RemoveCommand( "dir" );
Cmd_RemoveCommand( "fdir" ); Cmd_RemoveCommand( "fdir" );
Cmd_RemoveCommand( "touchFile" ); Cmd_RemoveCommand( "touchFile" );
Cmd_RemoveCommand( "which" );
#ifdef FS_MISSING #ifdef FS_MISSING
if (closemfp) { if (closemfp) {
@ -2852,6 +2921,7 @@ static void FS_Startup( const char *gameName )
Cmd_AddCommand ("dir", FS_Dir_f ); Cmd_AddCommand ("dir", FS_Dir_f );
Cmd_AddCommand ("fdir", FS_NewDir_f ); Cmd_AddCommand ("fdir", FS_NewDir_f );
Cmd_AddCommand ("touchFile", FS_TouchFile_f ); Cmd_AddCommand ("touchFile", FS_TouchFile_f );
Cmd_AddCommand ("which", FS_Which_f );
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=506 // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=506
// reorder the pure pk3 files according to server order // reorder the pure pk3 files according to server order

View File

@ -384,6 +384,9 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
return NULL; return NULL;
} }
// show where the qvm was loaded from
Cmd_ExecuteString( va( "which %s\n", filename ) );
if( LittleLong( header.h->vmMagic ) == VM_MAGIC_VER2 ) { if( LittleLong( header.h->vmMagic ) == VM_MAGIC_VER2 ) {
Com_Printf( "...which has vmMagic VM_MAGIC_VER2\n" ); Com_Printf( "...which has vmMagic VM_MAGIC_VER2\n" );