]> git.jsancho.org Git - lugaru.git/commitdiff
More prefpath fixes.
authorRyan C. Gordon <icculus@icculus.org>
Sun, 7 Aug 2005 15:30:52 +0000 (15:30 +0000)
committerRyan C. Gordon <icculus@icculus.org>
Sun, 7 Aug 2005 15:30:52 +0000 (15:30 +0000)
Source/DRIVER.CC
Source/GameDraw.cpp
Source/GameTick.cpp
Source/MacCompatibility.cpp
Source/MacCompatibility.h
Source/OpenGL_Windows.cpp
Source/fmod.h

index 7a654bb087dbad1e31819ab8ec7e11683906688a..fba567be08ce534349fbe15f2869888e0c3d3ed0 100644 (file)
@@ -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;
index d35125e267f2816cc037eb4067dbc480d89a07a8..b321e7ec0c450e392c24bdd6510bd914eb697348 100644 (file)
@@ -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,':');
index eeb0619b95c88764d37c4ceeb4784c51777cb3ed..de6c79ecf1ed1fd9d0bb80db9ad413ab61351ecd 100644 (file)
@@ -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[numdialogues];i++){
@@ -4611,7 +4608,7 @@ void      Game::Tick()
                                                                        }
                                                                }
 
-                                                               ifstream ipstream(mapname);
+                                                               ifstream ipstream(ConvertFileName(mapname));
                                                                ipstream.ignore(256,':');
                                                                ipstream >> numdialogueboxes[whichdi];
                                                                for(i=0;i<numdialogueboxes[whichdi];i++){
@@ -5631,8 +5628,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";
@@ -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,':');
index b05d2b91bc27541fbc6ebec0459dce6a648b6685..dfedc9a4b6490a084a0cd9904e2318549d0cecbe 100644 (file)
@@ -122,9 +122,13 @@ Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
 
 #if PLATFORM_UNIX
 #include <sys/types.h>
+#include <pwd.h>
+#include <fcntl.h>
+#include <unistd.h>
 #include <dirent.h>
 
-// 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;
index d1096ae609b28c5f058b74d249059a4f686164ba..808c057d0ceecf6a3ff9829e9b6a37e822fa1c65 100644 (file)
@@ -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)
 {
index 5c8f491fd2dfc67e38d413a840fb8cd505f3102d..155a3a2de920720ccabe39c2fa464fb16aec86e0 100644 (file)
@@ -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";
index 3c4ef660189bd84a5ebbcb86d3fd9a2eefa4b302..bb5a0485e2d33aedb5ff42400b831b8bde40be09 100644 (file)
@@ -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