]> git.jsancho.org Git - lugaru.git/commitdiff
Handle case mismatch in filenames.
authorRyan C. Gordon <icculus@icculus.org>
Fri, 5 Aug 2005 18:01:51 +0000 (18:01 +0000)
committerRyan C. Gordon <icculus@icculus.org>
Fri, 5 Aug 2005 18:01:51 +0000 (18:01 +0000)
Source/MacCompatibility.cpp

index fa28ba02799049b18a4465a34f7395f718757f7e..b05d2b91bc27541fbc6ebec0459dce6a648b6685 100644 (file)
@@ -120,6 +120,78 @@ Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b)
 }
 
 
+#if PLATFORM_UNIX
+#include <sys/types.h>
+#include <dirent.h>
+
+// public domain code from PhysicsFS: http://icculus.org/physfs/
+static int locateOneElement(char *buf)
+{
+    char *ptr;
+    char **rc;
+    char **i;
+    DIR *dirp;
+
+    //if (PHYSFS_exists(buf))
+    if (access(buf, F_OK) == 0)
+        return(1);  /* quick rejection: exists in current case. */
+
+    ptr = strrchr(buf, '/');  /* find entry at end of path. */
+    if (ptr == NULL)
+    {
+        dirp = opendir(".");
+        ptr = buf;
+    } /* if */
+    else
+    {
+        *ptr = '\0';
+        dirp = opendir(buf);
+        *ptr = '/';
+        ptr++;  /* point past dirsep to entry itself. */
+    } /* else */
+
+    struct dirent *dent;
+    while ((dent = readdir(dirp)) != NULL)
+    {
+        if (stricmp(dent->d_name, ptr) == 0)
+        {
+            strcpy(ptr, dent->d_name); /* found a match. Overwrite with this case. */
+            closedir(dirp);
+            return(1);
+        } /* if */
+    } /* for */
+
+    /* no match at all... */
+    closedir(dirp);
+    return(0);
+} /* locateOneElement */
+
+
+static inline int PHYSFSEXT_locateCorrectCase(char *buf)
+{
+    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. */
+    } /* while */
+
+    /* check final element... */
+    return(locateOneElement(buf) ? 0 : -1);
+} /* PHYSFSEXT_locateCorrectCase */
+#endif
+
+
 static char g_filename[ 256];
 char* ConvertFileName( const char* orgfilename)
 {
@@ -134,6 +206,10 @@ char* ConvertFileName( const char* orgfilename)
                        g_filename[ n] = '/';
        }
 
+    #if PLATFORM_UNIX
+    PHYSFSEXT_locateCorrectCase(g_filename);
+    #endif
+
        return g_filename;
 }