diff options
author | kr3nshaw <20672068+kr3nshaw@users.noreply.github.com> | 2020-06-08 05:54:51 +1000 |
---|---|---|
committer | kr3nshaw <20672068+kr3nshaw@users.noreply.github.com> | 2020-06-08 05:54:51 +1000 |
commit | 19d0c085f76ac5830e38339248d2f70b58ee54b2 (patch) | |
tree | 92acdeb79d0deb9c9056275a38e252b001d9dfd4 | |
parent | 61df5c9cad91d0e73c09a0f27ca57b7ad757c024 (diff) |
Added preprocessor macros to switch experimental on and off
-rw-r--r-- | tools/knarc/Narc.cpp | 49 | ||||
-rw-r--r-- | tools/knarc/Narc.h | 15 |
2 files changed, 39 insertions, 25 deletions
diff --git a/tools/knarc/Narc.cpp b/tools/knarc/Narc.cpp index 4cdb4b63..506e050f 100644 --- a/tools/knarc/Narc.cpp +++ b/tools/knarc/Narc.cpp @@ -3,7 +3,6 @@ #include <algorithm> #include <cstddef> #include <cstdint> -#include <experimental/filesystem> #include <fstream> #include <iomanip> #include <ios> @@ -15,6 +14,14 @@ #include <string> #include <vector> +#if __GNUC__ <= 7 +#include <experimental/filesystem> +namespace fs = std::experimental::filesystem; +#else +#include <filesystem> +namespace fs = std::filesystem; +#endif + using namespace std; void Narc::AlignDword(ofstream& ofs, uint8_t paddingChar) @@ -46,16 +53,16 @@ bool Narc::Cleanup(ofstream& ofs, const NarcError& e) return false; } -vector<experimental::filesystem::directory_entry> Narc::OrderedDirectoryIterator(const experimental::filesystem::path& path, bool recursive) const +vector<fs::directory_entry> Narc::OrderedDirectoryIterator(const fs::path& path, bool recursive) const { - vector<experimental::filesystem::directory_entry> v; + vector<fs::directory_entry> v; - for (const auto& de : experimental::filesystem::directory_iterator(path)) + for (const auto& de : fs::directory_iterator(path)) { v.push_back(de); } - sort(v.begin(), v.end(), [](const experimental::filesystem::directory_entry& a, const experimental::filesystem::directory_entry& b) + sort(v.begin(), v.end(), [](const fs::directory_entry& a, const fs::directory_entry& b) { // I fucking hate C++ string aStr = a.path().filename().string(); @@ -82,7 +89,7 @@ vector<experimental::filesystem::directory_entry> Narc::OrderedDirectoryIterator { if (is_directory(v[i])) { - vector<experimental::filesystem::directory_entry> temp = OrderedDirectoryIterator(v[i], true); + vector<fs::directory_entry> temp = OrderedDirectoryIterator(v[i], true); v.insert(v.end(), temp.begin(), temp.end()); } @@ -97,7 +104,7 @@ NarcError Narc::GetError() const return error; } -bool Narc::Pack(const experimental::filesystem::path& fileName, const experimental::filesystem::path& directory) +bool Narc::Pack(const fs::path& fileName, const fs::path& directory) { ofstream ofs(fileName, ios::binary); @@ -142,8 +149,8 @@ bool Narc::Pack(const experimental::filesystem::path& fileName, const experiment .Reserved = 0x0 }; - map<experimental::filesystem::path, string> subTables; - vector<experimental::filesystem::path> paths; + map<fs::path, string> subTables; + vector<fs::path> paths; directoryCounter = 0; @@ -178,7 +185,7 @@ bool Narc::Pack(const experimental::filesystem::path& fileName, const experiment vector<FileNameTableEntry> fntEntries; - if (!regex_match(experimental::filesystem::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) + if (!regex_match(fs::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) { fntEntries.push_back( { @@ -228,7 +235,7 @@ bool Narc::Pack(const experimental::filesystem::path& fileName, const experiment .ChunkSize = sizeof(FileNameTable) + (fntEntries.size() * sizeof(FileNameTableEntry)) }; - if (!regex_match(experimental::filesystem::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) + if (!regex_match(fs::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) { for (const auto& subTable : subTables) { @@ -277,7 +284,7 @@ bool Narc::Pack(const experimental::filesystem::path& fileName, const experiment ofs.write(reinterpret_cast<char*>(&entry), sizeof(FileNameTableEntry)); } - if (!regex_match(experimental::filesystem::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) + if (!regex_match(fs::directory_iterator(directory)->path().string(), regex(".*_\\d{4,8}\\.bin"))) { for (const auto& path : paths) { @@ -322,7 +329,7 @@ bool Narc::Pack(const experimental::filesystem::path& fileName, const experiment return error == NarcError::None ? true : false; } -bool Narc::Unpack(const experimental::filesystem::path& fileName, const experimental::filesystem::path& directory) +bool Narc::Unpack(const fs::path& fileName, const fs::path& directory) { ifstream ifs(fileName, ios::binary); @@ -428,8 +435,8 @@ bool Narc::Unpack(const experimental::filesystem::path& fileName, const experime if (fi.Id != 0x46494D47) { return Cleanup(ifs, NarcError::InvalidFileImagesId); } - experimental::filesystem::create_directory(directory); - experimental::filesystem::current_path(directory); + fs::create_directory(directory); + fs::current_path(directory); if (fnt.ChunkSize == 0x10) { @@ -458,11 +465,11 @@ bool Narc::Unpack(const experimental::filesystem::path& fileName, const experime } else { - experimental::filesystem::path absolutePath = experimental::filesystem::absolute(experimental::filesystem::current_path()); + fs::path absolutePath = fs::absolute(fs::current_path()); for (size_t i = 0; i < fntEntries.size(); ++i) { - experimental::filesystem::current_path(absolutePath); + fs::current_path(absolutePath); stack<string> directories; for (uint16_t j = fntEntries[i].Utility; j > 0xF000; j = fntEntries[j - 0xF000].Utility) @@ -472,14 +479,14 @@ bool Narc::Unpack(const experimental::filesystem::path& fileName, const experime for (; !directories.empty(); directories.pop()) { - experimental::filesystem::create_directory(directories.top()); - experimental::filesystem::current_path(directories.top()); + fs::create_directory(directories.top()); + fs::current_path(directories.top()); } if (fntEntries[i].Utility >= 0xF000) { - experimental::filesystem::create_directory(fileNames.get()[0xF000 + i]); - experimental::filesystem::current_path(fileNames.get()[0xF000 + i]); + fs::create_directory(fileNames.get()[0xF000 + i]); + fs::current_path(fileNames.get()[0xF000 + i]); } ifs.seekg(static_cast<uint64_t>(header.ChunkSize) + fat.ChunkSize + sizeof(FileNameTable) + fntEntries[i].Offset); diff --git a/tools/knarc/Narc.h b/tools/knarc/Narc.h index 515a1cc2..4516d2d5 100644 --- a/tools/knarc/Narc.h +++ b/tools/knarc/Narc.h @@ -1,11 +1,18 @@ #pragma once #include <cstdint> -#include <experimental/filesystem> #include <fstream> #include <string> #include <vector> +#if __GNUC__ <= 7 +#include <experimental/filesystem> +namespace fs = std::experimental::filesystem; +#else +#include <filesystem> +namespace fs = std::filesystem; +#endif + enum class NarcError { None, @@ -71,8 +78,8 @@ class Narc public: NarcError GetError() const; - bool Pack(const std::experimental::filesystem::path& fileName, const std::experimental::filesystem::path& directory); - bool Unpack(const std::experimental::filesystem::path& fileName, const std::experimental::filesystem::path& directory); + bool Pack(const fs::path& fileName, const fs::path& directory); + bool Unpack(const fs::path& fileName, const fs::path& directory); private: NarcError error = NarcError::None; @@ -82,5 +89,5 @@ class Narc bool Cleanup(std::ifstream& ifs, const NarcError& e); bool Cleanup(std::ofstream& ofs, const NarcError& e); - std::vector<std::experimental::filesystem::directory_entry> OrderedDirectoryIterator(const std::experimental::filesystem::path& path, bool recursive) const; + std::vector<fs::directory_entry> OrderedDirectoryIterator(const fs::path& path, bool recursive) const; }; |