#include "parse.hpp" namespace binparse { UnexpectedEOS::UnexpectedEOS() : std::runtime_error("Unexpected end of stream.") {} UnexpectedEOS::UnexpectedEOS(std::__cxx11::string location) : std::runtime_error("Unexpected end of stream after " + location) {} template<> uint8_t parse(std::istream& is, std::string name) { if(!is) { throw UnexpectedEOS(); } char data = 0; is.read(&data, 1); if(!is) { throw UnexpectedEOS(name); } return (unsigned char) data; } template<> uint16_t parse(std::istream& is, std::string name) { if(!is) { throw UnexpectedEOS(); } char data[2] = {0, 0}; is.read(data, 2); if(!is) { throw UnexpectedEOS(name); } return ( ((unsigned char) data[1]) << 8) | (unsigned char) data[0]; } template<> uint32_t parse(std::istream& is, std::string name) { if(!is) { throw UnexpectedEOS(); } char data[4] = {0, 0}; is.read(data, sizeof(data)); if(!is) { throw UnexpectedEOS(name); } return ( ((unsigned char) data[3]) << 24 | ((unsigned char) data[2]) << 16 | ((unsigned char) data[1]) << 8 | ((unsigned char) data[0]) ); } template<> Value8 parse(std::istream& is, std::string name) { return Value8(parse(is, name)); } template<> Value16 parse(std::istream& is, std::string name) { return Value16(parse(is, name)); } template<> Magic16 parse(std::istream& is, std::string name) { return Magic16(parse(is, name)); } template<> Offset16 parse(std::istream& is, std::string name) { return Offset16(parse(is, name)); } template<> Value24 parse(std::istream& is, std::__cxx11::string name) { return Value24(parse>(is, name)); } template<> Value32 parse(std::istream& is, std::string name) { return Value32(parse(is, name)); } template<> Offset32 parse(std::istream& is, std::string name) { return Offset32(parse(is, name)); } template<> PString8 parse(std::istream& is, std::string name) { uint8_t len = parse(is, name + "_len"); std::vector data(len, 0); is.read(data.data(), len); return PString8(std::string(data.begin(), data.end())); } template std::array parse(std::istream& is, std::string name) { if(!is) { throw UnexpectedEOS(); } std::array buffer; is.read(reinterpret_cast(buffer.data()), buffer.size()); if(!is) { throw UnexpectedEOS(name); } return buffer; } template<> std::array parse>(std::istream& is, std::string name) { return parse(is, name); } template<> std::array parse>(std::istream& is, std::string name) { return parse(is, name); } template<> std::array parse>(std::istream& is, std::string name) { return parse(is, name); } void dump_bytes(std::istream& is, std::vector& buffer, std::string name) { if(!is) { throw UnexpectedEOS(); } is.read(reinterpret_cast(buffer.data()), buffer.size()); if(!is) { throw UnexpectedEOS(name); } } }