#include "le_entry_table.hpp" #include "parse.hpp" #include "output.hpp" #include "boost/fusion/adapted/struct.hpp" typedef boost::variant EntryT; BOOST_FUSION_ADAPT_STRUCT( le::EntryTable::Entry::EntryPoint, (binparse::Value8, flags) (EntryT, entry) ) BOOST_FUSION_ADAPT_STRUCT( le::EntryTable::Entry, (binparse::Value8, nr_entries) (binparse::Value8, flags) (binparse::Value16, object_index) (std::vector, entries) ) namespace le { EntryTable::Entry parse_entry_table_entry(std::istream& is) { EntryTable::Entry entry; entry.nr_entries = binparse::parse(is, "nr_entries"); entry.flags = binparse::parse(is, "flags"); entry.object_index = binparse::parse(is, "object_index"); for(Value8 i = Value8(0); i < entry.nr_entries; i++) { if(entry.flags & 2) { entry.entries.push_back({ binparse::parse(is, "flags"), binparse::parse(is, "entry") }); } else { entry.entries.push_back({ binparse::parse(is, "flags"), binparse::parse(is, "entry") }); } } return entry; } std::ostream& operator<<(std::ostream& os, EntryTable::Entry const& entry) { return binparse::operator<<(os, entry); } EntryTable parse_entry_table(std::istream& is, binparse::Offset32 offset) { is.seekg(0, std::ios::beg); is.ignore(offset); EntryTable table; uint32_t i = 1; while(is.peek()) { table.entries.emplace(i++, parse_entry_table_entry(is)); } return table; } std::ostream&operator<<(std::ostream& os, const EntryTable& table) { return binparse::operator<<(os, table.entries); } }