diff options
author | Cleverking2003 <30466983+Cleverking2003@users.noreply.github.com> | 2020-06-07 22:59:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-07 22:59:16 +0300 |
commit | c5a0d49cbae5047021e4f036366cf87ba97da566 (patch) | |
tree | 92acdeb79d0deb9c9056275a38e252b001d9dfd4 /tools/knarc/Narc.h | |
parent | c2d3d0fb118d3f9ff14f8f5293f54d0c37421a70 (diff) | |
parent | 19d0c085f76ac5830e38339248d2f70b58ee54b2 (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.h | 93 |
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; +}; |