diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 1ccb3031b..9bf50b72a 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,9 @@ +September 9, 2009 +- Look for files in Mac-like places on Macs. +- Fixed: The non-Windows CreatePath can fail if part of the path already + exists, because mkdir will return an error code for trying to recreate + an existing directory. + September 8, 2009 - Because entryway timed it, here is a new version of R_PointToAngle2 that is closer to the original. The old code was shorter but a little slower. The diff --git a/src/cmdlib.cpp b/src/cmdlib.cpp index b00a1d24c..9942d27fc 100644 --- a/src/cmdlib.cpp +++ b/src/cmdlib.cpp @@ -512,12 +512,17 @@ void CreatePath(const char *fn) { *p = '\0'; } - printf("%s\n", copy); + struct stat info; + if (stat(copy, &info) == 0) + { + if (info.st_mode & S_IFDIR) + goto exists; + } if (mkdir(copy, 0755) == -1) { // failed return; } - if (p != NULL) +exists: if (p != NULL) { *p = '/'; } diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index c20ce0618..b1270729a 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -396,34 +396,6 @@ static int CheckIWAD (const char *doomwaddir, WadStuff *wads) return numfound; } -//========================================================================== -// -// CheckIWADinEnvDir -// -// Checks for an IWAD in a path that contains one or more environment -// variables. -// -//========================================================================== - -static int CheckIWADinEnvDir (const char *str, WadStuff *wads) -{ - FString expanded = ExpandEnvVars (str); - - if (!expanded.IsEmpty()) - { - char *dir = expanded.LockBuffer (); - FixPathSeperator (dir); - expanded.UnlockBuffer (); - if (expanded[expanded.Len() - 1] != '/') - { - expanded += '/'; - } - return CheckIWAD (expanded, wads); - } - return false; -} - - //========================================================================== // // IdentifyVersion @@ -484,21 +456,10 @@ static EIWADType IdentifyVersion (const char *zdoom_wad) { if (stricmp (key, "Path") == 0) { - if (strchr (value, '$') != NULL) - { - CheckIWADinEnvDir (value, wads); - } -#ifdef unix - else if (*value == '~' && (*(value + 1) == 0 || *(value + 1) == '/')) - { - FString homepath = GetUserFile (*(value + 1) ? value + 2 : value + 1, true); - CheckIWAD (homepath, wads); - } -#endif - else - { - CheckIWAD (value, wads); - } + FString nice = NicePath(value); + FixPathSeperator(nice.LockBuffer()); + nice.UnlockBuffer(); + CheckIWAD(nice, wads); } } } diff --git a/src/d_main.cpp b/src/d_main.cpp index 2e7aaa929..6581db7e8 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1426,34 +1426,12 @@ static const char *BaseFileSearch (const char *file, const char *ext, bool lookf { if (stricmp (key, "Path") == 0) { - const char *dir; - FString homepath; + FString dir; - if (*value == '$') + dir = NicePath(value); + if (dir.IsNotEmpty()) { - if (stricmp (value + 1, "progdir") == 0) - { - dir = progdir; - } - else - { - dir = getenv (value + 1); - } - } -#ifdef unix - else if (*value == '~' && (*(value + 1) == 0 || *(value + 1) == '/')) - { - homepath = GetUserFile (*(value + 1) ? value + 2 : value + 1, true); - dir = homepath; - } -#endif - else - { - dir = value; - } - if (dir != NULL) - { - mysnprintf (wad, countof(wad), "%s%s%s", dir, dir[strlen (dir) - 1] != '/' ? "/" : "", file); + mysnprintf (wad, countof(wad), "%s%s%s", dir.GetChars(), dir[dir.Len() - 1] != '/' ? "/" : "", file); if (DirEntryExists (wad)) { return wad; @@ -1862,7 +1840,7 @@ void D_DoomMain (void) Printf ("%s", GStrings("D_DEVSTR")); } -#ifndef unix +#if !defined(unix) && !defined(__APPLE__) // We do not need to support -cdrom under Unix, because all the files // that would go to c:\\zdoomdat are already stored in .zdoom inside // the user's home directory. diff --git a/src/g_game.cpp b/src/g_game.cpp index 71c1061f4..b0291615b 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -27,6 +27,9 @@ #include #include #include +#ifdef __APPLE__ +#include +#endif #include "templates.h" #include "version.h" @@ -1812,7 +1815,7 @@ FString G_BuildSaveName (const char *prefix, int slot) leader = Args->CheckValue ("-savedir"); if (leader.IsEmpty()) { -#ifndef unix +#if !defined(unix) && !defined(__APPLE__) if (Args->CheckParm ("-cdrom")) { leader = CDROM_DIR "/"; @@ -1827,6 +1830,18 @@ FString G_BuildSaveName (const char *prefix, int slot) { leader = "~/" GAME_DIR; } +#elif defined(__APPLE__) + if (leader.IsEmpty()) + { + char cpath[PATH_MAX]; + FSRef folder; + + if (noErr == FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + leader << cpath << "/" GAME_DIR "/Savegames/"; + } + } #endif } size_t len = leader.Len(); diff --git a/src/gameconfigfile.cpp b/src/gameconfigfile.cpp index 173f7287a..09faee2c0 100644 --- a/src/gameconfigfile.cpp +++ b/src/gameconfigfile.cpp @@ -78,6 +78,9 @@ EXTERN_CVAR (Bool, wi_percents) FGameConfigFile::FGameConfigFile () { +#ifdef __APPLE__ + FString user_docs, user_app_support, local_app_support; +#endif FString pathname; bMigrating = false; @@ -102,11 +105,38 @@ FGameConfigFile::FGameConfigFile () SetSection ("IWADSearch.Directories", true); SetValueForKey ("Path", ".", true); SetValueForKey ("Path", "$DOOMWADDIR", true); -#ifndef unix +#ifdef __APPLE__ + char cpath[PATH_MAX]; + FSRef folder; + + if (noErr == FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + user_docs << cpath << "/" GAME_DIR; + SetValueForKey("Path", user_docs, true); + } + else + { + SetValueForKey("Path", "~/" GAME_DIR, true); + } + if (noErr == FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + user_app_support << cpath << "/" GAME_DIR; + SetValueForKey("Path", user_app_support, true); + } + SetValueForKey ("Path", "$PROGDIR", true); + if (noErr == FSFindFolder(kLocalDomain, kApplicationSupportFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + local_app_support << cpath << "/" GAME_DIR; + SetValueForKey("Path", local_app_support, true); + } +#elif !defined(unix) SetValueForKey ("Path", "$HOME", true); SetValueForKey ("Path", "$PROGDIR", true); #else - SetValueForKey ("Path", HOME_DIR, true); + SetValueForKey ("Path", "~/" GAME_DIR, true); SetValueForKey ("Path", SHARE_DIR, true); #endif } @@ -115,7 +145,12 @@ FGameConfigFile::FGameConfigFile () if (!SetSection ("FileSearch.Directories")) { SetSection ("FileSearch.Directories", true); -#ifndef unix +#ifdef __APPLE__ + SetValueForKey ("Path", user_docs, true); + SetValueForKey ("Path", user_app_support, true); + SetValueForKey ("Path", "$PROGDIR", true); + SetValueForKey ("Path", local_app_support, true); +#elif !defined(unix) SetValueForKey ("Path", "$PROGDIR", true); #else SetValueForKey ("Path", SHARE_DIR, true); @@ -576,7 +611,16 @@ void FGameConfigFile::CreateStandardAutoExec(const char *section, bool start) if (!SetSection(section)) { FString path; -#ifndef unix +#ifdef __APPLE__ + char cpath[PATH_MAX]; + FSRef folder; + + if (noErr == FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + path << cpath << "/" GAME_DIR "/autoexec.cfg"; + } +#elif !defined(unix) path = "$PROGDIR/autoexec.cfg"; #else path = GetUserFile ("autoexec.cfg"); diff --git a/src/m_misc.cpp b/src/m_misc.cpp index 5d2cd7a2a..e973a4ca9 100644 --- a/src/m_misc.cpp +++ b/src/m_misc.cpp @@ -31,6 +31,9 @@ #include #include #include +#ifdef __APPLE__ +#include +#endif #include "doomtype.h" #include "version.h" @@ -299,33 +302,25 @@ static long ParseCommandLine (const char *args, int *argc, char **argv) #if defined(unix) -FString GetUserFile (const char *file, bool nodir) +FString GetUserFile (const char *file) { FString path; + struct stat info; - if (nodir) + path = NicePath("~/" GAME_DIR "/"); + if (stat (path, &info) == -1) { - path = NicePath("~/"); + if (mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR) == -1) + { + I_FatalError ("Failed to create %s directory:\n%s", + path.GetChars(), strerror (errno)); + } } else { - struct stat info; - - path = NicePath("~/" GAME_DIR "/"); - if (stat (path, &info) == -1) + if (!S_ISDIR(info.st_mode)) { - if (mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR) == -1) - { - I_FatalError ("Failed to create %s directory:\n%s", - path.GetChars(), strerror (errno)); - } - } - else - { - if (!S_ISDIR(info.st_mode)) - { - I_FatalError ("%s must be a directory", path.GetChars()); - } + I_FatalError ("%s must be a directory", path.GetChars()); } } path += file; @@ -638,7 +633,7 @@ void M_ScreenShot (const char *filename) // find a file name to save it to if (filename == NULL || filename[0] == '\0') { -#ifndef unix +#if !defined(unix) && !defined(__APPLE__) if (Args->CheckParm ("-cdrom")) { autoname = CDROM_DIR "\\"; @@ -652,11 +647,24 @@ void M_ScreenShot (const char *filename) { autoname = screenshot_dir; } - dirlen = strlen(autoname); + dirlen = autoname.Len(); if (dirlen == 0) { #ifdef unix autoname = "~/.zdoom/screenshots/"; +#elif defined(__APPLE__) + char cpath[PATH_MAX]; + FSRef folder; + + if (noErr == FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &folder) && + noErr == FSRefMakePath(&folder, (UInt8*)cpath, PATH_MAX)) + { + autoname << cpath << "/" GAME_DIR "/Screenshots/"; + } + else + { + autoname = "~"; + } #else autoname = progdir; #endif diff --git a/src/m_misc.h b/src/m_misc.h index 7f9b185b8..1a7b17a96 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -43,6 +43,7 @@ void M_LoadDefaults (); bool M_SaveDefaults (const char *filename); void M_SaveCustomKeys (FConfigFile *config, char *section, char *subsection, size_t sublen); -FString GetUserFile (const char *path, bool nodir=false); +// Prepends ~/.zdoom to path +FString GetUserFile (const char *path); #endif diff --git a/src/version.h b/src/version.h index b473ea69a..a6b02e748 100644 --- a/src/version.h +++ b/src/version.h @@ -112,8 +112,9 @@ static inline const char *MakeSaveSig() #define BUGS_FORUM_URL "http://forum.zdoom.org/index.php?c=3" #ifdef unix -#define HOME_DIR "~/.zdoom" #define GAME_DIR ".zdoom" +#elif defined(__APPLE__) +#define GAME_DIR GAMENAME #else #define CDROM_DIR "C:\\ZDOOMDAT" #endif