X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FMacCompatibility.cpp;h=b05d2b91bc27541fbc6ebec0459dce6a648b6685;hb=bcb5c54b2b6170c185583c18f5ec97b0bb813f0a;hp=0559257f315ed1a1872b6645e85b0e1e154a6d72;hpb=36cc3af3e5074215817ddee16defde754e2ad67f;p=lugaru.git diff --git a/Source/MacCompatibility.cpp b/Source/MacCompatibility.cpp index 0559257..b05d2b9 100644 --- a/Source/MacCompatibility.cpp +++ b/Source/MacCompatibility.cpp @@ -2,12 +2,21 @@ /**> HEADER FILES <**/ #include "MacCompatibility.h" + +#ifdef WIN32 #include +#endif + #include #include #include +#include +#include #if PLATFORM_UNIX +#include +#include +#include typedef long long __int64; typedef __int64 LARGE_INTEGER; static int QueryPerformanceFrequency(LARGE_INTEGER *liptr) @@ -18,7 +27,7 @@ static int QueryPerformanceFrequency(LARGE_INTEGER *liptr) return(1); } -static void QueryPerformanceCounter(LARGE_INTEGER *liptr) +static int QueryPerformanceCounter(LARGE_INTEGER *liptr) { struct timeval tv; gettimeofday(&tv, NULL); @@ -111,6 +120,78 @@ Duration AbsoluteDeltaToDuration( AbsoluteTime& a, AbsoluteTime& b) } +#if PLATFORM_UNIX +#include +#include + +// 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) { @@ -125,6 +206,10 @@ char* ConvertFileName( const char* orgfilename) g_filename[ n] = '/'; } + #if PLATFORM_UNIX + PHYSFSEXT_locateCorrectCase(g_filename); + #endif + return g_filename; }