From dd8f1658c47db665481c725b9469408cf17e8c2e Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sun, 19 Jun 2016 22:30:07 +0200 Subject: implements a LE file parser and bare outputter. --- le/le_file.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 le/le_file.cpp (limited to 'le/le_file.cpp') diff --git a/le/le_file.cpp b/le/le_file.cpp new file mode 100644 index 0000000..3cec50c --- /dev/null +++ b/le/le_file.cpp @@ -0,0 +1,80 @@ +#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{}); +} + +} \ No newline at end of file -- cgit v1.2.3-70-g09d2