From 872b39514f83a962627473d9909d8f4e114f4d25 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 7 Jun 2022 13:44:31 +0200 Subject: [PATCH] Add file extension support to .vpkignore --- r5dev/public/include/utility.h | 11 +++++++--- r5dev/public/utility.cpp | 40 +++++++++++++++++++++++++++++----- r5dev/vpklib/packedstore.cpp | 14 +++++++----- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/r5dev/public/include/utility.h b/r5dev/public/include/utility.h index 05f01386..ae06ab7c 100644 --- a/r5dev/public/include/utility.h +++ b/r5dev/public/include/utility.h @@ -1,5 +1,4 @@ #pragma once -#include ///////////////////////////////////////////////////////////////////////////// // Internals @@ -9,14 +8,18 @@ MODULEINFO GetModuleInfo(const char* szModule); DWORD64 FindPatternSIMD(const char* szModule, const unsigned char* szPattern, const char* szMask); ///////////////////////////////////////////////////////////////////////////// -// Utility +// Debug void DbgPrint(LPCSTR sFormat, ...); void PrintLastError(void); void HexDump(const char* szHeader, const char* szLogger, const void* pData, int nSize); -string GetExtension(const string& svInput); +///////////////////////////////////////////////////////////////////////////// +// String +bool HasExtension(const string& svInput, const string& svExtension); +string GetExtension(const string& svInput, bool bReturnOriginal = false, bool bKeepDelimiter = false); string RemoveExtension(const string& svInput); +bool HasFileName(const string& svInput, const string& svFileName); string GetFileName(const string& svInput, bool bRemoveExtension, bool bWindows = false); string RemoveFileName(const string& svInput, bool bWindows = false); @@ -43,6 +46,8 @@ vector StringToBytes(const string& svInput, bool bNullTerminator); vector PatternToBytes(const string& svInput); vector IntToDigits(int iValue); +///////////////////////////////////////////////////////////////////////////// +// Print void PrintM128i8(__m128i in); void PrintM128i16(__m128i in); void PrintM128i32(__m128i in); diff --git a/r5dev/public/utility.cpp b/r5dev/public/utility.cpp index 41875119..e68d80d3 100644 --- a/r5dev/public/utility.cpp +++ b/r5dev/public/utility.cpp @@ -232,14 +232,33 @@ void HexDump(const char* szHeader, const char* szLogger, const void* pData, int /////////////////////////////////////////////////////////////////////////// } +/////////////////////////////////////////////////////////////////////////////// +// For checking if file name has a specific extension. +bool HasExtension(const string& svInput, const string& svExtension) +{ + if (svInput.substr(svInput.find_last_of('.') + 1) == svExtension) + { + return true; + } + return false; +} + /////////////////////////////////////////////////////////////////////////////// // For removing file names from the extension. -string GetExtension(const string& svInput) +string GetExtension(const string& svInput, bool bReturnOriginal, bool bKeepDelimiter) { string::size_type nPos = svInput.rfind('.'); - if (nPos != std::string::npos) + if (nPos != string::npos) { - return svInput.substr(nPos + 1); + if (!bKeepDelimiter) + { + nPos += 1; + } + return svInput.substr(nPos); + } + if (bReturnOriginal) + { + return svInput; } return ""; } @@ -256,6 +275,17 @@ string RemoveExtension(const string& svInput) return svInput.substr(0, nPos); } +/////////////////////////////////////////////////////////////////////////////// +// For checking file names equality without extension. +bool HasFileName(const string& svInput, const string& svFileName) +{ + if (RemoveExtension(svInput) == RemoveExtension(svFileName)) + { + return true; + } + return false; +} + /////////////////////////////////////////////////////////////////////////////// // For removing the path from file names. string GetFileName(const string& svInput, bool bRemoveExtension, bool bWindows) @@ -340,7 +370,7 @@ string ConvertToWinPath(const string& svInput) sprintf_s(szFilePath, MAX_PATH, "%s", svInput.c_str()); // Flip forward slashes in filepath to windows-style backslash - for (int i = 0; i < strlen(szFilePath); i++) + for (size_t i = 0; i < strlen(szFilePath); i++) { if (szFilePath[i] == '/') { @@ -359,7 +389,7 @@ string ConvertToUnixPath(const string& svInput) sprintf_s(szFilePath, MAX_PATH, "%s", svInput.c_str()); // Flip forward slashes in filepath to windows-style backslash - for (int i = 0; i < strlen(szFilePath); i++) + for (size_t i = 0; i < strlen(szFilePath); i++) { if (szFilePath[i] == '\\') { diff --git a/r5dev/vpklib/packedstore.cpp b/r5dev/vpklib/packedstore.cpp index 793bb921..d0f88112 100644 --- a/r5dev/vpklib/packedstore.cpp +++ b/r5dev/vpklib/packedstore.cpp @@ -130,9 +130,11 @@ vector CPackedStore::GetEntryPaths(const string& svPathIn) const fs::recursive_directory_iterator dir(svPathIn), end; while (dir != end) { - if (std::find(vIgnore.begin(), vIgnore.end(), dir->path().filename()) != vIgnore.end()) + vector::iterator it = std::find(vIgnore.begin(), vIgnore.end(), + GetExtension(dir->path().filename().u8string(), true, true)); + if (it != vIgnore.end()) { - dir.disable_recursion_pending(); // Skip all ignored folders. + dir.disable_recursion_pending(); // Skip all ignored folders and extensions. } if (!GetExtension(dir->path().u8string()).empty()) { @@ -157,11 +159,13 @@ vector CPackedStore::GetEntryPaths(const string& svPathIn, const nlohman fs::recursive_directory_iterator dir(svPathIn), end; while (dir != end) { - if (std::find(vIgnore.begin(), vIgnore.end(), dir->path().filename()) != vIgnore.end()) + vector::iterator it = std::find(vIgnore.begin(), vIgnore.end(), + GetExtension(dir->path().filename().u8string(), true, true)); + if (it != vIgnore.end()) { - dir.disable_recursion_pending(); // Skip all ignored folders. + dir.disable_recursion_pending(); // Skip all ignored folders and extensions. } - if (!GetExtension(dir->path().u8string()).empty()) + else if (!GetExtension(dir->path().u8string()).empty()) { if (!jManifest.is_null()) {