]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/path_init.c
q3map2: dds/ prefix, print log at the right time, when image is found
[xonotic/netradiant.git] / tools / quake3 / q3map2 / path_init.c
index aa602fb2279884eb2bdeeb3ec296d448157eb244..322173c95509f9ea009959a36e3ecb4838414216 100644 (file)
 
    ------------------------------------------------------------------------------- */
 
-
-
 /* marker */
 #define PATH_INIT_C
 
-
-
 /* dependencies */
 #include "q3map2.h"
 
-
-
 /* path support */
 #define MAX_BASE_PATHS  10
 #define MAX_GAME_PATHS  10
 #define MAX_PAK_PATHS  200
 
+qboolean                               customHomePath = qfalse;
 char                    *homePath;
+
+#if GDEF_OS_MACOS
+char                                   *macLibraryApplicationSupportPath;
+#elif GDEF_OS_XDG
+char                    *xdgDataHomePath;
+#endif // GDEF_OS_XDG
+
 char installPath[ MAX_OS_PATH ];
 
 int numBasePaths;
@@ -66,9 +68,9 @@ char                    *homeBasePath = NULL;
  */
 
 char *LokiGetHomeDir( void ){
-       #ifndef Q_UNIX
+       #if GDEF_OS_WINDOWS
        return NULL;
-       #else
+       #else // !GDEF_OS_WINDOWS
        static char     buf[ 4096 ];
        struct passwd   pw, *pwp;
        char            *home;
@@ -86,7 +88,7 @@ char *LokiGetHomeDir( void ){
 
        /* return it */
        return home;
-       #endif
+       #endif // !GDEF_OS_WINDOWS
 }
 
 
@@ -113,10 +115,24 @@ void LokiInitPaths( char *argv0 ){
                home = homePath;
        }
 
-       #ifndef Q_UNIX
+       #if GDEF_OS_MACOS
+       char *subPath = "/Library/Application Support";
+       macLibraryApplicationSupportPath = safe_malloc( sizeof( char ) * ( strlen( home ) + strlen( subPath ) ) + 1 );
+       sprintf( macLibraryApplicationSupportPath, "%s%s", home, subPath );
+       #elif GDEF_OS_XDG
+       xdgDataHomePath = getenv( "XDG_DATA_HOME" );
+
+       if ( xdgDataHomePath == NULL ) {
+               char *subPath = "/.local/share";
+               xdgDataHomePath = safe_malloc( sizeof( char ) * ( strlen( home ) + strlen( subPath ) ) + 1 );
+               sprintf( xdgDataHomePath, "%s%s", home, subPath );
+       }
+       #endif // GDEF_OS_XDG
+
+       #if GDEF_OS_WINDOWS
        /* this is kinda crap, but hey */
        strcpy( installPath, "../" );
-       #else
+       #else // !GDEF_OS_WINDOWS
 
        char temp[ MAX_OS_PATH ];
        char *path;
@@ -199,7 +215,7 @@ void LokiInitPaths( char *argv0 ){
                *( strrchr( installPath, '/' ) ) = '\0';
                *( strrchr( installPath, '/' ) ) = '\0';
        }
-       #endif
+       #endif // !GDEF_OS_WINDOWS
 }
 
 
@@ -286,7 +302,7 @@ void AddBasePath( char *path ){
 
 /*
    AddHomeBasePath() - ydnar
-   adds a base path to the beginning of the list, prefixed by ~/
+   adds a base path to the beginning of the list
  */
 
 void AddHomeBasePath( char *path ){
@@ -307,8 +323,50 @@ void AddHomeBasePath( char *path ){
                strcpy( temp, homePath );
        }
        else {
+               char *tempHomePath;
+               tempHomePath = homePath;
+
+               /* homePath is . on Windows if not user supplied */
+
+               #if GDEF_OS_MACOS
+               /*
+                  use ${HOME}/Library/Application as ${HOME}
+                  if home path is not user supplied
+                  and strip the leading dot from prefix in any case
+                 
+                  basically it produces
+                  ${HOME}/Library/Application/unvanquished
+                  /user/supplied/home/path/unvanquished
+               */
+               tempHomePath = macLibraryApplicationSupportPath;
+               path = path + 1;
+               #elif GDEF_OS_XDG
+               /*
+                  on Linux, check if game uses ${XDG_DATA_HOME}/prefix instead of ${HOME}/.prefix
+                  if yes and home path is not user supplied
+                  use XDG_DATA_HOME instead of HOME
+                  and strip the leading dot
+
+                  basically it produces
+                  ${XDG_DATA_HOME}/unvanquished
+                  /user/supplied/home/path/unvanquished
+
+                  or
+                  ${HOME}/.q3a
+                  /user/supplied/home/path/.q3a
+                */
+
+               sprintf( temp, "%s/%s", xdgDataHomePath, ( path + 1 ) );
+               if ( access( temp, X_OK ) == 0 ) {
+                       if ( customHomePath == qfalse ) {
+                               tempHomePath = xdgDataHomePath;
+                       }
+                       path = path + 1;
+               }
+               #endif // GDEF_OS_XDG
+
                /* concatenate home dir and path */
-               sprintf( temp, "%s/%s", homePath, path );
+               sprintf( temp, "%s/%s", tempHomePath, path );
        }
 
        /* make a hole */
@@ -412,7 +470,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -game */
                if ( strcmp( argv[ i ], "-game" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No game specified after %s", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -425,7 +483,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_forbiddenpath */
                else if ( strcmp( argv[ i ], "-fs_forbiddenpath" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -453,7 +511,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_basepath */
                else if ( strcmp( argv[ i ], "-fs_basepath" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -463,7 +521,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_game */
                else if ( strcmp( argv[ i ], "-fs_game" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -473,10 +531,11 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_home */
                else if ( strcmp( argv[ i ], "-fs_home" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
+                       customHomePath = qtrue;
                        homePath = argv[i];
                        argv[ i ] = NULL;
                }
@@ -489,7 +548,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_homebase */
                else if ( strcmp( argv[ i ], "-fs_homebase" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -499,7 +558,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_homepath - sets both of them */
                else if ( strcmp( argv[ i ], "-fs_homepath" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;
@@ -510,7 +569,7 @@ void InitPaths( int *argc, char **argv ){
 
                /* -fs_pakpath */
                else if ( strcmp( argv[ i ], "-fs_pakpath" ) == 0 ) {
-                       if ( ++i >= *argc ) {
+                       if ( ++i >= *argc || !argv[ i ] ) {
                                Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
                        }
                        argv[ i - 1 ] = NULL;