diff --git a/BeefRT/BeefDbg/BeefDbg.vcxproj b/BeefRT/BeefDbg/BeefDbg.vcxproj
index f8702896..e358105e 100644
--- a/BeefRT/BeefDbg/BeefDbg.vcxproj
+++ b/BeefRT/BeefDbg/BeefDbg.vcxproj
@@ -140,6 +140,7 @@
+
@@ -356,6 +357,7 @@
+
diff --git a/BeefRT/BeefDbg/BeefDbg.vcxproj.filters b/BeefRT/BeefDbg/BeefDbg.vcxproj.filters
index 05028bff..a3a371a5 100644
--- a/BeefRT/BeefDbg/BeefDbg.vcxproj.filters
+++ b/BeefRT/BeefDbg/BeefDbg.vcxproj.filters
@@ -25,6 +25,9 @@
{0027c869-120a-44d3-80e6-e2ab12ce83bc}
+
+ {59aee039-211d-47df-abb4-ca95d75d2c56}
+
{8e5503bc-1b01-46f1-be03-bb504d93f05d}
@@ -105,6 +108,9 @@
BeefySysLib\third_party\utf8proc
+
+ BeefySysLib\third_party\putty
+
BeefySysLib\util
@@ -326,6 +332,9 @@
BeefySysLib\third_party\utf8proc
+
+ BeefySysLib\third_party\putty
+
BeefySysLib\util
diff --git a/BeefRT/BeefRT.vcxproj b/BeefRT/BeefRT.vcxproj
index f4e02f8c..4f781e79 100644
--- a/BeefRT/BeefRT.vcxproj
+++ b/BeefRT/BeefRT.vcxproj
@@ -252,6 +252,7 @@
TurnOffAllWarnings
+
@@ -271,6 +272,7 @@
+
diff --git a/BeefRT/BeefRT.vcxproj.filters b/BeefRT/BeefRT.vcxproj.filters
index 2c8d57e8..b911d04f 100644
--- a/BeefRT/BeefRT.vcxproj.filters
+++ b/BeefRT/BeefRT.vcxproj.filters
@@ -28,6 +28,9 @@
{f94ea9c5-428b-4925-a59e-b7688752d7d7}
+
+ {e790c845-8b10-4edd-b2c0-71e35b0d80b2}
+
@@ -87,6 +90,9 @@
BeefySysLib\third_party\libffi
+
+ BeefySysLib\third_party\putty
+
rt
@@ -148,6 +154,9 @@
BeefySysLib\third_party\libffi\x86
+
+ BeefySysLib\third_party\putty
+
diff --git a/BeefRT/CMakeLists.txt b/BeefRT/CMakeLists.txt
index ed65705b..95ed5308 100644
--- a/BeefRT/CMakeLists.txt
+++ b/BeefRT/CMakeLists.txt
@@ -219,8 +219,9 @@ file(GLOB SRC_FILES
../BeefySysLib/util/BeefPerf.cpp
../BeefySysLib/util/String.cpp
../BeefySysLib/util/UTF8.cpp
- ../BeefySysLib/util/Hash.cpp
- ../BeefySysLib/third_party/utf8proc/utf8proc.c
+ ../BeefySysLib/util/Hash.cpp
+ ../BeefySysLib/third_party/utf8proc/utf8proc.c
+ ../BeefySysLib/third_party/putty/wildcard.c
)
if (${IOS})
diff --git a/BeefySysLib/BeefySysLib.vcxproj b/BeefySysLib/BeefySysLib.vcxproj
index d9ee8d82..36f61bf6 100644
--- a/BeefySysLib/BeefySysLib.vcxproj
+++ b/BeefySysLib/BeefySysLib.vcxproj
@@ -1926,6 +1926,7 @@ copy /y "$(OutDir)$(TargetName).lib" "$(SolutionDir)\BeefLibs\Beefy2D\dist\"TurnOffAllWarnings
TurnOffAllWarnings
+
@@ -2152,6 +2153,7 @@ copy /y "$(OutDir)$(TargetName).lib" "$(SolutionDir)\BeefLibs\Beefy2D\dist\"
+
diff --git a/BeefySysLib/BeefySysLib.vcxproj.filters b/BeefySysLib/BeefySysLib.vcxproj.filters
index 3b2dc190..f766dc93 100644
--- a/BeefySysLib/BeefySysLib.vcxproj.filters
+++ b/BeefySysLib/BeefySysLib.vcxproj.filters
@@ -78,6 +78,9 @@
{a159b9ee-1a71-44f5-a412-1e01e20b70c7}
+
+ {0007a912-9292-4e32-8884-0f0cd276e42d}
+
@@ -731,6 +734,9 @@
src\util
+
+ src\third_party\putty
+
@@ -1123,6 +1129,9 @@
src\util
+
+ src\third_party\putty
+
diff --git a/BeefySysLib/BeefySysLib_static.vcxproj b/BeefySysLib/BeefySysLib_static.vcxproj
index e81e9e3a..66f06622 100644
--- a/BeefySysLib/BeefySysLib_static.vcxproj
+++ b/BeefySysLib/BeefySysLib_static.vcxproj
@@ -859,6 +859,7 @@
Level1
Level1
+
@@ -1025,6 +1026,7 @@
+
diff --git a/BeefySysLib/BeefySysLib_static.vcxproj.filters b/BeefySysLib/BeefySysLib_static.vcxproj.filters
index 34f64889..62458bbe 100644
--- a/BeefySysLib/BeefySysLib_static.vcxproj.filters
+++ b/BeefySysLib/BeefySysLib_static.vcxproj.filters
@@ -69,6 +69,9 @@
{d32cb9b0-e79b-49fe-82e2-33302be0baf6}
+
+ {bec18ceb-a7ca-4150-99ee-60a16944b93c}
+
@@ -584,6 +587,9 @@
src\third_party\miniz
+
+ src\third_party\putty
+
@@ -898,6 +904,9 @@
src\third_party\miniz
+
+ src\third_party\putty
+
diff --git a/BeefySysLib/CMakeLists.txt b/BeefySysLib/CMakeLists.txt
index 9a1f1e25..13f954dd 100644
--- a/BeefySysLib/CMakeLists.txt
+++ b/BeefySysLib/CMakeLists.txt
@@ -274,6 +274,7 @@ file(GLOB SRC_FILES
third_party/zlib/uncompr.c
third_party/zlib/zutil.c
third_party/miniz/miniz.c
+ third_party/putty/wildcard.c
util/AllocDebug.cpp
util/BeefPerf.cpp
util/BSpline.cpp
diff --git a/BeefySysLib/platform/posix/PosixCommon.cpp b/BeefySysLib/platform/posix/PosixCommon.cpp
index 15b9c611..03f70b4b 100644
--- a/BeefySysLib/platform/posix/PosixCommon.cpp
+++ b/BeefySysLib/platform/posix/PosixCommon.cpp
@@ -22,6 +22,7 @@
#include "../../util/CritSect.h"
#include "../../util/Dictionary.h"
#include "../../util/Hash.h"
+#include "../../third_party/putty/wildcard.h"
#ifdef BFP_HAS_EXECINFO
#include
#endif
@@ -2378,9 +2379,10 @@ static bool BfpFindFileData_CheckFilter(BfpFindFileData* findData)
{
if ((findData->mFlags & BfpFindFileFlag_Files) == 0)
return false;
- }
+ }
- //TODO: Check actual wildcards.
+ if (!wc_match(findData->mWildcard.c_str(), findData->mDirEnt->d_name))
+ return false;
return true;
}
diff --git a/BeefySysLib/platform/win/Platform.cpp b/BeefySysLib/platform/win/Platform.cpp
index abb61588..9accafd6 100644
--- a/BeefySysLib/platform/win/Platform.cpp
+++ b/BeefySysLib/platform/win/Platform.cpp
@@ -25,6 +25,7 @@
#include "../util/CritSect.h"
#include "../util/Dictionary.h"
#include "../util/HashSet.h"
+#include "../../third_party/putty/wildcard.h"
#include "util/AllocDebug.h"
@@ -3485,6 +3486,7 @@ struct BfpFindFileData
{
BfpFindFileFlags mFlags;
WIN32_FIND_DATA mFindData;
+ Beefy::String mWildcard;
HANDLE mHandle;
};
@@ -3496,29 +3498,43 @@ static bool BfpFindFileData_CheckFilter(BfpFindFileData* findData)
bool isDir = (findData->mFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
if (isDir)
{
- if ((findData->mFlags & BfpFindFileFlag_Directories) != 0)
- {
- if ((wcscmp(findData->mFindData.cFileName, L".") == 0) || (wcscmp(findData->mFindData.cFileName, L"..") == 0))
- {
- return false;
- }
- return true;
- }
+ if ((findData->mFlags & BfpFindFileFlag_Directories) == 0)
+ return false;
+
+ if ((wcscmp(findData->mFindData.cFileName, L".") == 0) || (wcscmp(findData->mFindData.cFileName, L"..") == 0))
+ return false;
}
else
{
- if ((findData->mFlags & BfpFindFileFlag_Files) != 0)
- return true;
+ if ((findData->mFlags & BfpFindFileFlag_Files) == 0)
+ return false;
}
- return false;
+
+ Beefy::String fileName = UTF8Encode(findData->mFindData.cFileName);
+ if (!wc_match(findData->mWildcard.c_str(), fileName.c_str()))
+ return false;
+
+ return true;
}
BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const char* path, BfpFindFileFlags flags, BfpFileResult* outResult)
{
- UTF16String wPath = UTF8Decode(path);
+ Beefy::String findStr = path;
+ Beefy::String wildcard;
+
+ int lastSlashPos = std::max((int)findStr.LastIndexOf('/'), (int)findStr.LastIndexOf('\\'));
+ if (lastSlashPos != -1)
+ {
+ wildcard = findStr.Substring(lastSlashPos + 1);
+ findStr = findStr.Substring(0, lastSlashPos + 1);
+ findStr.Append("*");
+ }
+ if (wildcard == "*.*")
+ wildcard = "*";
BfpFindFileData* findData = new BfpFindFileData();
findData->mFlags = flags;
+ findData->mWildcard = wildcard;
FINDEX_SEARCH_OPS searchOps;
if ((flags & BfpFindFileFlag_Files) == 0)
@@ -3526,6 +3542,7 @@ BFP_EXPORT BfpFindFileData* BFP_CALLTYPE BfpFindFileData_FindFirstFile(const cha
else
searchOps = FindExSearchNameMatch;
+ UTF16String wPath = UTF8Decode(findStr);
findData->mHandle = ::FindFirstFileExW(wPath.c_str(), FindExInfoBasic, &findData->mFindData, searchOps, NULL, 0);
if (findData->mHandle == INVALID_HANDLE_VALUE)
{