diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/tag.cpp | 4 | ||||
| -rw-r--r-- | src/tag_array.cpp | 49 | ||||
| -rw-r--r-- | src/tag_list.cpp | 1 | ||||
| -rw-r--r-- | src/text/json_formatter.cpp | 12 |
4 files changed, 58 insertions, 8 deletions
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<float>::is_iec559 && std::numeric_limits<doubl bool is_valid_type(int type, bool allow_end) { - return (allow_end ? 0 : 1) <= type && type <= 11; + return (allow_end ? 0 : 1) <= type && type <= 12; } std::unique_ptr<tag> tag::clone() && @@ -56,6 +56,7 @@ std::unique_ptr<tag> tag::create(tag_type type) case tag_type::List: return make_unique<tag_list>(); case tag_type::Compound: return make_unique<tag_compound>(); case tag_type::Int_Array: return make_unique<tag_int_array>(); + case tag_type::Long_Array: return make_unique<tag_long_array>(); 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<int8_t>::read_payload(io::stream_reader& reader) throw io::input_error("Error reading contents of tag_byte_array"); } +template<typename T> +void tag_array<T>::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<int32_t>::read_payload(io::stream_reader& reader) +void tag_array<int64_t>::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<int8_t>::write_payload(io::stream_writer& writer) const writer.get_ostr().write(reinterpret_cast<const char*>(data.data()), data.size()); } +template<typename T> +void tag_array<T>::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<int32_t>(size())); + for(T i: data) + writer.write_num(i); +} + template<> -void tag_array<int32_t>::write_payload(io::stream_writer& writer) const +void tag_array<int64_t>::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<int32_t>(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<tag_byte_array> il) { init<tag_byte_arr tag_list::tag_list(std::initializer_list<tag_list> il) { init<tag_list>(il); } tag_list::tag_list(std::initializer_list<tag_compound> il) { init<tag_compound>(il); } tag_list::tag_list(std::initializer_list<tag_int_array> il) { init<tag_int_array>(il); } +tag_list::tag_list(std::initializer_list<tag_long_array> il) { init<tag_long_array>(il); } tag_list::tag_list(std::initializer_list<value> 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 = " "; |
