mirror of
https://github.com/rehlds/rehlds.git
synced 2025-07-17 18:56:20 +03:00
parent
1571474af7
commit
ae2639d3df
@ -59,7 +59,7 @@ FILE *CFileSystem_Stdio::FS_fopen(const char *filename, const char *options, boo
|
|||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
if (!tst && !Q_strchr(options, 'w') && !Q_strchr(options, '+')) {
|
if (!tst && !Q_strchr(options, 'w') && !Q_strchr(options, '+')) {
|
||||||
const char *file = findFileInDirCaseInsensitive(filename);
|
const char *file = findFileInDirCaseInsensitive(filename);
|
||||||
tst = fopen(filename, options);
|
tst = fopen(file, options);
|
||||||
}
|
}
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
|
@ -258,7 +258,7 @@ typedef struct CaseFoldHashBucket
|
|||||||
|
|
||||||
#include "pathmatch_casefolding.h"
|
#include "pathmatch_casefolding.h"
|
||||||
|
|
||||||
inline static void locate_case_fold_mapping(const uint32_t from, uint32_t *to)
|
inline __attribute__((always_inline)) static void locate_case_fold_mapping(const uint32_t from, uint32_t *to)
|
||||||
{
|
{
|
||||||
const uint8_t hashed = ((from ^ (from >> 8)) & 0xFF);
|
const uint8_t hashed = ((from ^ (from >> 8)) & 0xFF);
|
||||||
const CaseFoldHashBucket *bucket = &case_fold_hash[hashed];
|
const CaseFoldHashBucket *bucket = &case_fold_hash[hashed];
|
||||||
@ -282,7 +282,7 @@ inline static void locate_case_fold_mapping(const uint32_t from, uint32_t *to)
|
|||||||
to[2] = 0;
|
to[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static uint32_t *fold_utf8(const char *str)
|
inline __attribute__((always_inline)) static uint32_t *fold_utf8(const char *str)
|
||||||
{
|
{
|
||||||
uint32_t *retval = new uint32_t[(Q_strlen(str) * 3) + 1];
|
uint32_t *retval = new uint32_t[(Q_strlen(str) * 3) + 1];
|
||||||
uint32_t *dst = retval;
|
uint32_t *dst = retval;
|
||||||
@ -313,7 +313,7 @@ inline static uint32_t *fold_utf8(const char *str)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static int utf8casecmp_loop(const uint32_t *folded1, const uint32_t *folded2)
|
inline __attribute__((always_inline)) static int utf8casecmp_loop(const uint32_t *folded1, const uint32_t *folded2)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@ -500,22 +500,6 @@ static bool Descend(char *pPath, size_t nStartIdx, bool bAllowBasenameMismatch,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *GetSteamContentPath()
|
|
||||||
{
|
|
||||||
char szContentLink[4096];
|
|
||||||
Q_snprintf(szContentLink, sizeof(szContentLink), "%s/.steam/steam", getenv("HOME"));
|
|
||||||
|
|
||||||
char *pszContentPath = realpath(szContentLink, nullptr);
|
|
||||||
if (pszContentPath) {
|
|
||||||
Q_strcat(pszContentPath, "/");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pszContentPath = Q_strdup("/");
|
|
||||||
}
|
|
||||||
|
|
||||||
return pszContentPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DO_PATHMATCH_CACHE
|
#ifdef DO_PATHMATCH_CACHE
|
||||||
typedef std::map<std::string, std::pair<std::string, time_t> > resultCache_t;
|
typedef std::map<std::string, std::pair<std::string, time_t> > resultCache_t;
|
||||||
typedef std::map<std::string, std::pair<std::string, time_t> >::iterator resultCacheItr_t;
|
typedef std::map<std::string, std::pair<std::string, time_t> >::iterator resultCacheItr_t;
|
||||||
@ -574,33 +558,39 @@ PathMod_t pathmatch(const char *pszIn, char **ppszOut, bool bAllowBasenameMismat
|
|||||||
|
|
||||||
if (pPath)
|
if (pPath)
|
||||||
{
|
{
|
||||||
|
// I believe this code is broken. I'm guessing someone wanted to avoid lowercasing
|
||||||
|
// the path before the steam directory - but it's actually skipping lowercasing
|
||||||
|
// whenever steam is found anywhere - including the filename. For example,
|
||||||
|
// /home/mikesart/valvesrc/console/l4d2/game/left4dead2_dlc1/particles/steam_fx.pcf
|
||||||
|
// winds up only having the "steam_fx.pcf" portion lowercased.
|
||||||
|
#ifdef NEVER
|
||||||
// optimization, if the path contained steam somewhere
|
// optimization, if the path contained steam somewhere
|
||||||
// assume the path up through the component with 'steam' in
|
// assume the path up through the component with 'steam' in
|
||||||
// is valid (because we almost certainly obtained it
|
// is valid (because we almost certainly obtained it
|
||||||
// progamatically
|
// progamatically
|
||||||
size_t nStartIdx = 0;
|
char *p = strcasestr(pPath, "steam");
|
||||||
static char *pszSteamPath = nullptr;
|
if (p)
|
||||||
static size_t nSteamPathLen = 0;
|
|
||||||
if (!pszSteamPath)
|
|
||||||
{
|
{
|
||||||
pszSteamPath = GetSteamContentPath();
|
while (p > pPath)
|
||||||
nSteamPathLen = Q_strlen(pszSteamPath);
|
{
|
||||||
|
if (p[-1] == '/')
|
||||||
|
break;
|
||||||
|
p--;
|
||||||
}
|
}
|
||||||
|
|
||||||
// optimization, if the path contained steam somewhere
|
if ((p == pPath + 1) && (*pPath != '/'))
|
||||||
// assume the path up through the component with 'steam' in
|
p = pPath;
|
||||||
// is valid (because we almost certainly obtained it
|
|
||||||
// progamatically
|
|
||||||
if (strncasecmp(pPath, pszSteamPath, nSteamPathLen) == 0)
|
|
||||||
{
|
|
||||||
nStartIdx = nSteamPathLen - 1;
|
|
||||||
Q_memcpy(pPath, pszSteamPath, nStartIdx);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p = pPath;
|
||||||
|
}
|
||||||
|
#else
|
||||||
char *p = pPath;
|
char *p = pPath;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Try the lower casing of the remaining path
|
// Try the lower casing of the remaining path
|
||||||
char *pBasename = p + nStartIdx;
|
char *pBasename = p;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
if (*p == '/') {
|
if (*p == '/') {
|
||||||
@ -620,7 +610,7 @@ PathMod_t pathmatch(const char *pszIn, char **ppszOut, bool bAllowBasenameMismat
|
|||||||
|
|
||||||
// path didn't match lowered successfully, restore the basename
|
// path didn't match lowered successfully, restore the basename
|
||||||
// if bAllowBasenameMismatch was true
|
// if bAllowBasenameMismatch was true
|
||||||
if (bAllowBasenameMismatch && *pBasename)
|
if (bAllowBasenameMismatch)
|
||||||
{
|
{
|
||||||
const char *pSrc = pszIn + (pBasename - pPath);
|
const char *pSrc = pszIn + (pBasename - pPath);
|
||||||
while (*pBasename)
|
while (*pBasename)
|
||||||
@ -635,7 +625,7 @@ PathMod_t pathmatch(const char *pszIn, char **ppszOut, bool bAllowBasenameMismat
|
|||||||
DEBUG_BREAK();
|
DEBUG_BREAK();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bSuccess = Descend(pPath, nStartIdx, bAllowBasenameMismatch);
|
bool bSuccess = Descend(pPath, 0, bAllowBasenameMismatch);
|
||||||
if (bSuccess)
|
if (bSuccess)
|
||||||
{
|
{
|
||||||
*ppszOut = pPath;
|
*ppszOut = pPath;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user