summaryrefslogtreecommitdiff
path: root/le/le_file.cpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-06-22 00:15:08 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-06-22 00:16:28 +0200
commit22231518b9c2c0b7f73c72a6ca834df659c63c7f (patch)
tree12b1d20efd3303583649966ddfe135a81ae8109b /le/le_file.cpp
parent46145fe7d5b1d9f0921121a088a3d61f968cc473 (diff)
downloadopenwar-22231518b9c2c0b7f73c72a6ca834df659c63c7f.tar.gz
openwar-22231518b9c2c0b7f73c72a6ca834df659c63c7f.tar.bz2
openwar-22231518b9c2c0b7f73c72a6ca834df659c63c7f.zip
Reduces the amount of boilerplate neccesary to parse the binary format.
Diffstat (limited to 'le/le_file.cpp')
-rw-r--r--le/le_file.cpp46
1 files changed, 11 insertions, 35 deletions
diff --git a/le/le_file.cpp b/le/le_file.cpp
index 3cec50c..b01f13e 100644
--- a/le/le_file.cpp
+++ b/le/le_file.cpp
@@ -1,6 +1,7 @@
#include "le_file.hpp"
-#include "index_list.hpp"
+#include "parse.hpp"
+#include "output.hpp"
#include <boost/fusion/adapted/struct.hpp>
@@ -8,20 +9,22 @@ typedef std::array<uint8_t, 8> A1;
typedef std::array<uint8_t, 22> A2;
BOOST_FUSION_ADAPT_STRUCT(
- le::LEFile,
- (mz::MZHeader, mz_header)
+ le::File,
+ (mz::Header, mz_header)
(A1, unused_1)
(binparse::Value16, OEM_id)
(A2, OEM_info)
(binparse::Offset32, le_offset)
(std::vector<uint8_t>, dos_exe)
- (le::LEHeader, le_header)
- (std::vector<uint8_t>, le_exe)
+ (le::Header, le_header)
+ (le::ObjectTable, object_table)
)
namespace le {
-LEFile parse_file(std::istream& is) {
+File parse_file(std::istream& is) {
+ using binparse::parse;
+
auto mz_h = mz::parse_header(is);
auto unused = parse<std::array<uint8_t, 8>>(is, "unused_1");
auto OEM_id = parse<binparse::Value16>(is, "OEM_id");
@@ -33,8 +36,6 @@ LEFile parse_file(std::istream& is) {
binparse::dump_bytes(is, dos_exe, "dos_exe");
auto le_h = le::parse_header(is);
- std::string str(std::istreambuf_iterator<char>(is), {});
- std::vector<uint8_t> le_exe(str.begin(), str.end());
return {
mz_h,
@@ -44,37 +45,12 @@ LEFile parse_file(std::istream& is) {
le_offset,
dos_exe,
le_h,
- le_exe
};
}
-std::ostream& operator<<(std::ostream& os, std::array<uint8_t, 8> const& array) {
- return os;
-}
-
-std::ostream& operator<<(std::ostream& os, std::array<uint8_t, 22> const& array) {
- return os;
-}
-
-std::ostream& operator<<(std::ostream& os, std::vector<uint8_t> vec) {
- return os;
-}
-
-std::ostream& output_impl(std::ostream& os, LEFile const&, indices<>) {
- return os;
-}
-
-template <int I, int... Indices>
-std::ostream& output_impl(std::ostream& os, const LEFile& file, indices<I, Indices...>) {
- os << boost::fusion::extension::struct_member_name<LEFile, I>::call() << ": " << boost::fusion::at_c<I>(file) << std::endl;
- return output_impl(os, file, indices<Indices...>{});
-}
-
-std::ostream&operator<<(std::ostream& os, LEFile const& file)
+std::ostream&operator<<(std::ostream& os, File const& file)
{
- typedef build_indices<boost::fusion::result_of::size<LEFile>::value>::type indices;
-
- return output_impl(os, file, indices{});
+ return binparse::operator<<(os, file);
}
} \ No newline at end of file