From 4dc750aedbaaa5d30932d25c27b293219653b2e9 Mon Sep 17 00:00:00 2001 From: Thilo Schulz Date: Thu, 10 Feb 2011 23:07:07 +0000 Subject: [PATCH] Merge "which" command upstream from Tremulous, patch provided by Chris Schwarz --- README | 2 ++ code/qcommon/files.c | 70 ++++++++++++++++++++++++++++++++++++++++++++ code/qcommon/vm.c | 3 ++ 3 files changed, 75 insertions(+) diff --git a/README b/README index 5d27d291..27e56843 100644 --- a/README +++ b/README @@ -236,6 +236,8 @@ New commands net_restart - restart network subsystem to change latched settings game_restart - Switch to another mod + which - print out the path on disk to a loaded item + ------------------------------------------------------------ Miscellaneous ----- Using shared libraries instead of qvm diff --git a/code/qcommon/files.c b/code/qcommon/files.c index b0b574a8..f6af8ee6 100644 --- a/code/qcommon/files.c +++ b/code/qcommon/files.c @@ -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 \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( "fdir" ); Cmd_RemoveCommand( "touchFile" ); + Cmd_RemoveCommand( "which" ); #ifdef FS_MISSING if (closemfp) { @@ -2852,6 +2921,7 @@ static void FS_Startup( const char *gameName ) Cmd_AddCommand ("dir", FS_Dir_f ); Cmd_AddCommand ("fdir", FS_NewDir_f ); Cmd_AddCommand ("touchFile", FS_TouchFile_f ); + Cmd_AddCommand ("which", FS_Which_f ); // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=506 // reorder the pure pk3 files according to server order diff --git a/code/qcommon/vm.c b/code/qcommon/vm.c index 753eb298..72307398 100644 --- a/code/qcommon/vm.c +++ b/code/qcommon/vm.c @@ -384,6 +384,9 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) { return NULL; } + // show where the qvm was loaded from + Cmd_ExecuteString( va( "which %s\n", filename ) ); + if( LittleLong( header.h->vmMagic ) == VM_MAGIC_VER2 ) { Com_Printf( "...which has vmMagic VM_MAGIC_VER2\n" );