From d7deea6dac9ca210a4dec273a7e10453492e04b5 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Sat, 21 Apr 2018 22:21:05 +0200 Subject: Implement tag 12 (array of 64bit long) and fix tests --- src/tag.cpp | 4 +++- src/tag_array.cpp | 49 ++++++++++++++++++++++++++++++++++++++------- src/tag_list.cpp | 1 + src/text/json_formatter.cpp | 12 +++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/tag.cpp b/src/tag.cpp index df4d8cb555..7e3be3911c 100644 --- a/src/tag.cpp +++ b/src/tag.cpp @@ -33,7 +33,7 @@ static_assert(std::numeric_limits::is_iec559 && std::numeric_limits tag::clone() && @@ -56,6 +56,7 @@ std::unique_ptr tag::create(tag_type type) case tag_type::List: return make_unique(); case tag_type::Compound: return make_unique(); case tag_type::Int_Array: return make_unique(); + case tag_type::Long_Array: return make_unique(); default: throw std::invalid_argument("Invalid tag type"); } @@ -89,6 +90,7 @@ std::ostream& operator<<(std::ostream& os, tag_type tt) case tag_type::List: return os << "list"; case tag_type::Compound: return os << "compound"; case tag_type::Int_Array: return os << "int_array"; + case tag_type::Long_Array: return os << "long_array"; case tag_type::Null: return os << "null"; default: return os << "invalid"; diff --git a/src/tag_array.cpp b/src/tag_array.cpp index 6173dbb1dd..4a1668ad1e 100644 --- a/src/tag_array.cpp +++ b/src/tag_array.cpp @@ -43,26 +43,48 @@ void tag_array::read_payload(io::stream_reader& reader) throw io::input_error("Error reading contents of tag_byte_array"); } +template +void tag_array::read_payload(io::stream_reader& reader) +{ + int32_t length; + reader.read_num(length); + if(length < 0) + reader.get_istr().setstate(std::ios::failbit); + if(!reader.get_istr()) + throw io::input_error("Error reading length of generic array tag"); + + data.clear(); + data.reserve(length); + for(T i = 0; i < length; ++i) + { + T val; + reader.read_num(val); + data.push_back(val); + } + if(!reader.get_istr()) + throw io::input_error("Error reading contents of generic array tag"); +} + template<> -void tag_array::read_payload(io::stream_reader& reader) +void tag_array::read_payload(io::stream_reader& reader) { int32_t length; reader.read_num(length); if(length < 0) reader.get_istr().setstate(std::ios::failbit); if(!reader.get_istr()) - throw io::input_error("Error reading length of tag_int_array"); + throw io::input_error("Error reading length of tag_long_array"); data.clear(); data.reserve(length); for(int32_t i = 0; i < length; ++i) { - int32_t val; + int64_t val; reader.read_num(val); data.push_back(val); } if(!reader.get_istr()) - throw io::input_error("Error reading contents of tag_int_array"); + throw io::input_error("Error reading contents of tag_long_array"); } //Writing @@ -78,16 +100,29 @@ void tag_array::write_payload(io::stream_writer& writer) const writer.get_ostr().write(reinterpret_cast(data.data()), data.size()); } +template +void tag_array::write_payload(io::stream_writer& writer) const +{ + if(size() > io::stream_writer::max_array_len) + { + writer.get_ostr().setstate(std::ios::failbit); + throw std::length_error("Generic array is too large for NBT"); + } + writer.write_num(static_cast(size())); + for(T i: data) + writer.write_num(i); +} + template<> -void tag_array::write_payload(io::stream_writer& writer) const +void tag_array::write_payload(io::stream_writer& writer) const { if(size() > io::stream_writer::max_array_len) { writer.get_ostr().setstate(std::ios::failbit); - throw std::length_error("Int array is too large for NBT"); + throw std::length_error("Long array is too large for NBT"); } writer.write_num(static_cast(size())); - for(int32_t i: data) + for(int64_t i: data) writer.write_num(i); } diff --git a/src/tag_list.cpp b/src/tag_list.cpp index 67a3d4c15f..1650e602e3 100644 --- a/src/tag_list.cpp +++ b/src/tag_list.cpp @@ -37,6 +37,7 @@ tag_list::tag_list(std::initializer_list il) { init il) { init(il); } tag_list::tag_list(std::initializer_list il) { init(il); } tag_list::tag_list(std::initializer_list il) { init(il); } +tag_list::tag_list(std::initializer_list il) { init(il); } tag_list::tag_list(std::initializer_list init) { diff --git a/src/text/json_formatter.cpp b/src/text/json_formatter.cpp index 9b47210c6a..3001ff0958 100644 --- a/src/text/json_formatter.cpp +++ b/src/text/json_formatter.cpp @@ -151,6 +151,18 @@ namespace //anonymous os << "]"; } + void visit(const tag_long_array& la) override + { + os << "["; + for(unsigned int i = 0; i < la.size(); ++i) + { + os << la[i]; + if(i != la.size()-1) + os << ", "; + } + os << "]"; + } + private: const std::string indent_str = " "; -- cgit 0.0.5-2-1-g0f52