summaryrefslogtreecommitdiff
path: root/tools/knarc/Narc.h
diff options
context:
space:
mode:
authorCleverking2003 <30466983+Cleverking2003@users.noreply.github.com>2020-06-07 22:59:16 +0300
committerGitHub <noreply@github.com>2020-06-07 22:59:16 +0300
commitc5a0d49cbae5047021e4f036366cf87ba97da566 (patch)
tree92acdeb79d0deb9c9056275a38e252b001d9dfd4 /tools/knarc/Narc.h
parentc2d3d0fb118d3f9ff14f8f5293f54d0c37421a70 (diff)
parent19d0c085f76ac5830e38339248d2f70b58ee54b2 (diff)
Merge pull request #144 from kr3nshaw/master
Replaced narccomp with knarc
Diffstat (limited to 'tools/knarc/Narc.h')
-rw-r--r--tools/knarc/Narc.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/tools/knarc/Narc.h b/tools/knarc/Narc.h
new file mode 100644
index 00000000..4516d2d5
--- /dev/null
+++ b/tools/knarc/Narc.h
@@ -0,0 +1,93 @@
+#pragma once
+
+#include <cstdint>
+#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,
+ InvalidInputFile,
+ InvalidHeaderId,
+ InvalidByteOrderMark,
+ InvalidVersion,
+ InvalidHeaderSize,
+ InvalidChunkCount,
+ InvalidFileAllocationTableId,
+ InvalidFileAllocationTableReserved,
+ InvalidFileNameTableId,
+ InvalidFileNameTableEntryId,
+ InvalidFileImagesId,
+ InvalidOutputFile
+};
+
+struct Header
+{
+ uint32_t Id;
+ uint16_t ByteOrderMark;
+ uint16_t Version;
+ uint32_t FileSize;
+ uint16_t ChunkSize;
+ uint16_t ChunkCount;
+};
+
+struct FileAllocationTable
+{
+ uint32_t Id;
+ uint32_t ChunkSize;
+ uint16_t FileCount;
+ uint16_t Reserved;
+};
+
+struct FileAllocationTableEntry
+{
+ uint32_t Start;
+ uint32_t End;
+};
+
+struct FileNameTable
+{
+ uint32_t Id;
+ uint32_t ChunkSize;
+};
+
+struct FileNameTableEntry
+{
+ uint32_t Offset;
+ uint16_t FirstFileId;
+ uint16_t Utility;
+};
+
+struct FileImages
+{
+ uint32_t Id;
+ uint32_t ChunkSize;
+};
+
+class Narc
+{
+ public:
+ NarcError GetError() const;
+
+ 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;
+
+ void AlignDword(std::ofstream& ofs, uint8_t paddingChar);
+
+ bool Cleanup(std::ifstream& ifs, const NarcError& e);
+ bool Cleanup(std::ofstream& ofs, const NarcError& e);
+
+ std::vector<fs::directory_entry> OrderedDirectoryIterator(const fs::path& path, bool recursive) const;
+};