From 06336eaddcc6a8f9cc578d8f059117c3aa535c9f Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Tue, 5 Jul 2016 17:51:21 +0200 Subject: Made the interface somewhat more consistant. --- le/le_entry_table.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'le/le_entry_table.cpp') diff --git a/le/le_entry_table.cpp b/le/le_entry_table.cpp index 28f901d..6e8b0c7 100644 --- a/le/le_entry_table.cpp +++ b/le/le_entry_table.cpp @@ -1,9 +1,58 @@ #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); -- cgit v1.2.3-70-g09d2