From c26c5303fbc3fcc607681b848bc4fd0641320691 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 7 Aug 2005 15:30:52 +0000 Subject: [PATCH] More prefpath fixes. --- Source/DRIVER.CC | 2 +- Source/GameDraw.cpp | 3 +- Source/GameTick.cpp | 21 ++++----- Source/MacCompatibility.cpp | 85 ++++++++++++++++++++++++++++++++----- Source/MacCompatibility.h | 4 +- Source/OpenGL_Windows.cpp | 6 +-- Source/fmod.h | 7 +-- 7 files changed, 90 insertions(+), 38 deletions(-) diff --git a/Source/DRIVER.CC b/Source/DRIVER.CC index 7a654bb..fba567b 100644 --- a/Source/DRIVER.CC +++ b/Source/DRIVER.CC @@ -144,7 +144,7 @@ static void MD5_testSuite () static void MD5_file (char *filename){ - ifstream file(filename); + ifstream file(ConvertFileName(filename)); if (!file) cerr << filename <<" can't be opened" << endl; diff --git a/Source/GameDraw.cpp b/Source/GameDraw.cpp index d35125e..b321e7e 100644 --- a/Source/GameDraw.cpp +++ b/Source/GameDraw.cpp @@ -2250,8 +2250,7 @@ int Game::DrawGLScene(GLvoid) } if(lastcheck>.5||oldmainmenu!=mainmenu){ if(mainmenu==5){ - // ifstream ipstream(":Data:Campaigns:main.txt"); - ifstream ipstream("./Data/Campaigns/main.txt"); + ifstream ipstream(ConvertFileName(":Data:Campaigns:main.txt")); //campaignnumlevels=0; //accountcampaignchoicesmade[accountactive]=0; ipstream.ignore(256,':'); diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index eeb0619..de6c79e 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -213,7 +213,7 @@ void Screenshot (void) char temp[1024]; time_t t = time(NULL); struct tm *tme = localtime(&t); - sprintf(temp, "Screenshots/Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec); + sprintf(temp, "Screenshots\\Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec); mkdir("Screenshots", S_IRWXU); ScreenShot(temp/*"Screenshots\\Screenshot.png"*/); @@ -1849,8 +1849,7 @@ void Game::Tick() if(newscreenheight>3000)newscreenheight=screenheight; if(newscreenheight<0)newscreenheight=screenheight; - //ofstream opstream(":Data:config.txt"); - ofstream opstream("./Data/config.txt"); + ofstream opstream(ConvertFileName(":Data:config.txt", "w")); opstream << "Screenwidth:\n"; opstream << newscreenwidth; opstream << "\nScreenheight:\n"; @@ -2246,8 +2245,7 @@ void Game::Tick() if(newscreenheight<0)newscreenheight=screenheight; - //ofstream opstream(":Data:config.txt"); - ofstream opstream("./Data/config.txt"); + ofstream opstream(ConvertFileName(":Data:config.txt", "w")); opstream << "Screenwidth:\n"; opstream << newscreenwidth; opstream << "\nScreenheight:\n"; @@ -2992,8 +2990,7 @@ void Game::Tick() if(newscreenheight>3000)newscreenheight=screenheight; if(newscreenheight<0)newscreenheight=screenheight; - //ofstream opstream(":Data:config.txt"); - ofstream opstream("./Data/config.txt"); + ofstream opstream(ConvertFileName(":Data:config.txt", "w")); opstream << "Screenwidth:\n"; opstream << newscreenwidth; opstream << "\nScreenheight:\n"; @@ -4518,7 +4515,7 @@ void Game::Tick() } } - ifstream ipstream(mapname); + ifstream ipstream(ConvertFileName(mapname)); ipstream.ignore(256,':'); ipstream >> numdialogueboxes[numdialogues]; for(i=0;i> numdialogueboxes[whichdi]; for(i=0;i3000)newscreenheight=screenheight; if(newscreenheight<0)newscreenheight=screenheight; - //ofstream opstream(":Data:config.txt"); - ofstream opstream("./Data/config.txt"); + ofstream opstream(ConvertFileName(":Data:config.txt", "w")); opstream << "Screenwidth:\n"; opstream << newscreenwidth; opstream << "\nScreenheight:\n"; @@ -11346,8 +11342,7 @@ void Game::TickOnceAfter(){ startbonustotal=0; - // ifstream ipstream(":Data:Campaigns:main.txt"); - ifstream ipstream("./Data/Campaigns/main.txt"); + ifstream ipstream(ConvertFileName(":Data:Campaigns:main.txt")); //campaignnumlevels=0; //accountcampaignchoicesmade[accountactive]=0; ipstream.ignore(256,':'); diff --git a/Source/MacCompatibility.cpp b/Source/MacCompatibility.cpp index b05d2b9..dfedc9a 100644 --- a/Source/MacCompatibility.cpp +++ b/Source/MacCompatibility.cpp @@ -122,9 +122,13 @@ Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b) #if PLATFORM_UNIX #include +#include +#include +#include #include -// public domain code from PhysicsFS: http://icculus.org/physfs/ +// some but not all of this is code from PhysicsFS: http://icculus.org/physfs/ +// the zlib license on physfs allows this cut-and-pasting. static int locateOneElement(char *buf) { char *ptr; @@ -167,33 +171,89 @@ static int locateOneElement(char *buf) } /* locateOneElement */ -static inline int PHYSFSEXT_locateCorrectCase(char *buf) +static inline const char *getUserDirByUID(void) +{ + struct passwd *pw = getpwuid(getuid()); + if (pw != NULL) + return(pw->pw_dir); + return(NULL); +} /* getUserDirByUID */ + + +static inline const char *getPrefPath(void) +{ + static char *prefpath = NULL; + if (prefpath == NULL) + { + const char *homedir = getenv("HOME"); + if (homedir == NULL) + homedir = getUserDirByUID(); + if (homedir == NULL) + homedir = "."; // oh well. + + const char *PREFPATHNAME = ".lugaru"; + size_t len = strlen(homedir) + strlen(PREFPATHNAME) + 2; + prefpath = new char[len]; + snprintf(prefpath, len, "%s/%s", homedir, PREFPATHNAME); + } + return(prefpath); +} + +static int locateCorrectCase(char *buf, bool makedirs) { int rc; char *ptr; char *prevptr; ptr = prevptr = buf; - if (*ptr == '\0') - return(0); /* Uh...I guess that's success. */ - while (ptr = strchr(ptr + 1, '/')) { *ptr = '\0'; /* block this path section off */ rc = locateOneElement(buf); - *ptr = '/'; /* restore path separator */ if (!rc) - return(-2); /* missing element in path. */ + { + if (makedirs) /* normal if we're writing; build dirs! */ + mkdir(buf, S_IRWXU); + else + { + *ptr = '/'; /* restore path separator */ + return(-2); /* missing element in path. */ + } /* else */ + } /* if */ + *ptr = '/'; /* restore path separator */ } /* while */ /* check final element... */ return(locateOneElement(buf) ? 0 : -1); -} /* PHYSFSEXT_locateCorrectCase */ +} + + +static int locateCorrectFile(char *buf, const char *mode) +{ + if (*buf == '\0') + return(0); /* Uh...I guess that's failure. */ + + assert((mode[0] == 'w') || (mode[0] == 'r')); + + bool iswriting = (mode[0] == 'w'); + const char *prefpath = getPrefPath(); + size_t len = strlen(buf) + strlen(prefpath) + 2; + char *prefpathfile = (char *) alloca(len); + snprintf(prefpathfile, len, "%s/%s", prefpath, buf); + + int rc = locateCorrectCase(prefpathfile, iswriting); /* favor prefpath. */ + if (rc == 0) // found? + strcpy(buf, prefpathfile); + else if ((rc < 0) && (!iswriting)) /* not writing? Try game dir... */ + rc = locateCorrectCase(buf, iswriting); + + return(rc); +} /* locateCorrectFile */ #endif -static char g_filename[ 256]; -char* ConvertFileName( const char* orgfilename) +static char g_filename[4096]; +char* ConvertFileName( const char* orgfilename, const char *mode) { // translate filename into proper path name if (orgfilename[ 0] == ':') @@ -204,10 +264,13 @@ char* ConvertFileName( const char* orgfilename) { if (g_filename[ n] == ':') g_filename[ n] = '/'; + + else if (g_filename[ n] == '\\') + g_filename[ n] = '/'; } #if PLATFORM_UNIX - PHYSFSEXT_locateCorrectCase(g_filename); + locateCorrectFile(g_filename, mode); #endif return g_filename; diff --git a/Source/MacCompatibility.h b/Source/MacCompatibility.h index d1096ae..808c057 100644 --- a/Source/MacCompatibility.h +++ b/Source/MacCompatibility.h @@ -83,9 +83,9 @@ typedef unsigned int uintptr_t; // fix file names to use '/' instead of ':' -char* ConvertFileName( const char* orgfilename); +char* ConvertFileName( const char* orgfilename, const char *mode = "rb" ); -#define fopen( a, b) fopen( ConvertFileName( a), b) +#define fopen( a, b) fopen(ConvertFileName(a, b), b) /* inline float abs( float f) { diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 5c8f491..155a3a2 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -549,8 +549,7 @@ Boolean SetUp (Game & game) randSeed = UpTime().lo; osx = 0; -// ifstream ipstream(":Data:config.txt", std::ios::in /*| std::ios::nocreate*/); - ifstream ipstream("./Data/config.txt", std::ios::in /*| std::ios::nocreate*/); + ifstream ipstream(ConvertFileName(":Data:config.txt"), std::ios::in /*| std::ios::nocreate*/); detail=1; ismotionblur=0; usermousesensitivity=1; @@ -600,8 +599,7 @@ Boolean SetUp (Game & game) selectDetail(kContextWidth, kContextHeight, kBitsPerPixel, detail); if(!ipstream) { - //ofstream opstream(":Data:config.txt"); - ofstream opstream("./Data/config.txt"); + ofstream opstream(ConvertFileName(":Data:config.txt", "w")); opstream << "Screenwidth:\n"; opstream << kContextWidth; opstream << "\nScreenheight:\n"; diff --git a/Source/fmod.h b/Source/fmod.h index 3c4ef66..bb5a048 100644 --- a/Source/fmod.h +++ b/Source/fmod.h @@ -7,12 +7,9 @@ #include "MacCompatibility.h" -#ifdef WIN32 - -#define FSOUND_Sample_Load( a, b, c, d) FSOUND_Sample_Load( a, ConvertFileName( b), c, d, 0); - +#if !PLATFORM_MACOSX +#define FSOUND_Sample_Load( a, b, c, d, e) FSOUND_Sample_Load( a, ConvertFileName( b), c, d, e); #endif - #endif -- 2.39.2