#include "le_file.hpp" #include "index_list.hpp" #include typedef std::array A1; typedef std::array A2; BOOST_FUSION_ADAPT_STRUCT( le::LEFile, (mz::MZHeader, mz_header) (A1, unused_1) (binparse::Value16, OEM_id) (A2, OEM_info) (binparse::Offset32, le_offset) (std::vector, dos_exe) (le::LEHeader, le_header) (std::vector, le_exe) ) namespace le { LEFile parse_file(std::istream& is) { auto mz_h = mz::parse_header(is); auto unused = parse>(is, "unused_1"); auto OEM_id = parse(is, "OEM_id"); auto OEM_info = parse>(is, "OEM_info"); auto le_offset = parse(is, "le_offset"); size_t dos_exe_len = le_offset - 0x40; std::vector dos_exe = std::vector(dos_exe_len, 0); binparse::dump_bytes(is, dos_exe, "dos_exe"); auto le_h = le::parse_header(is); std::string str(std::istreambuf_iterator(is), {}); std::vector le_exe(str.begin(), str.end()); return { mz_h, unused, OEM_id, OEM_info, le_offset, dos_exe, le_h, le_exe }; } std::ostream& operator<<(std::ostream& os, std::array const& array) { return os; } std::ostream& operator<<(std::ostream& os, std::array const& array) { return os; } std::ostream& operator<<(std::ostream& os, std::vector vec) { return os; } std::ostream& output_impl(std::ostream& os, LEFile const&, indices<>) { return os; } template std::ostream& output_impl(std::ostream& os, const LEFile& file, indices) { os << boost::fusion::extension::struct_member_name::call() << ": " << boost::fusion::at_c(file) << std::endl; return output_impl(os, file, indices{}); } std::ostream&operator<<(std::ostream& os, LEFile const& file) { typedef build_indices::value>::type indices; return output_impl(os, file, indices{}); } }