#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include "archive.h" #include "llvm/Support/MemoryBuffer.h" #include "revng/ADT/CUniquePtr.h" #include "revng/Support/Generator.h" namespace revng { enum class TarFormat { Plain, Gzip, }; class TarReader { private: CUniquePtr Archive; public: TarReader(llvm::ArrayRef Ref, TarFormat Format); TarReader(const llvm::MemoryBuffer &Buffer, TarFormat Format) : TarReader({ Buffer.getBufferStart(), Buffer.getBufferSize() }, Format){}; public: struct Entry { std::string Filename; llvm::SmallVector Data; }; cppcoro::generator entries(); }; class TarWriter { private: llvm::raw_ostream &OS; CUniquePtr Archive; public: TarWriter(llvm::raw_ostream &OS, TarFormat Format); ~TarWriter(); public: void addMember(llvm::StringRef Filename, llvm::ArrayRef Buffer); void addMember(llvm::StringRef Filename, llvm::MemoryBuffer &Buffer) { addMember(Filename, llvm::ArrayRef{ Buffer.getBufferStart(), Buffer.getBufferSize() }); } private: static long archiveWrite(archive *Ptr, void *ClassPtr, const void *Data, size_t Size); }; } // namespace revng