X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=tools%2Fquake3%2Fq3map2%2Fpath_init.c;h=80cdbcae5d4e1fb50d571b72532c6c4919000df7;hp=e6b4d959b7d06f16dff3f7b17204edb0d7ad9e89;hb=8691e753e04ab691b9d702571125b5f03d1948ff;hpb=5ec3a47e102a60270ba18049bc44c584cf1de118 diff --git a/tools/quake3/q3map2/path_init.c b/tools/quake3/q3map2/path_init.c index e6b4d959..80cdbcae 100644 --- a/tools/quake3/q3map2/path_init.c +++ b/tools/quake3/q3map2/path_init.c @@ -1,30 +1,30 @@ /* ------------------------------------------------------------------------------- -Copyright (C) 1999-2007 id Software, Inc. and contributors. -For a list of contributors, see the accompanying CONTRIBUTORS file. + Copyright (C) 1999-2007 id Software, Inc. and contributors. + For a list of contributors, see the accompanying CONTRIBUTORS file. -This file is part of GtkRadiant. + This file is part of GtkRadiant. -GtkRadiant is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + GtkRadiant is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -GtkRadiant is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GtkRadiant is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GtkRadiant; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with GtkRadiant; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ----------------------------------------------------------------------------------- + ---------------------------------------------------------------------------------- -This code has been altered significantly from its original form, to support -several games based on the Quake III Arena engine, in the form of "Q3Map2." + This code has been altered significantly from its original form, to support + several games based on the Quake III Arena engine, in the form of "Q3Map2." -------------------------------------------------------------------------------- */ + ------------------------------------------------------------------------------- */ @@ -39,163 +39,186 @@ several games based on the Quake III Arena engine, in the form of "Q3Map2." /* path support */ -#define MAX_BASE_PATHS 10 -#define MAX_GAME_PATHS 10 +#define MAX_BASE_PATHS 10 +#define MAX_GAME_PATHS 10 +#define MAX_PAK_PATHS 200 -char *homePath; -char installPath[ MAX_OS_PATH ]; +char *homePath; +char installPath[ MAX_OS_PATH ]; -int numBasePaths; -char *basePaths[ MAX_BASE_PATHS ]; -int numGamePaths; -char *gamePaths[ MAX_GAME_PATHS ]; -char *homeBasePath = NULL; +int numBasePaths; +char *basePaths[ MAX_BASE_PATHS ]; +int numGamePaths; +char *gamePaths[ MAX_GAME_PATHS ]; +int numPakPaths; +char *pakPaths[ MAX_PAK_PATHS ]; +char *homeBasePath = NULL; /* -some of this code is based off the original q3map port from loki -and finds various paths. moved here from bsp.c for clarity. -*/ + some of this code is based off the original q3map port from loki + and finds various paths. moved here from bsp.c for clarity. + */ /* -PathLokiGetHomeDir() -gets the user's home dir (for ~/.q3a) -*/ + PathLokiGetHomeDir() + gets the user's home dir (for ~/.q3a) + */ -char *LokiGetHomeDir( void ) -{ +char *LokiGetHomeDir( void ){ #ifndef Q_UNIX - return NULL; + return NULL; #else - char *home; - uid_t id; - struct passwd *pwd; - - - /* get the home environment variable */ - home = getenv( "HOME" ); - if( home == NULL ) - { - /* do some more digging */ - id = getuid(); - setpwent(); - while( (pwd = getpwent()) != NULL ) - { - if( pwd->pw_uid == id ) - { - home = pwd->pw_dir; - break; - } - } - endpwent(); + static char buf[ 4096 ]; + struct passwd pw, *pwp; + char *home; + static char homeBuf[MAX_OS_PATH]; + + + /* get the home environment variable */ + home = getenv( "HOME" ); + + /* look up home dir in password database */ + if(!home) + { + if ( getpwuid_r( getuid(), &pw, buf, sizeof( buf ), &pwp ) == 0 ) { + return pw.pw_dir; } - - /* return it */ - return home; + } + + snprintf( homeBuf, sizeof( homeBuf ), "%s/.", home ); + + /* return it */ + return homeBuf; #endif } /* -PathLokiInitPaths() -initializes some paths on linux/os x -*/ + PathLokiInitPaths() + initializes some paths on linux/os x + */ -void LokiInitPaths( char *argv0 ) -{ - #ifndef Q_UNIX - /* this is kinda crap, but hey */ - strcpy( installPath, "../" ); - #else - char temp[ MAX_OS_PATH ]; - char last0[ 2 ]; - char *home; - char *path; - char *last; - qboolean found; - - +void LokiInitPaths( char *argv0 ){ + char *home; + + if ( !homePath ) { /* get home dir */ home = LokiGetHomeDir(); - if( home == NULL ) + if ( home == NULL ) { home = "."; - - /* do some path divining */ - strcpy( temp, argv0 ); - if( strrchr( argv0, '/' ) ) - argv0 = strrchr( argv0, '/' ) + 1; - else - { - /* get path environment variable */ - path = getenv( "PATH" ); - - /* minor setup */ - last = last0; - last[ 0 ] = path[ 0 ]; - last[ 1 ] = '\0'; - found = qfalse; - - /* go through each : segment of path */ - while( last[ 0 ] != '\0' && found == qfalse ) - { - /* null out temp */ - temp[ 0 ] = '\0'; - - /* find next chunk */ - last = strchr( path, ':' ); - if( last == NULL ) - last = path + strlen( path ); - - /* found home dir candidate */ - if( *path == '~' ) - { - strcpy( temp, home ); - path++; - } - - /* concatenate */ - if( last > (path + 1) ) - { - strncat( temp, path, (last - path) ); - strcat( temp, "/" ); - } - strcat( temp, "./" ); - strcat( temp, argv0 ); - - /* verify the path */ - if( access( temp, X_OK ) == 0 ) - found++; - path = last + 1; - } - } - - /* flake */ - if( realpath( temp, installPath ) ) - { - /* q3map is in "tools/" */ - *(strrchr( installPath, '/' )) = '\0'; - *(strrchr( installPath, '/' ) + 1) = '\0'; } - + /* set home path */ homePath = home; + } + else{ + home = homePath; + } + + #ifndef Q_UNIX + /* this is kinda crap, but hey */ + strcpy( installPath, "../" ); + #else + + char temp[ MAX_OS_PATH ]; + char *path; + char *last; + qboolean found; + + + path = getenv( "PATH" ); + + /* do some path divining */ + Q_strncpyz( temp, argv0, sizeof( temp ) ); + if ( strrchr( temp, '/' ) ) { + argv0 = strrchr( argv0, '/' ) + 1; + } + else if ( path ) { + + /* + This code has a special behavior when q3map2 is a symbolic link. + + For each dir in ${PATH} (example: "/usr/bin", "/usr/local/bin" if ${PATH} == "/usr/bin:/usr/local/bin"), + it looks for "${dir}/q3map2" (file exists and is executable), + then it uses "dirname(realpath("${dir}/q3map2"))/../" as installPath. + + So, if "/usr/bin/q3map2" is a symbolic link to "/opt/radiant/tools/q3map2", + it will find the installPath "/usr/share/radiant/", + so q3map2 will look for "/opt/radiant/baseq3" to find paks. + + More precisely, it looks for "${dir}/${argv[0]}", + so if "/usr/bin/q3map2" is a symbolic link to "/opt/radiant/tools/q3map2", + and if "/opt/radiant/tools/q3ma2" is a symbolic link to "/opt/radiant/tools/q3map2.x86_64", + it will use "dirname("/opt/radiant/tools/q3map2.x86_64")/../" as path, + so it will use "/opt/radiant/" as installPath, which will be expanded later to "/opt/radiant/baseq3" to find paks. + */ + + found = qfalse; + last = path; + + /* go through each : segment of path */ + while ( last[ 0 ] != '\0' && found == qfalse ) + { + /* null out temp */ + temp[ 0 ] = '\0'; + + /* find next chunk */ + last = strchr( path, ':' ); + if ( last == NULL ) { + last = path + strlen( path ); + } + + /* found home dir candidate */ + if ( *path == '~' ) { + Q_strncpyz( temp, home, sizeof( temp ) ); + path++; + } + + /* concatenate */ + if ( last > ( path + 1 ) ) { + // +1 hack: Q_strncat calls Q_strncpyz that expects a len including '\0' + // so that extraneous char will be rewritten by '\0', so it's ok. + // Also, in this case this extraneous char is always ':' or '\0', so it's ok. + Q_strncat( temp, sizeof( temp ), path, ( last - path + 1) ); + Q_strcat( temp, sizeof( temp ), "/" ); + } + Q_strcat( temp, sizeof( temp ), argv0 ); + + /* verify the path */ + if ( access( temp, X_OK ) == 0 ) { + found = qtrue; + } + path = last + 1; + } + } + + /* flake */ + if ( realpath( temp, installPath ) ) { + /* + if "q3map2" is "/opt/radiant/tools/q3map2", + installPath is "/opt/radiant" + */ + *( strrchr( installPath, '/' ) ) = '\0'; + *( strrchr( installPath, '/' ) ) = '\0'; + } #endif } /* -CleanPath() - ydnar -cleans a dos path \ -> / -*/ + CleanPath() - ydnar + cleans a dos path \ -> / + */ -void CleanPath( char *path ) -{ - while( *path ) +void CleanPath( char *path ){ + while ( *path ) { - if( *path == '\\' ) + if ( *path == '\\' ) { *path = '/'; + } path++; } } @@ -203,42 +226,42 @@ void CleanPath( char *path ) /* -GetGame() - ydnar -gets the game_t based on a -game argument -returns NULL if no match found -*/ - -game_t *GetGame( char *arg ) -{ - int i; - - + GetGame() - ydnar + gets the game_t based on a -game argument + returns NULL if no match found + */ + +game_t *GetGame( char *arg ){ + int i; + + /* dummy check */ - if( arg == NULL || arg[ 0 ] == '\0' ) + if ( arg == NULL || arg[ 0 ] == '\0' ) { return NULL; - + } + /* joke */ - if( !Q_stricmp( arg, "quake1" ) || - !Q_stricmp( arg, "quake2" ) || - !Q_stricmp( arg, "unreal" ) || - !Q_stricmp( arg, "ut2k3" ) || - !Q_stricmp( arg, "dn3d" ) || - !Q_stricmp( arg, "dnf" ) || - !Q_stricmp( arg, "hl" ) ) - { + if ( !Q_stricmp( arg, "quake1" ) || + !Q_stricmp( arg, "quake2" ) || + !Q_stricmp( arg, "unreal" ) || + !Q_stricmp( arg, "ut2k3" ) || + !Q_stricmp( arg, "dn3d" ) || + !Q_stricmp( arg, "dnf" ) || + !Q_stricmp( arg, "hl" ) ) { Sys_Printf( "April fools, silly rabbit!\n" ); exit( 0 ); } - + /* test it */ i = 0; - while( games[ i ].arg != NULL ) + while ( games[ i ].arg != NULL ) { - if( Q_stricmp( arg, games[ i ].arg ) == 0 ) + if ( Q_stricmp( arg, games[ i ].arg ) == 0 ) { return &games[ i ]; + } i++; } - + /* no matching game */ return NULL; } @@ -246,16 +269,16 @@ game_t *GetGame( char *arg ) /* -AddBasePath() - ydnar -adds a base path to the list -*/ + AddBasePath() - ydnar + adds a base path to the list + */ -void AddBasePath( char *path ) -{ +void AddBasePath( char *path ){ /* dummy check */ - if( path == NULL || path[ 0 ] == '\0' || numBasePaths >= MAX_BASE_PATHS ) + if ( path == NULL || path[ 0 ] == '\0' || numBasePaths >= MAX_BASE_PATHS ) { return; - + } + /* add it to the list */ basePaths[ numBasePaths ] = safe_malloc( strlen( path ) + 1 ); strcpy( basePaths[ numBasePaths ], path ); @@ -266,227 +289,355 @@ void AddBasePath( char *path ) /* -AddHomeBasePath() - ydnar -adds a base path to the beginning of the list, prefixed by ~/ -*/ - -void AddHomeBasePath( char *path ) -{ - #ifdef Q_UNIX - int i; - char temp[ MAX_OS_PATH ]; - - - /* dummy check */ - if( path == NULL || path[ 0 ] == '\0' ) - return; - - /* make a hole */ - for( i = (MAX_BASE_PATHS - 2); i >= 0; i-- ) - basePaths[ i + 1 ] = basePaths[ i ]; - + AddHomeBasePath() - ydnar + adds a base path to the beginning of the list, prefixed by ~/ + */ + +void AddHomeBasePath( char *path ){ + int i; + char temp[ MAX_OS_PATH ]; + int homePathLen; + + if ( !homePath ) { + return; + } + + /* dummy check */ + if ( path == NULL || path[ 0 ] == '\0' ) { + return; + } + + /* strip leading dot, if homePath does not end in /. */ + homePathLen = strlen( homePath ); + if ( !strcmp( path, "." ) ) { + /* -fs_homebase . means that -fs_home is to be used as is */ + strcpy( temp, homePath ); + } + else if ( homePathLen >= 2 && !strcmp( homePath + homePathLen - 2, "/." ) ) { + /* remove trailing /. of homePath */ + homePathLen -= 2; + + /* concatenate home dir and path */ + sprintf( temp, "%.*s/%s", homePathLen, homePath, path ); + } + else + { + /* remove leading . of path */ + if ( path[0] == '.' ) { + ++path; + } + /* concatenate home dir and path */ sprintf( temp, "%s/%s", homePath, path ); - - /* add it to the list */ - basePaths[ 0 ] = safe_malloc( strlen( temp ) + 1 ); - strcpy( basePaths[ 0 ], temp ); - CleanPath( basePaths[ 0 ] ); - numBasePaths++; - #endif + } + + /* make a hole */ + for ( i = ( MAX_BASE_PATHS - 2 ); i >= 0; i-- ) + basePaths[ i + 1 ] = basePaths[ i ]; + + /* add it to the list */ + basePaths[ 0 ] = safe_malloc( strlen( temp ) + 1 ); + strcpy( basePaths[ 0 ], temp ); + CleanPath( basePaths[ 0 ] ); + numBasePaths++; } /* -AddGamePath() - ydnar -adds a game path to the list -*/ + AddGamePath() - ydnar + adds a game path to the list + */ + +void AddGamePath( char *path ){ + int i; -void AddGamePath( char *path ) -{ /* dummy check */ - if( path == NULL || path[ 0 ] == '\0' || numGamePaths >= MAX_GAME_PATHS ) + if ( path == NULL || path[ 0 ] == '\0' || numGamePaths >= MAX_GAME_PATHS ) { return; - + } + /* add it to the list */ gamePaths[ numGamePaths ] = safe_malloc( strlen( path ) + 1 ); strcpy( gamePaths[ numGamePaths ], path ); CleanPath( gamePaths[ numGamePaths ] ); numGamePaths++; + + /* don't add it if it's already there */ + for ( i = 0; i < numGamePaths - 1; i++ ) + { + if ( strcmp( gamePaths[i], gamePaths[numGamePaths - 1] ) == 0 ) { + free( gamePaths[numGamePaths - 1] ); + gamePaths[numGamePaths - 1] = NULL; + numGamePaths--; + break; + } + } + } +/* + AddPakPath() + adds a pak path to the list + */ + +void AddPakPath( char *path ){ + /* dummy check */ + if ( path == NULL || path[ 0 ] == '\0' || numPakPaths >= MAX_PAK_PATHS ) { + return; + } + + /* add it to the list */ + pakPaths[ numPakPaths ] = safe_malloc( strlen( path ) + 1 ); + strcpy( pakPaths[ numPakPaths ], path ); + CleanPath( pakPaths[ numPakPaths ] ); + numPakPaths++; +} + /* -InitPaths() - ydnar -cleaned up some of the path initialization code from bsp.c -will remove any arguments it uses -*/ - -void InitPaths( int *argc, char **argv ) -{ - int i, j, k, len, len2; - char temp[ MAX_OS_PATH ]; - - + InitPaths() - ydnar + cleaned up some of the path initialization code from bsp.c + will remove any arguments it uses + */ + +void InitPaths( int *argc, char **argv ){ + int i, j, k, len, len2; + char temp[ MAX_OS_PATH ]; + + int noBasePath = 0; + int noHomePath = 0; + int noMagicPath = 0; + /* note it */ Sys_FPrintf( SYS_VRB, "--- InitPaths ---\n" ); - + /* get the install path for backup */ LokiInitPaths( argv[ 0 ] ); - + /* set game to default (q3a) */ game = &games[ 0 ]; numBasePaths = 0; numGamePaths = 0; - + /* parse through the arguments and extract those relevant to paths */ - for( i = 0; i < *argc; i++ ) + for ( i = 0; i < *argc; i++ ) { /* check for null */ - if( argv[ i ] == NULL ) + if ( argv[ i ] == NULL ) { continue; - + } + /* -game */ - if( strcmp( argv[ i ], "-game" ) == 0 ) - { - if( ++i >= *argc ) + if ( strcmp( argv[ i ], "-game" ) == 0 ) { + if ( ++i >= *argc ) { Error( "Out of arguments: No game specified after %s", argv[ i - 1 ] ); + } argv[ i - 1 ] = NULL; game = GetGame( argv[ i ] ); - if( game == NULL ) + if ( game == NULL ) { game = &games[ 0 ]; + } argv[ i ] = NULL; } /* -fs_forbiddenpath */ - else if( strcmp( argv[ i ], "-fs_forbiddenpath" ) == 0 ) - { - if( ++i >= *argc ) + else if ( strcmp( argv[ i ], "-fs_forbiddenpath" ) == 0 ) { + if ( ++i >= *argc ) { Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } argv[ i - 1 ] = NULL; - if(g_numForbiddenDirs < VFS_MAXDIRS) - { - strncpy(g_strForbiddenDirs[g_numForbiddenDirs], argv[i], PATH_MAX); + if ( g_numForbiddenDirs < VFS_MAXDIRS ) { + strncpy( g_strForbiddenDirs[g_numForbiddenDirs], argv[i], PATH_MAX ); g_strForbiddenDirs[g_numForbiddenDirs][PATH_MAX] = 0; ++g_numForbiddenDirs; } argv[ i ] = NULL; } + /* -fs_nobasepath */ + else if ( strcmp( argv[ i ], "-fs_nobasepath" ) == 0 ) { + noBasePath = 1; + // we don't want any basepath, neither guessed ones + noMagicPath = 1; + argv[ i ] = NULL; + } + + /* -fs_nomagicpath */ + else if ( strcmp( argv[ i ], "-fs_nomagicpath") == 0) { + noMagicPath = 1; + argv[ i ] = NULL; + } + /* -fs_basepath */ - else if( strcmp( argv[ i ], "-fs_basepath" ) == 0 ) - { - if( ++i >= *argc ) + else if ( strcmp( argv[ i ], "-fs_basepath" ) == 0 ) { + if ( ++i >= *argc ) { Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } argv[ i - 1 ] = NULL; AddBasePath( argv[ i ] ); argv[ i ] = NULL; } - + /* -fs_game */ - else if( strcmp( argv[ i ], "-fs_game" ) == 0 ) - { - if( ++i >= *argc ) + else if ( strcmp( argv[ i ], "-fs_game" ) == 0 ) { + if ( ++i >= *argc ) { Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } argv[ i - 1 ] = NULL; AddGamePath( argv[ i ] ); argv[ i ] = NULL; } - - /* -fs_nohomebase */ - else if( strcmp( argv[ i ], "-fs_homebase" ) == 0 ) - { - if( ++i >= *argc ) + + /* -fs_home */ + else if ( strcmp( argv[ i ], "-fs_home" ) == 0 ) { + if ( ++i >= *argc ) { Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } + argv[ i - 1 ] = NULL; + homePath = argv[i]; + argv[ i ] = NULL; + } + + /* -fs_nohomepath */ + else if ( strcmp( argv[ i ], "-fs_nohomepath" ) == 0 ) { + noHomePath = 1; + argv[ i ] = NULL; + } + + /* -fs_homebase */ + else if ( strcmp( argv[ i ], "-fs_homebase" ) == 0 ) { + if ( ++i >= *argc ) { + Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } argv[ i - 1 ] = NULL; homeBasePath = argv[i]; argv[ i ] = NULL; } + + /* -fs_homepath - sets both of them */ + else if ( strcmp( argv[ i ], "-fs_homepath" ) == 0 ) { + if ( ++i >= *argc ) { + Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } + argv[ i - 1 ] = NULL; + homePath = argv[i]; + homeBasePath = "."; + argv[ i ] = NULL; + } + + /* -fs_pakpath */ + else if ( strcmp( argv[ i ], "-fs_pakpath" ) == 0 ) { + if ( ++i >= *argc ) { + Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] ); + } + argv[ i - 1 ] = NULL; + AddPakPath( argv[ i ] ); + argv[ i ] = NULL; + } } - + /* remove processed arguments */ - for( i = 0, j = 0, k = 0; i < *argc && j < *argc; i++, j++ ) + for ( i = 0, j = 0, k = 0; i < *argc && j < *argc; i++, j++ ) { - for( ; j < *argc && argv[ j ] == NULL; j++ ); + for ( ; j < *argc && argv[ j ] == NULL; j++ ) ; argv[ i ] = argv[ j ]; - if( argv[ i ] != NULL ) + if ( argv[ i ] != NULL ) { k++; + } } *argc = k; - + /* add standard game path */ AddGamePath( game->gamePath ); - - /* if there is no base path set, figure it out */ - if( numBasePaths == 0 ) - { + + /* if there is no base path set, figure it out unless fs_nomagicpath is set */ + if ( numBasePaths == 0 && noBasePath == 0 && noMagicPath == 0 ) { /* this is another crappy replacement for SetQdirFromPath() */ len2 = strlen( game->magic ); - for( i = 0; i < *argc && numBasePaths == 0; i++ ) + for ( i = 0; i < *argc && numBasePaths == 0; i++ ) { /* extract the arg */ strcpy( temp, argv[ i ] ); CleanPath( temp ); len = strlen( temp ); Sys_FPrintf( SYS_VRB, "Searching for \"%s\" in \"%s\" (%d)...\n", game->magic, temp, i ); - + /* this is slow, but only done once */ - for( j = 0; j < (len - len2); j++ ) + for ( j = 0; j < ( len - len2 ); j++ ) { /* check for the game's magic word */ - if( Q_strncasecmp( &temp[ j ], game->magic, len2 ) == 0 ) - { + if ( Q_strncasecmp( &temp[ j ], game->magic, len2 ) == 0 ) { /* now find the next slash and nuke everything after it */ - while( temp[ ++j ] != '/' && temp[ j ] != '\0' ); + while ( temp[ ++j ] != '/' && temp[ j ] != '\0' ) ; temp[ j ] = '\0'; - + /* add this as a base path */ AddBasePath( temp ); break; } } } - + /* add install path */ - if( numBasePaths == 0 ) + if ( numBasePaths == 0 ) { AddBasePath( installPath ); - + } + /* check again */ - if( numBasePaths == 0 ) + if ( numBasePaths == 0 ) { Error( "Failed to find a valid base path." ); + } } - - /* this only affects unix */ - if(homeBasePath) - AddHomeBasePath( homeBasePath ); - else - AddHomeBasePath( game->homeBasePath ); - + + if ( noBasePath == 1 ) { + numBasePaths = 0; + } + + if ( noHomePath == 0 ) { + /* this only affects unix */ + if ( homeBasePath ) { + AddHomeBasePath( homeBasePath ); + } + else{ + AddHomeBasePath( game->homeBasePath ); + } + } + /* initialize vfs paths */ - if( numBasePaths > MAX_BASE_PATHS ) + if ( numBasePaths > MAX_BASE_PATHS ) { numBasePaths = MAX_BASE_PATHS; - if( numGamePaths > MAX_GAME_PATHS ) + } + if ( numGamePaths > MAX_GAME_PATHS ) { numGamePaths = MAX_GAME_PATHS; - + } + /* walk the list of game paths */ - for( j = 0; j < numGamePaths; j++ ) + for ( j = 0; j < numGamePaths; j++ ) { /* walk the list of base paths */ - for( i = 0; i < numBasePaths; i++ ) + for ( i = 0; i < numBasePaths; i++ ) { /* create a full path and initialize it */ sprintf( temp, "%s/%s/", basePaths[ i ], gamePaths[ j ] ); vfsInitDirectory( temp ); } } - - /* done */ - Sys_Printf( "\n" ); -} - + /* initialize vfs paths */ + if ( numPakPaths > MAX_PAK_PATHS ) { + numPakPaths = MAX_PAK_PATHS; + } + /* walk the list of pak paths */ + for ( i = 0; i < numPakPaths; i++ ) + { + /* initialize this pak path */ + vfsInitDirectory( pakPaths[ i ] ); + } + /* done */ + Sys_Printf( "\n" ); +}