#include "le_header.hpp" #include "index_list.hpp" #include "binparse.hpp" #include BOOST_FUSION_ADAPT_STRUCT( le::LEHeader, (binparse::Magic16, magic) (binparse::Value8, B_ord) (binparse::Value8, W_ord) (binparse::Value32, format_level) (binparse::Value16, cpu_type) (binparse::Value16, os_type) (binparse::Value32, module_version) (binparse::Value32, module_flags) (binparse::Value32, module_nr_of_pages) (binparse::Offset32, EIP_object) (binparse::Offset32, EIP) (binparse::Offset32, ESP_object) (binparse::Offset32, ESP) (binparse::Value32, page_size) (binparse::Offset32, page_offset_shift) (binparse::Value32, fixup_section_size) (binparse::Value32, fixup_section_checksum) (binparse::Value32, loader_section_size) (binparse::Value32, loader_section_checksum) (binparse::Offset32, object_table_offset) (binparse::Value32, nr_objects_in_module) (binparse::Offset32, object_page_table_offset) (binparse::Offset32, objct_iter_pages_offset) (binparse::Offset32, resource_table_offset) (binparse::Value32, nr_resource_table_entries) (binparse::Offset32, resident_name_table_offset) (binparse::Offset32, entry_table_offset) (binparse::Offset32, module_directives_offset) (binparse::Value32, nr_module_directives) (binparse::Offset32, fixup_page_table_offset) (binparse::Offset32, fixup_record_table_offset) (binparse::Offset32, import_module_table_offset) (binparse::Value32, import_mod_entries) (binparse::Offset32, import_proc_table_offset) (binparse::Offset32, per_page_checksum_offset) (binparse::Offset32, data_page_offset) (binparse::Value32, nr_preload_pages) (binparse::Offset32, non_res_name_table_offset) (binparse::Value32, non_res_name_table_length) (binparse::Value32, non_res_name_table_checksum) (binparse::Value32, auto_ds_object_nr) (binparse::Offset32, debug_info_offset) (binparse::Value32, debug_info_length) (binparse::Value32, nr_instance_preload) (binparse::Value32, nr_instance_demand) (binparse::Value32, heapsize) ) namespace le { template LEHeader parse_header_impl(std::istream& is, indices) { return {parse::type>::type>(is, boost::fusion::extension::struct_member_name::call())...}; } LEHeader parse_header(std::istream& is) { typedef build_indices::value>::type indices; return parse_header_impl(is, indices{}); } std::ostream& output_impl(std::ostream& os, LEHeader const&, indices<>) { return os; } template std::ostream& output_impl(std::ostream& os, const LEHeader& header, indices) { os << boost::fusion::extension::struct_member_name::call() << ": " << boost::fusion::at_c(header) << std::endl; return output_impl(os, header, indices{}); } std::ostream& operator<<(std::ostream& os, LEHeader const& header) { typedef build_indices::value>::type indices; return output_impl(os, header, indices{}); } }