From 02a1066d7344af2c79ea3b49ef853675c306f891 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 9 Aug 2025 13:40:07 -0400 Subject: [PATCH] [PATCH] Don't search the entire path for wads Thanks Alug --- src/sdl/i_system.cpp | 166 ++++++++++++++++++------------------------- 1 file changed, 68 insertions(+), 98 deletions(-) diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index c12174116..e34681af6 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -144,16 +144,32 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); #define UNIXBACKTRACE #endif -// Locations for searching for main.pk3 +const char *wadDefaultPaths[] = { #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) -#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart-V2" -#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart-V2" -#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart-V2" -#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart-V2" -#define DEFAULTSEARCHPATH1 "/usr/local/games" -#define DEFAULTSEARCHPATH2 "/usr/games" -#define DEFAULTSEARCHPATH3 "/usr/local" + "/usr/local/share/games/SRB2Kart-V2", + "/usr/local/games/SRB2Kart-V2", + "/usr/share/games/SRB2Kart-V2", + "/usr/games/SRB2Kart-V2", +#elif defined (_WIN32) + "c:\\games\\SRB2Kart-V2", + "\\games\\SRB2Kart-V2", #endif + NULL +}; + +// Folders to recurse through looking for main.pk3 +const char *wadSearchPaths[] = { +#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) + "/usr/local/games", + "/usr/games", + "/usr/local", +#elif defined (_WIN32) + "c:\\games", + "\\games", +#endif + NULL +}; + /** \brief WAD file to look for */ @@ -2415,15 +2431,29 @@ static const char *searchWad(const char *searchDir) return NULL; } +#define CHECKWADPATH(ret) \ +do { \ + I_OutputMsg(",%s", ret); \ + if (isWadPathOk(ret)) \ + return ret; \ +} while (0) + +#define SEARCHWAD(str) \ +do { \ + WadPath = searchWad(str); \ + if (WadPath) \ + return WadPath; \ +} while (0) + /** \brief go through all possible paths and look for main.pk3 - - \return path to main.pk3 if any - -*/ + * + * \return path to main.pk3 if any + */ static const char *locateWad(void) { const char *envstr; const char *WadPath; + int i; I_OutputMsg("SRB2WADDIR"); // does SRB2WADDIR exist? @@ -2431,108 +2461,46 @@ static const char *locateWad(void) return envstr; #ifndef NOCWD - I_OutputMsg(",."); // examine current dir strcpy(returnWadPath, "."); + I_OutputMsg(",%s", returnWadPath); if (isWadPathOk(returnWadPath)) return NULL; #endif - -#ifdef DEFAULTDIR - I_OutputMsg(",HOME/" DEFAULTDIR); - // examine user jart directory - if ((envstr = I_GetEnv("HOME")) != NULL) - { - sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr); - if (isWadPathOk(returnWadPath)) - return returnWadPath; - } -#endif - #ifdef __APPLE__ OSX_GetResourcesPath(returnWadPath); - I_OutputMsg(",%s", returnWadPath); - if (isWadPathOk(returnWadPath)) - { - return returnWadPath; - } + CHECKWADPATH(returnWadPath); #endif // examine default dirs -#ifdef DEFAULTWADLOCATION1 - I_OutputMsg("," DEFAULTWADLOCATION1); - strcpy(returnWadPath, DEFAULTWADLOCATION1); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION2 - I_OutputMsg("," DEFAULTWADLOCATION2); - strcpy(returnWadPath, DEFAULTWADLOCATION2); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION3 - I_OutputMsg("," DEFAULTWADLOCATION3); - strcpy(returnWadPath, DEFAULTWADLOCATION3); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION4 - I_OutputMsg("," DEFAULTWADLOCATION4); - strcpy(returnWadPath, DEFAULTWADLOCATION4); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION5 - I_OutputMsg("," DEFAULTWADLOCATION5); - strcpy(returnWadPath, DEFAULTWADLOCATION5); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION6 - I_OutputMsg("," DEFAULTWADLOCATION6); - strcpy(returnWadPath, DEFAULTWADLOCATION6); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif -#ifdef DEFAULTWADLOCATION7 - I_OutputMsg("," DEFAULTWADLOCATION7); - strcpy(returnWadPath, DEFAULTWADLOCATION7); - if (isWadPathOk(returnWadPath)) - return returnWadPath; -#endif + for (i = 0; wadDefaultPaths[i]; i++) + { + strcpy(returnWadPath, wadDefaultPaths[i]); + CHECKWADPATH(returnWadPath); + } + #ifndef NOHOME // find in $HOME - I_OutputMsg(",HOME"); + I_OutputMsg(",HOME/" DEFAULTDIR); if ((envstr = I_GetEnv("HOME")) != NULL) { - WadPath = searchWad(envstr); - if (WadPath) - return WadPath; + char *tmp = static_cast(malloc(strlen(envstr) + sizeof(PATHSEP) + sizeof(DEFAULTDIR))); + strcpy(tmp, envstr); + strcat(tmp, PATHSEP); + strcat(tmp, DEFAULTDIR); + CHECKWADPATH(tmp); + free(tmp); } -#endif -#ifdef DEFAULTSEARCHPATH1 - // find in /usr/local - I_OutputMsg(", in:" DEFAULTSEARCHPATH1); - WadPath = searchWad(DEFAULTSEARCHPATH1); - if (WadPath) - return WadPath; -#endif -#ifdef DEFAULTSEARCHPATH2 - // find in /usr/games - I_OutputMsg(", in:" DEFAULTSEARCHPATH2); - WadPath = searchWad(DEFAULTSEARCHPATH2); - if (WadPath) - return WadPath; -#endif -#ifdef DEFAULTSEARCHPATH3 - // find in ??? - I_OutputMsg(", in:" DEFAULTSEARCHPATH3); - WadPath = searchWad(DEFAULTSEARCHPATH3); - if (WadPath) - return WadPath; -#endif + #endif + + // search paths + for (i = 0; wadSearchPaths[i]; i++) + { + I_OutputMsg(", in:%s", wadSearchPaths[i]); + SEARCHWAD(wadSearchPaths[i]); + } + // if nothing was found return NULL; } @@ -2549,8 +2517,10 @@ const char *I_LocateWad(void) { // change to the directory where we found main.pk3 #if defined (_WIN32) + waddir = _fullpath(NULL, waddir, MAX_PATH); SetCurrentDirectoryA(waddir); #else + waddir = realpath(waddir, NULL); if (chdir(waddir) == -1) I_OutputMsg("Couldn't change working directory\n"); #endif